发布 - 订阅和消息总线Python

时间:2015-08-06 12:43:12

标签: python publish-subscribe message-bus

我正在尝试为我的一些python模块创建一个中央日志记录系统。 我希望能够使用日志从多个模块发送消息,然后中央记录器接收它们并进行处理。

enter image description here

为简单起见,我希望我的模块A看起来像这样:

  bus = connect_to_a_bus_that_is_always_there
  while True:
    #Publish a message to message bus, pseudo code
    bus.publish(topic="logs.a", message="example")
    time sleep(1)

和记录器(唯一的订户)

def actOnNewMessage(msg):
  if msg.topic.subtopic == "a":
     doSomethingForA(msg.data)

bus = connect_to_a_bus_that_is_always_there
bus.subscribe("logs", handler=actOnNewMessage)

while True:
  #wait for messages

现在Logger模块就像一个库,所以它不会持续运行,所以也许我可以在Logger和Message Bus之间引入一些东西,这将会不断地收看新消息。

我看过PyPubSub,但似乎没有介绍文档中不同运行的python模块之间的持久通信。如果有人试过这个,如果我可以在不同的模块之间使用它,它对我有用。

另一个问题是我可能最终得到的模块不是用python编写的,所以我真的不想在模块A,B和Logger之间进行直接通信。 最后,我的架构可能看起来像这样: enter image description here

我希望上面的信息不会混淆。

  

tl; dr :在python和a中使用持久性消息总线发布 - 订阅   不断等待新消息的订阅者。任何现成的解决方案?

编辑: 我正在考虑运行一个知道Logger模块的Web套接字服务器,其他模块A,B知道websocket的地址。这个设计有什么缺点吗?

3 个答案:

答案 0 :(得分:1)

Opensplice是一种消息总线,允许持久,缓冲的数据通信。 不要滚动自己的消息总线!它们是复杂的野兽。

为什么不简单地使用syslog? syslog的某些版本也支持从多个节点到中央收集点的日志记录。许多编程语言都支持它,包括python。

强烈建议您使用标准的python日志框架。它允许您使用各种标准记录器选择日志的位置,例如SyslogHandler,SocketHandler和DatagramHandler。

它甚至允许你编写自己的处理程序,如果你必须......

答案 1 :(得分:1)

我遇到过nanomsg。完全符合我的需求,具有MIT许可证,无需运行其他服务器。此外,还有我想使用的任何语言的绑定。

ping

from nanomsg import Socket, PUB

s = Socket(PUB)
s.connect('tcp://localhost:8080')
s.send('topicMessage')

答案 2 :(得分:0)

您可以将redis作为代理并在单独的进程中运行logger.py。

logger.py

import redis

r = redis.Redis()

while True:
    next_log_item = r.blpop(['logs'], 0)
    write_to_db(next_log_item)

a.py

import redis
import time

r = redis.Redis()

while True:
    r.rpush('logs', message)
    time.sleep(1)