Использование очередей RabbitMQ с Django - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь добавить некоторые функции реального времени в мои Django приложения, для этого я использую RabbitMQ и Celery в своем проекте django, так что я хотел бы сделать следующее: у меня есть внешний 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 каналами? Есть ли учебник по этому вопросу? Я нашел различные материалы об использовании RabbitMQ и Celery с Django, но ничего по этому конкретному вопросу.

1 Ответ

1 голос
/ 31 марта 2020

Это не связано напрямую с Celery.

Вы можете решить это следующим образом:

  1. создать команду управления в Django, которая делает все, что нужно сделать с помощью входящее сообщение / данные (https://docs.djangoproject.com/en/3.0/howto/custom-management-commands/)
  2. создать получателя, который также может быть командой Django, которая затем запускается в отдельном процессе, который не является частью обычного Django процесс (хотя он может быть частью вашего Django кода). В этом приемнике вы слушаете очередь, и всякий раз, когда поступают данные, вызывается команда управления из (1.).

Конечно, 1. и 2. также можно выполнить за один раз. команда. Я разделил это, чтобы лучше проиллюстрировать различные аспекты. И у вас могут быть разные задачи и вы можете повторно использовать одного потребителя. Кроме того, если у вас уже есть (1.), вы можете повторно использовать его следующим образом, и вы можете легко протестировать его без лишних затрат потребителя.

Подробнее о RabbitMQ python потребителей: https://github.com/celery/celery/blob/master/celery/worker/consumer/consumer.py

Вот потребитель Celery: https://github.com/celery/celery/blob/master/celery/worker/consumer/consumer.py, потому что у Celery, конечно, есть собственный потребитель. Это выглядит довольно обобщенно c, хотя простой потребитель должен быть менее сложным.

(я только когда-либо писал потребителей NSQ python как часть Django, поэтому прямого опыта с потребителями RabbitMQ нет (только в качестве бэкэнда для Celery).)


РЕДАКТИРОВАТЬ: Вы должны спросить себя: я хочу, чтобы данные в реальном времени сохранялись и сохранялись в моем приложении Django, в первую очередь?

Если да - тогда RabbitMQ + Consumer - очень правильный подход.

Если нет, если это только для пользователя - вы могли бы также подумать о том, чтобы напрямую выставить его через API своему веб-интерфейсу (и там использовать ajax вызывает для извлечения).

Если нет, но вы хотите буферизовать данные, чтобы избежать попадания в другое приложение, которое генерирует данные - тогда очередь - очень хороший инструмент. Однако в этом случае вы можете изменить потребителя не для сохранения данных, а для предоставления их вашему веб-интерфейсу. Если вам требуется только поддержка новых браузеров, вы можете использовать веб-сокеты, которые теперь поддерживаются с Django 3:

https://blog.heroku.com/in_deep_with_django_channels_the_future_of_real_time_apps_in_django

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...