我在python中实现了一个syslog服务器。一般的想法是接受消息并将它们转发到RabbitMQ队列以进行进一步处理。
所以有两个部分:
显然,P2负责主要工作并且执行昂贵的操作。
P1 syslog监听器应该:
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!”除外)