Scala Akka и буферы протокола

#scala #akka #protocol-buffers

#scala #akka #буферы протокола

Вопрос:

Я играю с возможностями удаленного управления и сериализации 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
 }
}
  

И давайте предположим, что у меня есть класс case в этом пакете, например:

 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 по-прежнему знать, как десериализовать старое сообщение?

Спасибо за помощь.

Ответ №1:

Сериализатор Protobuf может сериализовать только сообщения Protobuf. Итак, чтобы все работало так, как вы хотите, вам нужно сделать MyMessage сообщением protobuf.

Комментарии:

1. Не могли бы вы предоставить более подробную информацию: how to make MyMessage a protobuf message ? Или какая-нибудь полезная ссылка?

2. Это довольно старое, но я думаю, это должно помочь тому, кто наткнется на это — вы определяете MyMessage в .proto файле и компилируете его с помощью компилятора protobuf, такого как ScalaPB. Это генерирует (среди прочего) класс case, который затем вы можете использовать в своем коде. И поскольку этот класс расширяется от com.google.protobuf.Message , вы можете привязать к нему свой сериализатор akka protobuf в файле conf, и все. Не стесняйтесь упоминать меня в комментариях, если вам нужен подробный ответ. Я буду рад.

Ответ №2:

Просто дополнительная информация о ваших проблемах с управлением версиями;

Protobuf может сериализовать / десериализовать разные версии одних и тех же типов сообщений. Вы должны поддерживать индексы уже существующих полей и соответственно добавлять дополнительные новые в свой файловый дескриптор proto.