RabbitMQ队列在Django中的使用

时间:2020-03-31 08:07:45

标签: python django rabbitmq

我正尝试在Django应用程序中添加一些实时功能,因为我在Django项目上使用RabbitMQ和Celery,所以我想做的是:我有一个外部Python脚本从RabbitMQ发送数据到RabbitMQ>应该从Django应用中检索。

我正在发送一些布偶数据,如下所示:

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='Test')

channel.basic_publish(exchange='',
                      routing_key='Test',
                      body='Hello world!')

print(" [x] Sent 'Hello World!'")

connection.close()

我想做的是:发送Hello World!后,我的Django应用程序应该会收到该字符串,以便我可以执行一些操作,例如将其保存在数据库中,将其传递HTML模板或将其打印到我的控制台。

我的实际问题是我仍然不知道该怎么做。我将Celery添加到了我的Django项目中,但是我不知道如何连接到RabbitMQ并接收消息。我需要使用Django Channels吗?是否有一些有关此的教程?我发现了关于将RabbitMQ和Celery与Django结合使用的各种材料,但在此特定问题上一无所获。

1 个答案:

答案 0 :(得分:1)

这不是直接连接到Celery。

您可以这样解决:

  1. 在Django中创建一个管理命令,该命令可处理传入的消息/数据(https://docs.djangoproject.com/en/3.0/howto/custom-management-commands/
  2. 创建一个使用者,它也可以是Django命令,然后在单独的进程中启动,它不是常规Django进程的一部分(尽管它可以是Django代码的一部分)。在此使用者中,您将监听队列,并且每当有数据输入时,就会调用(1.)中的manage命令。

当然,也可以在一个命令中完成1.和2.。我将其分开以更好地说明不同方面。您可能需要执行不同的任务,并重用一个使用者。另外,如果您已经(1.)已经可以像这样重复使用它,并且可以轻松进行测试,而无需消耗用户的开销。

有关RabbitMQ python使用者的更多信息:https://github.com/celery/celery/blob/master/celery/worker/consumer/consumer.py

这里是芹菜的消费者: https://github.com/celery/celery/blob/master/celery/worker/consumer/consumer.py 因为芹菜当然有它自己的消费者。不过,它看起来相当通用,简单的使用者应该不太复杂。

(我只写过NSQ python使用者作为Django的一部分,因此没有与RabbitMQ使用者的直接经验(仅作为Celery的后端)。)


编辑:您应该问自己-首先,我是否希望将实时数据保存并存储在Django应用中?

如果是,那么RabbitMQ + Consumer是一种非常有效的方法。

如果否,那么这仅是针对用户的-您还可以考虑通过API将其直接公开到前端(然后使用ajax调用来获取)。

如果没有,但您希望缓冲数据以避免碰到另一个生成数据的应用程序-那么队列是一个非常好的工具。但是,在这种情况下,您可以更改使用者而不是保存数据,而是将其公开给前端。如果只需要支持新的浏览器,则可以使用Django 3现在支持的websocket。

https://blog.heroku.com/in_deep_with_django_channels_the_future_of_real_time_apps_in_django