由于本人从事行业关系,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的更多相关文章

  1. ZeroMQ——一个轻量级的消息通信组件

    ZeroMQ是一个轻量级的消息通信组件,尽管名字中包含了"MQ",严格上来讲ZeroMQ并不是"消息队列/消息中间件".ZeroMQ是一个传输层API库, 更关 ...

  2. ZeroMQ——一个轻量级的消息通信组件 C#

    ZeroMQ——一个轻量级的消息通信组件 ZeroMQ是一个轻量级的消息通信组件,尽管名字中包含了"MQ",严格上来讲ZeroMQ并不是"消息队列/消息中间件" ...

  3. MediatR-进程内的消息通信框架

    MediatR是一款进程内的消息订阅.发布框架,提供了Send方法用于发布到单个处理程序.Publish方法发布到多个处理程序,使用起来非常方便.目前支持 .NET Framework4.5..NET ...

  4. 分享一个linux环境下快速读取行数的命令

    最初是因为我需要计算一天的日志行数,如果用传统意义上的cat  a.log |wc -l的话因为是单线程,所以需要计算半小时的样子,后来同组的小伙伴教了我一个方法可以有效提高计算速度,将计算时间减半. ...

  5. 分享一个基于thrift的java-rpc框架

    简单介绍 这是一个简单小巧的Java RPC框架,适用于Java平台内.为系统之间的交互提供了.高性能.低延迟的方案.适合在集群数量偏少的情况下使用(50台以下集群环境).当然.它也可以在大型集群环境 ...

  6. 分享一个 Linux 环境下,强力的Python 小工具

    场景 Linux 用户,经常需要在终端查看一些数据,从文件里看 或者网络协议获取数据并查看. 比如,查看文件里的json数据:比如,查看etcd里存下的数据. 如果直接看cat 或者 curl 得到的 ...

  7. 分享一个linux和linux的文件传输【scp无密码传输】

    很多时候,本地测试服务器想把文件传到线上服务器的时候,很多人都是通过登陆线上服务器ssh 传输,这样挺危险的,很多弊端....所以我找了下方法,发现scp挺好用的! 模拟环境: 192.168.147 ...

  8. 分享一个基于Bootstrap的 ACE框架 入门(MVC+EF)

    基于Bootstrap3,拥有强大的功能组件以及UI组件,基本能满足后台管理系统的需求, 而且能根据不同设备适配显示,而且还有四个主题可以切换. 简单入门,源代码下载:https://github.c ...

  9. 分享一个linux中测试网站是否正常的shell脚本

    #! /bin/bash #Author=Harry CheckUrl() { #<==定义函数,名字为CheckUrl timeout=5 #<==定义wget访问的超时时间,超时就退出 ...

随机推荐

  1. Android 中发送邮件

    第一步.导入第三方jar包 Android实现发送邮件,首先需要依赖additional.jar.mail.jar和activation.jar这3个jar包. Google提供了下载地址:https ...

  2. bat 获取管理员权限,判断系统位数,获取当前文件所在目录,regsvr32注册DLL、OCX

    1.获取管理员权限 @echo off if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%Syste ...

  3. MySQL5.7 安装和配置环境变量

    安装 1.下载安装包 官网地址:https://dev.mysql.com/downloads/mysql/ 2.选择 Custom,自定义 3.根据自己系统选择 x64还是x86,然后点击第一个箭头 ...

  4. centos自动同步服务器时间

    原文:https://my.oschina.net/yysue/blog/1628733 1.安装ntpdate yum install ntpdate -y 2.测试是否正常 ntpdate cn. ...

  5. 程序员学习photoshop

    对于一个程序员来说,掌握photoshop的一些基本操作是必要的. photoshop很简单,很多策划都会的. 为什么策划要会photoshop? 答案: 1:photoshop很简单 2:多掌握一门 ...

  6. VS操作中遇到的问题及解决

    1.无法解析的外部符号 _main,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用 2. /ZI ...

  7. js检测手机类型(android,ios,blackberry,windows等)

    var isMobile = { Android: function() { return navigator.userAgent.match(/Android/i); }, BlackBerry: ...

  8. NOIP 2006 明明的随机数

    洛谷 P1059 明明的随机数 洛谷传送门 JDOJ 1423: [NOIP2006]明明的随机数 T1 JDOJ传送门 Description 明明想在学校中请一些同学一起做一项问卷调查,为了实验的 ...

  9. WebStorm取消默认style样式折叠

    WebStorm取消默认style样式折叠: File--->Settings打开一个窗口 Edit--->CodeFolding 把HTML style attribute的前面的钩去掉 ...

  10. 【pytorch】torch.utils.data.DataLoader

    简介 DataLoader是PyTorch中的一种数据类型.用于训练/验证/测试时的数据按批读取. torch.utils.data.DataLoader(dataset, batch_size=1, ...