zeromq - grpc 和 Zeromq 比较

标签 zeromq messaging grpc

我想以某种方式比较 grpc 与 Zeromq 及其模式的功能:并且我想创建一些比较(功能集) - 不知何故 - 0mq 是“更好”的套接字 - 但无论如何 - 如果我应用 0mq模式 - 我认为我得到了类似的“框架” - 这里 0mq 似乎更加灵活......

主要要求是:

  • 节点之间的异步请求/资源通信(进程内或远程)
  • 灵活的消息路由
  • 负载均衡支持
  • 有据可查

有什么想法吗?

谢谢!

最佳答案

  • 节点之间的异步请求/资源通信(进程内或远程)

两个库都允许同步或异步通信,具体取决于如何实现通信。有关 gRPC,请参阅此页面:http://www.grpc.io/docs/guides/concepts.html 。基本上,gRPC 允许典型的 HTTP 同步请求/响应或“类似 websocket”的双向流。对于 0mq,您可以设置一个简单的 REQ-REP 连接,它基本上是一个同步通信路径,或者您可以创建异步 ROUTER-DEALER 类型拓扑。

  • 灵活的消息路由

“路由”本质上意味着消息通过某个代理从 A 到达 B。这是在 0mq 中轻松完成的,并且有许多拓扑支持类似的东西( http://zguide.zeromq.org/page:all#Basic-Reliable-Queuing-Simple-Pirate-Pattern )。在 gRPC 中,可以通过流上的类似“发布-订阅”连接来创建相同类型的拓扑。 gRPC 支持将元数据放入消息中 ( https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md ),这将允许您将消息“路由”到“发布-订阅”连接可以从中提取的队列中。

  • 负载均衡支持

gRPC 具有运行状况检查支持 ( https://github.com/grpc/grpc/blob/master/doc/health-checking.md ),但由于它是 HTTP/2,因此您必须有 HTTP/2 负载均衡器来支持运行状况检查。不过,这并不是什么大问题,因为您可以将运行状况检查与负载均衡器调用的 HTTP/1.1 服务联系起来。 0mq 是一个 tcp 连接,这意味着负载均衡器可能会检查 tcp 模式下的“套接字连接”以验证连接。这可行,但不太好。同样,您可以使用负载均衡器从中读取数据的 HTTP/1.1 Web 服务器来灵活地前端 0mq 服务。

  • 有据可查

两者都有详细记录。 0mq的文档必须阅读才能彻底理解该技术,并且更多的是更高的提升。

以下是最大的差异:

  1. 0mq 是一种 TCP 协议(protocol),而 gRPC 是带有二进制负载的 HTTP。
  2. 0mq 要求您设计一个帧协议(protocol)(帧 1 = 版本,帧 2 = 负载等),而大部分工作都是在 gRPC 中为您完成的
  3. gRPC 透明地转换为 REST ( https://github.com/grpc-ecosystem/grpc-gateway ),而如果您想与 0mq 进行 REST 对话,则需要中间件应用程序。
  4. gRPC 使用标准 tls x509 证书(想想网站),而 0mq 使用自定义加密/身份验证协议(protocol) ( http://curvezmq.org/ )。在 4.x 之前,0mq 中没有加密支持,如果你真的想要它,你必须陷入这个废话:https://wiki.openssl.org/index.php/BIO 。 (相信我,不要这样做)
  5. 0mq 可以创建一些非常糟糕的拓扑 ( https://github.com/zeromq/majordomo ) ( https://rfc.zeromq.org/spec:7/MDP/ ),而 gRPC 基本上是客户端/服务器
  6. 0mq 需要更多时间来构建和运行,而 gRPC 基本上是编译 protobuf 消息并将服务导入到您的代码中。

关于zeromq - grpc 和 Zeromq 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39350681/

相关文章:

c - 如何使用 CMake 将我的库与 czmq 链接

java - 如何使用具有多种消息类型的干扰器

c++ - 如何正确选择 zmq 最大缓冲区大小?

python - 无法让 ZeroMQ python 绑定(bind)通过 IPC 接收消息

messaging - NServiceBus 是否适合跨平台集成?

c++ - 如何更改正在运行的程序中的变量?

python - celery 任务中的grpc超时

node.js - Firebase Firestore 不适用于 Angular 10 和 SSR 或预渲染

grpc - gRPC 是否重新发送消息

ZeroMQ高水位标记不起作用