Protocol buffers 如何从protobuf构建rpc?

Protocol buffers 如何从protobuf构建rpc?,protocol-buffers,Protocol Buffers,我正在用boost::asio和protobuf编写“raft共识算法”。服务器通过使用两种类型的“RPC”相互通信:AppendEntryRPC和RequestVoteRPC。当服务器A从服务器B接收到长度已知的字符串时,它如何知道该字符串应解码为哪种RPC结构 我知道有一个简单的解决方案,将接收阶段分为两个阶段:第一阶段获取RPC类型名称,第二阶段获取RPC字符串内容,然后对其进行解码。但我只是想避免这样做。有什么解决办法吗 我也知道有一个叫做“grpc”的框架,但我无法在我的Mac上成功运

我正在用boost::asio和protobuf编写“raft共识算法”。服务器通过使用两种类型的“RPC”相互通信:AppendEntryRPC和RequestVoteRPC。当服务器A从服务器B接收到长度已知的字符串时,它如何知道该字符串应解码为哪种RPC结构

我知道有一个简单的解决方案,将接收阶段分为两个阶段:第一阶段获取RPC类型名称,第二阶段获取RPC字符串内容,然后对其进行解码。但我只是想避免这样做。有什么解决办法吗


我也知道有一个叫做“grpc”的框架,但我无法在我的Mac上成功运行它的示例。或者有人能用朴素的语言解释一下“grpc”是如何解决这个问题的吗

不幸的是,没有解决办法。服务器无法识别消息类型,必须事先知道。原因每个消息/RPC可以有不同的protobuff proto文件进行反序列化


最好的方法是构建一个具有已知结构的标题系统,这样您就知道要反序列化什么。

不幸的是,没有解决方案。服务器无法识别消息类型,必须事先知道。原因每个消息/RPC可以有不同的protobuff proto文件进行反序列化


最好的方法是构建一个具有已知结构的标头系统,以便您知道要反序列化的内容。

您可以创建一个额外的消息,该消息可以包含这两种类型的消息,并且始终可以安全地解析:

消息投票{
...
}
消息条目{
...
}
消息VoteOrEntry{
合二为一{
投票=1;
条目=2;
}
}
然后使用
has\u vote()
has\u entry()
来区分您的案例

您仍然只有一条
VoteOrEntry
类型的消息。对于上面添加的新示例项目,此
write.cc
应添加到作业中:

#包括
#包括
#包括
#包括
#包括
#包括“test.pb.h”
使用名称空间std;
使用google::protobuf::util::TimeUtil;
int main(int argc,char*argv[]){
谷歌协议验证版本;
如果(argc!=2){
cerr集合名称(名称);
t1->设置_id(id);
fstream输出(argv[1],ios::out | ios::trunc | ios::binary);
如果(!cap.stream(&output)){
cerrset_名称(名称);
t2->set_id(id);
t2->set_v(v);
fstream输出(argv[1],ios::out | ios::trunc | ios::binary);
如果(!cap.stream(&output)){

cerr您可以创建一条额外的消息,该消息可以包含这两种类型的消息,并且始终可以安全地解析:

消息投票{
...
}
消息条目{
...
}
消息VoteOrEntry{
合二为一{
投票=1;
条目=2;
}
}
然后使用
has\u vote()
has\u entry()
来区分您的案例

您仍然只有一条类型为
VoteOrEntry
的消息。对于上面添加的新示例项目,此
write.cc
应添加到作业中:

#包括
#包括
#包括
#包括
#包括
#包括“test.pb.h”
使用名称空间std;
使用google::protobuf::util::TimeUtil;
int main(int argc,char*argv[]){
谷歌协议验证版本;
如果(argc!=2){
cerr集合名称(名称);
t1->设置_id(id);
fstream输出(argv[1],ios::out | ios::trunc | ios::binary);
如果(!cap.stream(&output)){
cerrset_名称(名称);
t2->set_id(id);
t2->set_v(v);
fstream输出(argv[1],ios::out | ios::trunc | ios::binary);
如果(!cap.stream(&output)){

Cerrthe是可能的,但限制,RPC大多具有不同的结构字段等。将其置于错误或状态处理中是有意义的,因为它应该为所有各方标准化。谢谢,“One of combied”这就是我要找的,虽然我不明白你们之间的对话。@Jan Gerd.Bro,你能给我举个例子吗。因为我不能像官方的“地址簿”示例那样编写示例程序“writer and reader”(尤其是write)。我也不能用谷歌搜索它。“write(37139,0x10a25f5c0)malloc:**对象0x7f8cfe500000的错误:释放的指针未分配写入(37139,0x10a25f5c0)malloc:**在malloc\u error\u break中设置断点以进行调试”它不停地抱怨,投的是集合票或集合票_entry@YNX,请将您的代码发布到某个地方,然后我可以看一看。如果这不再与RPC相关,请为其创建一个新问题。这是可能的,但限制,RPC主要具有不同的结构字段等。将其置于错误或状态处理中是有意义的,因为它应该对各方进行标准化。谢谢,“oneof combied”实际上是我在寻找的,尽管我不理解你们之间的对话。@Jan Gerd.Bro,你能给我举个例子吗。因为我不能像官方的“地址簿”示例那样编写“writer and reader”示例程序(尤其是write)。我也不能用谷歌搜索它。“写入(37139,0x10a25f5c0)malloc:**对象0x7f8cfe500000的错误:正在释放的指针未分配写入(37139,0x10a25f5c0)malloc:**在malloc\u error\u break中设置断点以进行调试“它一直在抱怨一套分配的票或一套分配的票_entry@YNX,请将您的代码发布到某个地方,然后我可以查看。如果这与RPC不再相关,请为其创建一个新问题。