当前位置: 首页 > 知识库问答 >
问题:

使用协议缓冲区在ZeroMQ中实现RPC

郑鸿朗
2023-03-14

我有一个简单的客户端和服务器设置。客户端希望在服务器中使用ZeroMQ执行通信方法。我将使用REQ和REP套接字,因为它们适合这个用例。然而,我对protobuf的定义有疑问。我认为这两个选项可用于实现目标:

message ControlService{
    string control = 1;
    int32 serverId = 2;
    bool block = 3;
    double temperature = 4;
}

其中“control”包含要远程执行的方法的名称。另一种选择可以是:

message InputParameters{
    int32 serverId = 1;
    bool block = 2;
    double temperature = 3;
}
message Empty{

}
service ControlService{
    rpc control (InputParameters) returns (Empty);
}

最好的方法是什么?或者至少使用一种方法而不是另一种方法的权衡是什么?

共有1个答案

姬昀
2023-03-14

不要那样做。留言:

message InputParameters{
    req oneof
    {
        InputParametersA a = 1;
        InputParametersB b = 2;
    }
}
message InputParametersA
{
    bool block = 1;
    float temperature = 2;
}
message InputParametersB
{
    <more fields>
}

这样,您只发送InputParameters消息。调用的方法取决于InputParameters.req是否包含InputParametersA(意味着应该调用方法A)或InputParmetersB(对于方法B)。

这避免了解析字符串以确定方法名称(极易出错),而是为您提供了一个要打开的枚举(req字段的可能内容)。根据使用的GPB实现(C等),如果switch语句没有充分覆盖该枚举的所有值,甚至可能会收到编译时警告。

这也意味着在确定哪些字段应该传递给方法时没有问题;您正在将InputParameters.req.a传递给方法A或. b传递给方法B。没有必要将它们分解为方法的单独参数,只需将整个内容作为单个参数传递。

您可以以相同的方式定义不同的返回类型,将它们全部通过单个one of传回。

替代品

现在,如果您正在使用ASN。1(概念上与GPB相同),您可以对消息字段的值和/或大小设置约束(请参见此处,本PDF第13章)。这样,您就可以自动执行参数验证,仅在ASN.1模式中定义。GPB中缺少值/大小约束是一个明显的遗漏。

请看这里(概述)、这里(看起来不错的C/C免费模式编译器)和这里(PDF,参考手册)。

ASN.1的线格式具有更强的类型(如果您使用BER编码)。可以询问线比特流以找出它包含的消息类型。因此,没有必要像使用GPB一样将所有可能的消息包装成单个one of

 类似资料:
  • 他们说,根据谷歌协议缓冲区文档中“定义服务”下的内容, 也可以将协议缓冲区与您自己的RPC实现一起使用。 据我了解,协议缓冲区并没有原生实现RPC。相反,它们提供了一系列必须由用户实现的抽象接口(就是我!)。所以我想利用ZeroMQ实现这些抽象接口进行网络通信。 我正在尝试使用ZeroMQ创建一个RPC实现,因为我正在进行的项目已经实现了基本消息传递的ZeroMQ(因此为什么我不使用gRPC,正如

  • 据我所知,协议缓冲区主要用于控制服务器和客户端代码的项目。我的一般问题是——协议缓冲区能否用于将二进制消息序列化/反序列化到使用现有协议的服务器?所以,我的问题: > 如果协议缓冲区不支持本机微调现有协议的序列化/反序列化方式,那么可以通过扩展添加该功能吗?是否可以以某种方式添加序列化/反序列化方法可以识别的关键字?也许这可以通过扩展或修改protobuf csharp port或protobuf

  • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

  • 我试图在Windows上的Qt中使用google协议缓冲区。因此,我使用MingGW的msys从github编译了protobuf源代码。proto编译器(protoc)似乎工作得很好,但遗憾的是,它无法使用生成的。博士和。pb。从Qt环境中抄送文件。 将此添加到我的。pro文件: 但我仍然得到“未定义的引用…”当我试图编译这个类时,它使用了所有的方法。 代码必须正确,因为它在使用protoc和Q

  • 我试图在Python 3项目中使用Google协议缓冲区。然而,生成的python文件不想与google合作。protobuf库。尝试使用protobuf对象会导致NotImplementedError。 我的设置: Python 3.4.1 使用这些库时出现问题: https://pypi.python.org/pypi/protobuf-py3/2.5.1 python3-原型(https:/

  • 我是协议缓冲区的新手,我想知道是否可以搜索协议缓冲区二进制文件并以结构化格式读取数据。例如,如果我的.proto文件中的一条消息有4个字段,我希望序列化该消息,并将多条消息写入一个文件,然后在该文件中搜索特定的字段。如果我找到该字段,我希望以与写入时相同的结构化格式读回消息。对于协议缓冲区,这是可能的吗?如果可能,任何示例代码或示例都将非常有用。谢谢