C++跨平台:grpc和zmq的方案预研

Posted CodeBowl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++跨平台:grpc和zmq的方案预研相关的知识,希望对你有一定的参考价值。

前言

在进行跨平台开发中,跨进程通讯或者服务器通讯是必不可少的一环,在开发中,我们会选择成熟的第三方库来进行开发。
今天就对跨平台的grpc和zmq进行方案预研
我的需求是:跨进程通讯

gRpc

grpc是什么?

gRPC是Google开源的RPC实现,基于最新的HTTP2.0协议,并支持常见的众多编程语言。gRPC客户端和服务端可以在多种环境中运行和交互,并且可以使用任何gRPC支持的语言来编写,支持跨平台、跨语言调用。

使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。如下图所示就是一个典型的RPC结构图。

protoBuf

protoBuf是Google开源的一套成熟的结构数据序列化机制,gRPC默认使用的数据交换格式就是protoBuf。

  1. 优点:
    (1)序列化后体积比Json和XML都小,适合网络传输。
    (2)支持跨平台多语言。
    (3)消息格式升级和兼容性还不错。
    (4)序列化反序列化速度很快,快于Json的处理速度。
  2. 缺点:
    (1)功能简单,无法用来表示复杂的概念。
    (2)二进制数据格式,需要编码和解码,数据本身不具有可读性,因此只能方序列化之后得到真正可读的数据。

为什么选择grpc

优点:

  1. gRPC可以通过protobuf来定义接口,从而可以有更加严格的接口约束条件。
  2. 另外,通过protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能

常见的使用场景

  • 需要对接口进行严格约束的情况,比如我们提供了一个公共的服务,很多人,甚至公司外部的人也可以访问这个服务,这时对于接口我们希望有更加严格的约束,我们不希望客户端给我们传递任意的数据,尤其是考虑到安全性的因素,我们通常需要对接口进行更加严格的约束。这时gRPC就可以通过protobuf来提供严格的接口约束
  • 对于性能有更高的要求时。有时我们的服务需要传递大量的数据,而又希望不影响我们的性能,这个时候也可以考虑gRPC服务,因为通过protobuf我们可以将数据压缩编码转化为二进制格式,通常传递的数据量要小得多,而且通过http2我们可以实现异步的请求,从而大大提高了通信效率。

进程间通信

grpc为分布式系统而生,可以是系统间通信,也可以是系统内部进程间通信

ZeroMQ

zmq是什么?

  1. ZeroMQ(简称ZMQ)是一个基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。
  2. ZMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。
  3. ZMQ不是单独的服务,而是一个嵌入式库,它封装了网络通信、消息队列、线程调度等功能,向上层提供简洁的API,应用程序通过加载库文件,调用API函数来实现高性能网络通信。

ZMQ和Socket有什么关联呢?

阅读了ZMQ的Guide文档后,我的理解是,ZMQ是个类似于Socket的一系列接口,他跟Socket的区别是:普通的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节,让你的网络编程更为简单。ZMQ用于node与node间的通信,node可以是主机或者是进程。

ZMQ的三种模式

  1. 应答模式
  2. 订阅发布模式
  3. 管道模式

进程间的通信

zmq可以通过socket文件完成进程间的通讯。使用起来比较简单。

总结

这一块,说实话,我暂时也没有一个好的结论,可能更偏向于使用zmq,因为在本地进程间通信,zmq似乎更专用一点。

以上是关于C++跨平台:grpc和zmq的方案预研的主要内容,如果未能解决你的问题,请参考以下文章

C++跨平台:ZeroMQ的简单示例

C++跨平台:ZeroMQ的简单示例

[转] 前后端分离开发模式的 mock 平台预研

在 Java Card 平台上使用 grpc

前后端分离开发模式的 mock 平台预研

花椒服务端 gRPC 开发实践