#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.