【问题标题】:Bidirectional messaging with request-response pattern (Protobuf for data serialization)具有请求-响应模式的双向消息传递(用于数据序列化的 Protobuf)
【发布时间】:2014-12-05 09:13:11
【问题描述】:

基本问题如下:

  • 两个节点通过单个套接字进行通信;
  • 请求-回复模式;
  • 两个节点都是客户端和服务器,即节点A向节点B发出请求,节点B向节点A发出请求;

这可以通过两个插座轻松解决,但我只有一个。您可以将问题视为必须在单个套接字上创建多个 虚拟套接字/通道您知道支持此类用例的经过良好测试的消息传递库吗?


另外:

  • 支持 C++ 和 Java;
  • 数据序列化由我使用 Google Protocol Buffers 处理;和
  • 如果可以使用 RPC 实现所有这些,那就太好了,否则我将使用 protobuf 进行管理。

我宁愿不必编写自己的库并使用经过良好测试和良好支持的东西。我研究了 ZeroMQ,但它似乎不支持第三个要求(通过单个套接字同时从 A 到 B 和从 B 到 A 的请求-答复模式)。 RabbitMQ 是另一种可能性,但也可能不支持此要求。 (我没有使用这些库的经验,所以也许我错了......)

(不知道是不是要求太多了。)

【问题讨论】:

  • 我知道这个问题已经有将近一年的历史了,所以我想知道从那时起你是否找到了答案。
  • @GeorgeAntoniadis -- 不,没有解决方案。给我的要求发生了变化,所以我使用了两个插座,每个方向一个。

标签: sockets rabbitmq protocol-buffers zeromq amqp


【解决方案1】:

我没有给你一个完整的答案,但我注意到Cap'n Proto 的 RPC 协议强烈支持你的要求:可以在任一方向发起调用。

这不是你想要的,因为:

  • Cap'n Proto 有自己的序列化格式。使用模型很大程度上受到 Protobufs 的启发,但它不是 protobufs。
  • Java 实现尚不支持 RPC(但已计划)。
  • 如果您关心 Windows:C++ 实现尚不支持 MSVC 上的 RPC,这主要是因为 MSVC 在 C++11 支持方面严重落后。 :/

但它可能值得一试,如果没有别的灵感的话。

(披露:我是 Cap'n Proto 的作者,也是 Google 大部分开源 Protobuf 代码的作者。)

【讨论】:

  • 您是否有专门讨论双向通信的链接?
  • @CMCDragonkai 在 Cap'n Proto 中?这个想法是,您可以进行调用,将新对象引用作为参数传递,该对象引用指向调用者(客户端)实现的对象。然后,被调用者(服务器)可以开始调用该对象,因此您可以进行双向通信。我不认为文档将其专门介绍为“双向通信”,但是有很多关于发送对象引用的信息,因为这是 Cap'n Proto 的核心功能。 capnproto.org/rpc.html
  • 所以你在协议缓冲区上工作!您听说过 Google 的新 gRPC 吗?我读到它有“双向流”。
  • @CMCDragonkai 是的。 gRPC 主要基于我多年来密切合作的 Google 内部 RPC 系统。我实际上实现了 Google 中使用的“双向流”的第一个版本,尽管后来它被重写以更紧密地与低级协议集成。无论如何,恕我直言,Cap'n Proto 的方法要优越得多。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2013-03-04
  • 2016-06-02
相关资源
最近更新 更多