远程,IPC和线程方案中的微服务低延迟通信

时间:2019-01-08 12:18:13

标签: c++ performance ipc microservices low-latency

我想创建一个超快速的消息处理C ++解决方案,该解决方案将受CPU限制并基于微服务。它会处理许多足够小的请求/响应消息(每条消息32字节到1kb)。

某些服务将放置在不同的主机中。有些将位于同一主机上,但进程不同。还有一些在同一进程中,但是在不同的线程中。

当前,我正在考虑用于此类服务拓扑的通信协议。我的第一个想法是使用基于TCP的通信,该通信允许将环回用于同一主机上的IPC通信,甚至用于线程通信。好处是只有一个通信代码,可以测试服务拓扑。在某些进程中托管服务或将其移至远程主机将很容易。

但是我了解到,如果我想要一个具有最大RPS和消息传递速度的低延迟解决方案,我必须根据通信类型来拆分传输:

  • 线程通信-使用循环缓冲区或LMAX Disruptor pattern可获得最佳结果。

  • IPC通信-我认为共享内存中的管道或循环缓冲区是很好的解决方案。有没有更好的IPC方法?

  • 远程通信-异步TCP服务器/客户端用于顺序消息传递,而UDP用于多播。

我也在考虑Linux解决方案,但是拥有跨平台将是很棒的!

我相信Asio C++ Library是远程通信的一个很好的起点。

我的问题如下:

  1. 创建自定义IPC /线程通信解决方案值得吗?还是应该从基于TCP的本地主机通信开始?
  2. 有人可以为我提供一些不同IPC技术(locahost tcp,管道,共享内存)的性能比较结果,以获得最佳的小消息RPS(最大1kb)吗? (例如,共享内存将比localhost TCP快10倍,比管道或要比较的近似RPS值快3倍。)
  3. 也许我错过了一些我应该研究的良好的低延迟IPC / RPC技术或库?
  4. 或者对于我可以使用或购买许可证的问题,可能存在一些生产就绪的解决方案?

提前感谢您的回答和建议!


IPC基准

我刚刚在Linux(Linux ubuntu 4.4.0 x86_64 i7-6700K 4.00GHz)下发现并执行了低级IPC benchmarks。邮件大小为128字节,邮件数为1000000。我得到以下结果:

管道基准:

Message size:       128
Message count:      1000000
Total duration:     27367.454 ms
Average duration:   27.319 us
Minimum duration:   5.888 us
Maximum duration:   15763.712 us
Standard deviation: 26.664 us
Message rate:       36539 msg/s

FIFO(命名管道)基准:

Message size:       128
Message count:      1000000
Total duration:     38100.093 ms
Average duration:   38.025 us
Minimum duration:   6.656 us
Maximum duration:   27415.040 us
Standard deviation: 91.614 us
Message rate:       26246 msg/s

消息队列基准:

Message size:       128
Message count:      1000000
Total duration:     14723.159 ms
Average duration:   14.675 us
Minimum duration:   3.840 us
Maximum duration:   17437.184 us
Standard deviation: 53.615 us
Message rate:       67920 msg/s

共享内存基准测试:

Message size:       128
Message count:      1000000
Total duration:     261.650 ms
Average duration:   0.238 us
Minimum duration:   0.000 us
Maximum duration:   10092.032 us
Standard deviation: 22.095 us
Message rate:       3821893 msg/s

TCP套接字基准:

Message size:       128
Message count:      1000000
Total duration:     44477.257 ms
Average duration:   44.391 us
Minimum duration:   11.520 us
Maximum duration:   15863.296 us
Standard deviation: 44.905 us
Message rate:       22483 msg/s

Unix域套接字基准测试:

Message size:       128
Message count:      1000000
Total duration:     24579.846 ms
Average duration:   24.531 us
Minimum duration:   2.560 us
Maximum duration:   15932.928 us
Standard deviation: 37.854 us
Message rate:       40683 msg/s

ZeroMQ基准:

Message size:       128
Message count:      1000000
Total duration:     64872.327 ms
Average duration:   64.808 us
Minimum duration:   23.552 us
Maximum duration:   16443.392 us
Standard deviation: 133.483 us
Message rate:       15414 msg/s

2 个答案:

答案 0 :(得分:1)

  

也许我错过了一些我应该研究的良好的低延迟IPC / RPC技术或库?

Continental发布了一个IPC库,该库专注于单个主机(使用共享内存)或不同主机之间(使用udp组播)的低延迟和高带宽数据传输。它在Windows和Linux OS上运行。在这里https://github.com/continental/ecal

答案 1 :(得分:0)

您写道:

  

超快速消息处理C ++解决方案

这通常意味着需要掌握一切。最终,听起来好像是一个有趣的库。

总体来说,您的问题太过广泛了-尽管如此,这是我的想法:

  1. 很难在这里给出任何建议...

  2. 比较将针对特定平台/系统。例如。 TCP可能更快或更慢,具体取决于系统。

  3. 想到
  4. OpenMPboost interprocess

  5. 您可能不希望研究或开始使用apache thrift库(尽管它也是跨语言的-我相信它最初是为Facebook后端服务器开发的),您可能会做一些早期实验并考虑一些需要考虑的问题。