Scala Akka和Protocol Buffers

时间:2014-07-02 06:48:49

标签: scala akka protocol-buffers

我正在玩Akka的远程和序列化设施,想要了解一些事情要开始。我在这里阅读了有关序列化的文档:

http://doc.akka.io/docs/akka/2.3.4/scala/serialization.html

根据文档,似乎只需在我的application.conf中提供这些内容即可:

akka.actor {

 serializers {
   java = "akka.serialization.JavaSerializer"
   proto = "akka.remote.serialization.ProtobufSerializer"
}

 serialization-bindings {
    "com.mycompany.messages.MyMessage" = proto
 }
}

让我们假设我在该软件包下有一个案例类,例如:

package com.mycompany.messages;
case class MyMessage(name: String, year: Int)

然后在我的演员中,我可以简单地做这样的事情:

class ClientActor extends Actor {

     def receive = {
        case x: MyMessage => ...
     }
}

这种配置是否足够,还是我需要做更多的事情? 我已经查看了文档中提到的外部序列化程序: https://github.com/romix/akka-protostuff-serialization

这看起来很有希望,但我正在寻找Akka开箱即用的标准。

我也正在考虑测试消息版本的兼容性。让演员A 演员B MessageX

进行对话

MessageX 最初可能包含以下字段:

a: String, b: String, c: String

现在让我们说演员B升级其消息X 的版本,我们称之为消息X + 1

消息X +1 现在包含另一个字段,如下所示:

a: String, b: String, c: String, d: String

但是演员A 仍在发送旧版本的消息,只是消息X ... 演员B 仍然知道如何反序列化旧消息?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

Protobuf序列化程序只能序列化Protobuf消息。因此,对于您想要的工作,您需要将MyMessage作为protobuf消息。

答案 1 :(得分:3)

关于版权问题的其他信息;

Protobuf可以序列化/反序列化相同消息类型的不同版本。你必须维持已经存在的领域'索引并相应地在proto文件描述符中添加其他新的。