在两个python进程之间共享队列的最有效方法是什么?

时间:2015-10-16 11:37:21

标签: python asynchronous multiprocessing syslog

我在python中实现了一个syslog服务器。一般的想法是接受消息并将它们转发到RabbitMQ队列以进行进一步处理。

所以有两个部分:

  • P1 syslog监听器,负责接收消息
  • P2后台,负责解析系统日志消息,检查其格式,完整性,签名,并将它们转发给RabbitMQ

显然,P2负责主要工作并且执行昂贵的操作。

P1 syslog监听器应该:

  • 自主且健壮:我们希望它具有最大可用性,因此我不想依赖外部组件(例如redis)。即使P2处于脱机状态,它也应该能够接收消息,暂停一段时间。
  • 具有最高性能(预期40k消息/秒)
  • 回答syslog客户端(当客户端使用rsyslog RELP协议时,实现ACK)

P1可能会使用Tornado实现。

P2处理器只接收来自P1的消息,处理它们并将它们转发给RabbitMQ,可能使用Tornado与RabbitMQ进行异步通信。

所以我需要P1和P2在两个方向上相互交谈。

实现P1和P2作为本机python线程不适合:因为python GIL,它们中只有一个会同时执行。它违背了绩效目标。

类似地,在相同的单线程python进程中在同一个tornado循环中实现P1和P2会对P1产生性能影响(因为P2中的某些操作可能“有点”很长并且使IOLoop忙碌)。

所以P1和P2可能必须是不同的unix进程。

我不希望P2一直可用,因此简单的IPC不起作用。

在P1和P2之间共享一个Redis队列可以完成工作,但是P1会依赖Redis可用。

我尝试将LMDB用作共享队列,但性能不是很好(LMDB的用例错误:与写入一样多的读取,并且由于P1和P2是不同的unix进程而发生一些锁定)。

实现所有这些目标的最佳途径是什么? (“不要使用python!”除外)

0 个答案:

没有答案