发布-订阅和消息总线Python

发布-订阅和消息总线Python,python,publish-subscribe,message-bus,Python,Publish Subscribe,Message Bus,我正在尝试为我的一些python模块创建一个中央日志系统。 我希望能够通过日志发送来自多个模块的消息,然后中央记录器接收这些消息并进行处理 为了简单起见,我希望我的模块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="exam

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

为了简单起见,我希望我的模块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)
和记录器(唯一的订户)

现在Logger模块就像一个库,所以它不会持续运行,所以也许我可以在Logger和消息总线之间引入一些东西,它会不断地监视新消息

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

另一个问题是,我可能最终得到的模块不是用python编写的,因此我并不真正希望模块a、B和Logger之间进行直接通信。 最终,我的体系结构可能是这样的:

我希望上面的信息不会令人困惑

tl;dr:使用python中的持久消息总线和 不断等待新消息的订户。有现成的解决方案吗

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

您可以作为代理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、 派克


Opensplice是一种允许发送缓冲数据通信的消息总线不要滚动您自己的消息总线 为什么不直接使用syslog呢?syslog的一些版本也支持从多个节点到中心收集点的日志记录。许多编程语言都支持它,包括python

我强烈建议您使用标准python日志框架。它允许您使用各种标准记录器(如SyslogHandler、SocketHandler和DatagramHandler)选择日志的去向

它甚至允许您编写自己的处理程序,如果必须的话…

我遇到过。完全符合我的需要,有MIT许可证,没有额外的服务器运行。此外,还有我想使用的任何语言的绑定

from nanomsg import Socket, PUB

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

我不完全明白-A和B是分开的过程吗?我假设记录器是一个单独的进程?在传输机制方面-你会使用任何类型的第三方产品(如Redis)?抱歉,刚才看到你说记录器是一个库-因此,不是一个单独的进程。@AidanKane是的,a和B是单独的进程,做不同的工作,不幸的是我不能使用任何第三方产品OK。我发布了一个redis one作为答案,但我想这是不可能的。你有更多关于你需要的特征的信息吗。有很多日志记录吗?你能将日志文件写入磁盘并跟踪这些文件吗?我认为web套接字方法会很好-如果不允许我使用redis(尽管我不是这方面的专家),我可能会在这方面下一步研究。谢谢你的建议,如果有一个类似Reddis的服务器,我可以在python模块中简单地启动它,那么这个解决方案将是理想的,这基本上就是我要寻找的,但只是稍微不是正确的格式。对于网络插座,我可以使用瓶子,像这样的东西会非常好。很好的建议。唯一的问题是:没有安全。任何进程都可以打开连接并发送或接收数据。我刚检查过。
import redis
import time

r = redis.Redis()

while True:
    r.rpush('logs', message)
    time.sleep(1)
from nanomsg import Socket, PUB

s = Socket(PUB)
s.connect('tcp://localhost:8080')
s.send('topicMessage')
from nanomsg import Socket, SUB

s = Socket(SUB)
s.connect('tcp://localhost:8080')
s.set_string_option(SUB, SUB_SUBSCRIBE, "topic")
while True:
    print(s.recv())