我在ascync模式下运行uwsgi后面有一个python应用程序来支持服务器发送事件(SSE)。应用程序在mysql数据库上执行各种任务。在SSE连接上,我希望能够在对数据库进行更改时发送事件。
理想情况下,我希望在数据库发生变化时收到通知。搜索到我没有找到任何好的解决方案,不包括在触发器中启动外部过程。由于我不想在每次更改时引入很大的开销,我现在的方法只是报告我的应用程序所做的更改,而不是在mysql shell或类似的任何其他更改。
SSE循环看起来像这样:
def application(env, start_response):
start_response("200 OK", [('Content-Type', "text/event-stream")])
while True:
# wait for event somehow. using uwsgi.wait_fd_read()?
# parse event from other uwsgi process
# fetch new or updated data from database
# generate SSE-event
ev = ServerSentEvent()
yield ev.encode()
修改数据库的应用程序的其他部分将是:
def changeDatabase():
db.performQuery("update foo set .... ")
# Send some event to other uwsgi processes that foo table has been updated
我该怎么做?信号? uwsgi信号?共享内存?写入文件?我不知道的任何其他机制?你会推荐什么?
答案 0 :(得分:0)
我个人倾向于使用redis pub / sub来做这类事情。它快速,可靠且易于使用。基本上你的SSE应用程序开始在pub / sub频道上等待,你的django app会发布到它。 uWSGI信号也很容易,但它们不带有某种形式的有效载荷,因此它们可能非常有限。