Как отправлять и получать сообщения protobuf через Akka Tcp
Я использую ScalaPB для моего компилятора protobuf, который генерирует классы дел Scala, парсеры и сериализаторы для моих протокольных буферов.
У меня есть простое сообщение protobuf в файле.proto, которое было скомпилировано в класс случая Scala благодаря ScalaPB.
option java_outer_classname = "MovementProtos";
message Move {
required string direction = 1;
required string mode = 2;
}
Этот файл скомпилирован и позволяет мне сделать что-то вроде:
val move = Move(direction = "up", mode = "walk")
У меня есть актер Akka, обрабатывающий соединение TCP.
class PacketHandler extends Actor {
def receive: Receive = {
case m: Move =>
// successfully matched against Move case class message
case Tcp.Received(data) =>
// didn't match any messages
case _: Tcp.ConnectionClosed =>
context.stop(self)
}
}
Если я отправлю Move
Протобуф сообщение к моему PacketHandler
Будет ли это успешно совпадать с моим Move
кейс с тем, как я написал мой receive
?
Как мне отправить Move
Протобуф сообщение? Скажем, когда он успешно совпадает с Move
Протобуф сообщение, оно повторяет его обратно.
def receive: Receive = {
case m: Move =>
// successfully matched against Move case class message
// now echo back 'm' over the wire
sender ! Tcp.Write(???)
...
}
У меня нет клиента, чтобы проверить мой PacketHandler
актер, поэтому я использую Telnet.
Также было бы полезно узнать, что кодируется Move
сообщение выглядит точно так, что я могу создать свое соединение через telnet и отправить закодированное сообщение по проводной сети и проверить, будет ли оно декодировано при достижении PacketHandler
,
1 ответ
Одним из способов является отправка экземпляров в виде сообщений Akka. то есть. sender ! Tcp.Write(m)
, Экземпляры отправляются со всеми двоичными издержками класса Scala. Но этот тип побеждает смысл использования буферов протокола.
Пропускная способность обычно является одним из самых скудных / медленных ресурсов в системе, поэтому обычно вы используете функции сериализации и десериализации protobuf для rpc. Вы сериализуетесь, используя любой из to~
функции (т.е. toByteString
) и десериализовать с помощью parseFrom
,