Как отправлять и получать сообщения 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,

Другие вопросы по тегам