1

我将ScalaPB用于我的 protobuf 编译器,它为我的协议缓冲区生成 Scala 案例类、解析器和序列化程序。

由于 ScalaPB,我在 .proto 文件中有一个简单的 protobuf 消息,该文件已编译为 Scala 案例类。

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)
  }
}

如果我向 my 发送Moveprotobuf 消息PacketHandler,它是否会成功匹配我的Move案例类以及我如何编写 my receive

如何发送Moveprotobuf 消息?假设当它成功匹配Moveprotobuf 消息时,它会回显它。

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

4

1 回答 1

1

一种方法是将实例作为 Akka 消息发送。IE。sender ! Tcp.Write(m). 实例与 Scala 类的所有二进制开销一起发送。但是这种方式违背了使用协议缓冲区的意义。

带宽通常是系统中最稀缺/最慢的资源之一,因此通常您会为 rpc 使用 protobuf 序列化和反序列化功能。您使用任何to~函数(即toByteString)进行序列化并使用 parseFrom.

于 2016-03-29T02:19:56.667 回答