分享一个Linux C++消息通信框架TCPSHM
由于本人从事行业关系,Linux环境下的低延迟通信是我关注的技术之一。要达到极端的低延迟,当然同机器内IPC比网络通信快,而Linux IPC方式中无疑是共享内存延迟最低。不过相对于TCP这种通用的通信方式来说,共享内存缺少了一些控制层的协议,比如进程A和B通过一个基于共享内存的消息队列通信,A很难知道队列另一端的B是否存在,具体的说就是基于共享内存的简单消息队列缺少了连接建立和断开的控制。
另一方面,相对于SHM(共享内存)来说,使用TCP也有些自己的痛点:除了延迟以外,重连恢复是个所有应用场景下都不可避免的问题。我们知道,由于网络问题或进程崩溃,TCP连接断开是很常见的事情,断开前发送方发出的数据可能没有被接收,也可能接收了还没被处理接收方就挂了,所以为了确保不丢失信息,发送方的应用程序需要保存已发送的信息,即使自己并不需要,等收到对方的确认消息才能丢弃。也就是说,一个真正可靠的TCP应用程序需要做很多无关业务的控制层的事情。而这个问题SHM并不存在,只要机器不掉电,程序的崩溃与重启对于SHM是透明的,也就是说崩溃前已写入且未读取的数据还会在那里,程序重启后不需做任何数据重传之类的事情。
于是我想,如果TCP和SHM分别弥补了上述各自的缺点,那么它们使用起来将会及其相似:就像一个带连接属性的持久化消息队列,用户可以像操作一个普通消息队列一样push和pop消息,对于发送方来说已经push的消息不需要自己保存副本,对于接受方来说没有pop的消息不会丢失,同时双方都能知道对方是否还活着。这样一个抽象的消息队列可以基于TCP,以支持远程通信,也可以基于SHM, 以提供超低延迟,这对于用户来说可以完全透明。
TCPSHM就是这样一个解决方案。TCPSHM是一个Linux下的轻量级高性能的C++模板类库开源项目,提供了客户端和服务端的框架,同时高度可配置和可定制。欢迎感兴趣的同学了解一下,并提出宝贵的意见,谢谢~

链接:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g 提取码:x2p5
免费分享,但是X度限制严重,如若链接失效点击链接或搜索加群 群号744933466。
分享一个Linux C++消息通信框架TCPSHM的更多相关文章
- ZeroMQ——一个轻量级的消息通信组件
ZeroMQ是一个轻量级的消息通信组件,尽管名字中包含了"MQ",严格上来讲ZeroMQ并不是"消息队列/消息中间件".ZeroMQ是一个传输层API库, 更关 ...
- ZeroMQ——一个轻量级的消息通信组件 C#
ZeroMQ——一个轻量级的消息通信组件 ZeroMQ是一个轻量级的消息通信组件,尽管名字中包含了"MQ",严格上来讲ZeroMQ并不是"消息队列/消息中间件" ...
- MediatR-进程内的消息通信框架
MediatR是一款进程内的消息订阅.发布框架,提供了Send方法用于发布到单个处理程序.Publish方法发布到多个处理程序,使用起来非常方便.目前支持 .NET Framework4.5..NET ...
- 分享一个linux环境下快速读取行数的命令
最初是因为我需要计算一天的日志行数,如果用传统意义上的cat a.log |wc -l的话因为是单线程,所以需要计算半小时的样子,后来同组的小伙伴教了我一个方法可以有效提高计算速度,将计算时间减半. ...
- 分享一个基于thrift的java-rpc框架
简单介绍 这是一个简单小巧的Java RPC框架,适用于Java平台内.为系统之间的交互提供了.高性能.低延迟的方案.适合在集群数量偏少的情况下使用(50台以下集群环境).当然.它也可以在大型集群环境 ...
- 分享一个 Linux 环境下,强力的Python 小工具
场景 Linux 用户,经常需要在终端查看一些数据,从文件里看 或者网络协议获取数据并查看. 比如,查看文件里的json数据:比如,查看etcd里存下的数据. 如果直接看cat 或者 curl 得到的 ...
- 分享一个linux和linux的文件传输【scp无密码传输】
很多时候,本地测试服务器想把文件传到线上服务器的时候,很多人都是通过登陆线上服务器ssh 传输,这样挺危险的,很多弊端....所以我找了下方法,发现scp挺好用的! 模拟环境: 192.168.147 ...
- 分享一个基于Bootstrap的 ACE框架 入门(MVC+EF)
基于Bootstrap3,拥有强大的功能组件以及UI组件,基本能满足后台管理系统的需求, 而且能根据不同设备适配显示,而且还有四个主题可以切换. 简单入门,源代码下载:https://github.c ...
- 分享一个linux中测试网站是否正常的shell脚本
#! /bin/bash #Author=Harry CheckUrl() { #<==定义函数,名字为CheckUrl timeout=5 #<==定义wget访问的超时时间,超时就退出 ...
随机推荐
- python高级编程——网络编程(一)
计算机网络基础 概念:计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的通信.而网络编程就是开发计算机网络应用程序 计算机的通信协议 概念:计 ...
- js生成一定范围内的随机整数
Math.floor(Math.random()*(m-n+1)+n) Math.floor(Math.random() * (50 - 1 + 1) + 1): 生成1-50内的随机整数
- OKGo vs RxHttpUtils ...
jeasonlzy/okhttp-OkGohttps://github.com/jeasonlzy/okhttp-OkGo Android OkGo基本操作https://www.jianshu.co ...
- Fundebug前端JavaScript插件更新至1.8.2,修复2个小BUG
摘要: 修复2个BUG,请大家及时更新. Fundebug前端异常监控服务 Fundebug是专业的程序异常监控平台,我们JavaScript插件可以提供全方位的异常监控,可以帮助开发者第一时间定位各 ...
- es更新说明(dsl)
一.旧版elasticsearch-dsl 很多同学在python搜索引擎视频中关于看到的第十章elasticsearch使用中使用python创建mapping老师使用的以下代码,这些代码对于ela ...
- django_restframework项目之python虚拟环境配置(一)
虚拟环境的搭建 优点 1.使不同应用开发环境相互独立 2.环境升级不影响其他应用,也不会影响全局的python环境 3.防止出现包管理混乱及包版本冲突 windows 安装 # 建议使用pip3安装到 ...
- Ubuntu16.04下Python2:pip安装opendr库
在Ubuntu16.04/Python2环境安装opendr遇到了问题,并且报错不清楚. 使用dis_to_free的方法很好地解决问题. sudo apt install libosmesa6-de ...
- axios get及post方法代码示例&&方法封装
axios get及post方法代码示例 get方法: show: function(){ //get方式 //赋值给变量self var self = this; var url = "h ...
- flask获取get请求传过来的数组
robots = request.args.getlist("robots[]")
- 树莓派项目(1-2)人脸识别 C++
级联分类器 在这里,我们学习如何使用objdetect在我们的图像或视频中查找对象 https://docs.opencv.org/3.3.0/db/d28/tutorial_cascade_clas ...