通过zmq构建进程间通信

Posted by Sourcelink on April 4, 2019

一. 概述

为解决linux平台下的进程间通信, 目前调研三个方案: DBUS, binder, zmq;

  • DBUS

DBUS支持进程间一对一和多对多的对等通信, 在多对多的通讯时, 需要后台进程的角色去分转消息, 当一个进程发消息给另外一个进程时, 先发消息到后台进程, 再通过后台进程将信息转发到目的进程; DBUS后台进程充当着一个路由器的角色; 该方案使用于桌面级应用间的消息传递, 对硬件要求高, 且难以维护;

  • binder

binder是android底层使用的ipc和rpc的主要通信方式, 其通过binder驱动进行数据交互和远程调用, 相比其他的通信方式消息高且稳定;
当前binder驱动已经合进主线内核中, linux平台下也可以使用, 有一定的开发工作量, 个人感觉嵌入式设备首选;

  • zmq

ZeroMQ号称是”史上最快的消息队列”, 输入传输稳定且有自动重连功能, 消息缓存等功能, 多模式如订阅发布, 请求应答等功能;
缺点是开发工作量较大, 但相较于自己用socket编写一个ipc服务, 其稳定性更重要;

二. 通信模型

以下是使用zmq进行开发的一个端到端的进程通信模式;

2.1 请求-应答

路由模型

如上图是一个路由模型, asr要发送一个请求或消息给eq, 需要通过代理进行转发, 当代理收到了消息后会响应一个ack给发送方, 接着再转发给eq;
每个端点都有一个发送通道和一个接收通道, 这样做在路由模式下才能实现异步调用;

端与端通过req模式连接到代理, 代理端初始化为router模式;

2.2 订阅-发布

利用前面的路由模式, 每次端点的状态有变化, 比如usb的连接和断开等状态有变化, 则通过req将消息发给代理, 代理则通过发布,将数据广播出去; 如果有订阅该消息的则回收到消息;
即每个端点都会通过代理订阅一些消息, 自身状态有变化也会通过代理发布;

三. 数据测试

测试环境: 龙尚的4g模块

  • 10ms

一个代理, 三个端; 每10ms发送一次数据给代理, 代理转发给zmq_asr;

app_tbox 运行情况:

app_tbox 无运行情况:

  • 100ms


欢迎大家纠错讨论: Sourcelink@126.com 我的邮箱