【问题标题】:Scala Akka and Protocol BuffersScala Akka 和协议缓冲区
【发布时间】:2014-07-02 06:48:48
【问题描述】:

我正在使用 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 使用 MessageX

演员 B 交谈

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

a: String, b: String, c: String

现在假设演员 B 升级了它的 Message X 版本,我们称之为 Message X +1

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: scala akka protocol-buffers


    【解决方案1】:

    Protobuf 序列化程序只能序列化 Protobuf 消息。因此,要让事情按您的意愿工作,您需要将 MyMessage 设为 protobuf 消息。

    【讨论】:

    • 您能否提供更多详细信息:how to make MyMessage a protobuf message?或者任何有用的链接?
    • 这已经很老了,但我想这应该对偶然发现这个问题的人有所帮助-您在 .proto 文件中定义 MyMessage 并使用 ScalaPB 之类的 protobuf 编译器对其进行编译。这会生成(除其他外)一个案例类,然后您可以在代码中使用该案例类。由于这个类是从 com.google.protobuf.Message 扩展而来的,你可以在 conf 文件中将你的 akka protobuf 序列化程序绑定到它,就是这样。如果您需要详细的答案,请随时在 cmets 中提及我。我很乐意。
    【解决方案2】:

    只是关于您的版本控制问题的附加信息;

    Protobuf 可以序列化/反序列化相同消息类型的不同版本。您必须在您的 proto 文件描述符中维持已经存在的字段索引并相应地添加额外的新索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2010-11-28
      • 1970-01-01
      • 2021-12-19
      • 2011-11-15
      相关资源
      最近更新 更多