来自Django的龙卷风数据库通知

时间:2014-10-03 09:43:06

标签: django postgresql redis celery tornado

我有Django服务器,用于服务HTTP请求和更新Postgres DB。还有Tornado TCP服务器应该从数据库中推送新数据。

问题是:通知Tornado有关数据库更改的最佳方式。就是这样。

我认为有哪些选择:

  1. 芹菜。我已经阅读了很多文档,似乎这只是一个任务队列,而不是通信。此外,应在不同的流程之间建立这些沟通。
  2. Redis的。这似乎是一个很好的解决方案,也有Tornado的brukva异步客户端。我需要在项目上引入额外的依赖。
  3. 插槽。它似乎是最轻量级的解决方案,除了Tornado TCP服务器之外还提供大量的客户端套接字,所以再添加一个应该不是什么大问题。我不想这么低。
  4. 数据库通知。这是我最初提出的解决方案,但后来不喜欢。 Postgres具有NOTIFYLISTEN机制的本机通知支持,这些机制也是异步的,可以轻松添加到Tornado IOLoop(io_loop.add_handler和连接文件描述符)。这也是低级别,但更重要的是此解决方案违反了数据独立性原则。
  5. 现在我需要提一个微妙的细节,它可以对我所描述的内容产生重大影响:

    DB中99%的更改不是出现在Django进程中,而是出现在由调度程序启动并使用Django ORM的单独脚本(以及独立进程)中。

    现在这个描述或多或少反映了项目的实际状态。 那么Celery真的不适合解决这类问题吗? Redis是最好的解决方案吗?还有其他我不知道的吗?任何想法和建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

在评估了所有这些选项之后,我决定采用Redis + Tornado方法。它显示出相当强大和稳定的效果(那是5年前,仅供参考)。我在这里用一个工作示例来布置整个项目:https://www.databrawl.com/2017/04/27/real-time-python-via-tcp/