gpt4 book ai didi

scala - 克服 Akka Persistence 中对持久消息类的更改

转载 作者:行者123 更新时间:2023-12-05 00:13:21 25 4
gpt4 key购买 nike

假设我从这样的 Akka Persistence 系统开始:

case class MyMessage(x: Int)

class MyProcessor extends Processor {
def receive = {
case Persistent(m @ MyMessage) => m.x
//...
}
}

然后有一天我把它改成这样:

case class MyMessage(x: Int, y: Int)

class MyProcessor extends Processor {
def receive = {
case Persistent(m @ MyMessage) => m.x + m.y
//...
}
}

在我部署新系统后,当 MyProcessor 实例尝试恢复其状态时,记录的消息将属于前一个案例类。因为它需要后一种类型,所以它会抛出一个 OnReplayFailure,使处理器无法使用。问题是:如果我们假设不存在的 y 可以等于 0(或其他),是否有最佳实践来克服这个问题?例如,也许使用 implicit 在恢复时将前一条消息转换为后者?

最佳答案

Akka 默认使用 Java 序列化,并表示对于长期项目,我们应该使用合适的替代方案。这是因为 Java 序列化很难随时间发展。 Akka 建议使用 Google Protocol Buffers、Apache Thrift 或 Apache Avro。

例如,对于 Google Protocol Buffers,在您的情况下您将编写如下内容:

if (p.hasY) p.getY else 0

Akka 在一篇不错的文章中解释了所有这些(诚然,它不是很适合 Google):

http://doc.akka.io/docs/akka/current/scala/persistence-schema-evolution.html

甚至解释了将新字段添加到现有消息类型的特定用例:

http://doc.akka.io/docs/akka/current/scala/persistence-schema-evolution.html#Add_fields

Akka 文档推荐的一篇博客文章,用于比较不同的序列化工具包:

http://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html

关于scala - 克服 Akka Persistence 中对持久消息类的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25380176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com