Рубрики
Без рубрики

Введение в очередь сообщений: построить приложение Newsletter, используя Django, Celery и Rabbitmq в 30 мин.

Очески обмена сообщениями широко используются в асинхронных системах. В приложении-интенсивных данных с использованием очереди … Tagged с Django, MessageQueue, Python.

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

Типичная архитектура запроса-ответ не разрезается, где время отклика непредсказуемо, потому что у вас есть много долгосрочных запросов. Если вы уверены, что ваши системные запросы будут экспоненциально или полиномиально идут большими, очередь может быть очень полезной.

Очески обмена сообщениями обеспечивают полезные функции, такие как настойчивость, маршрутизация и управление задачами. Очески сообщений являются типичными «брокерами», которые облегчают сообщение, проходящую через интерфейс, который может получить доступ к другим услугам. Этот интерфейс соединяет производителей, которые создают сообщения и потребителей, которые затем их обработают.

Мы построим приложение Newsletter, где пользователи могут подписаться на различные информационные бюллетени, и они будут регулярно получать проблемы на своих электронных письмах. Но прежде чем мы продолжим, давайте понять работу работников + очередей сообщений.

Рабочие – «Фоновые серверы задач». Хотя ваш веб-сервер отвечает на пользовательские запросы, рабочие серверы могут обработать задачи на заднем плане. Эти работники могут быть использованы для отправки электронных писем, создавая большие изменения в базе данных, обработки файлов и т. Д.

Рабочие назначаются задачи через очередь сообщений. Например, рассмотрим очередь, хранящую много сообщений. Он будет обработан в первом месте, во-первых (FIFO) моды. Когда работник становится доступным, он принимает первую задачу от передней части очереди и начинает обработку. Если у нас есть много рабочих, каждый из них делает задачу в порядке. Очередь гарантирует, что каждый работник получил только одну задачу одновременно и что каждая задача обрабатывается только одним работником.

Мы будем использовать сельдерей, который представляет собой реализацию очереди задач для веб-приложений Python, используемые для асинхронного выполнения работы за пределами цикла ответа HTTP-запроса. Мы также будем использовать rabbitmq, который является наиболее широко развернутым брокером сообщение с открытым исходным кодом. Он поддерживает несколько протоколов обмена сообщениями.

Мы построим приложение Newsletter, в котором пользователь может одновременно подписаться на различные информационные бюллетени и будет регулярно получать вопросы по поводу своих электронных писем.

У нас будет наш приложение Newsletter работает как приложение Django с сельдереем. Всякий раз, когда авторы публикуют новый выпуск, приложение Django опубликует сообщение для электронной почты абонентами, используя сельдерей. Работники сельдерея получат задачу из брокера и начнут отправлять электронные письма.

Требования

  • Python 3+ версия
  • Пиронв

Настройка Django.

Создать папку рассылка Локально и установите Django в виртуальную среду. Внутренняя папка работает:

pipenv shell
pipenv install django

Создать приложение:

Django-admin acteproject newsletter_site.

Настройка моделей:

Python Manage.py мигрировать

Убедитесь, что он работает и посещает http://127.0.0.1:8000/ :

Python Manage.py Runserver 8000

Создайте приложение Newsletter:

python manage.py startapp бюллетень

Установка

  • Установите сельдерей
  • Установите dotenv для чтения настроек из среды.
  • Установите PSYCOPG2-BINARY для подключения с Postgres.
pipenv install celery
pipenv install python-dotenv
pipenv install psycopg2-binary

Настройка Postgres и rabbitmq

Создать Docker-Compose.yaml Запускать Postgres и Rabbitmq на заднем плане.

version: '3'
services:
  db:
    image: postgres:13
    env_file:
      - .env
    ports:
      - 5432:5432
  rabbitmq:
    image: rabbitmq
    ports:
      - 5672:5672

Настройка настроек .py.py.

  • Чтобы включить приложение в нашем проекте, нам нужно добавить ссылку на свой класс конфигурации в настройке установленных_apps в newsletter_site/settings.py Отказ
INSTALLED_APPS = [
    'newsletter.apps.NewsletterConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
  • Нам нужно сказать сельдерею, как найти rabbitmq. Итак, открыть settings.py и добавить эту строку: CELERY_BROKER_URL.GETENV ('CELERY_BROKER_URL')

  • Нам нужно настроить параметры базы данных:

uri = os.getenv('DATABASE_URL')

result = urlparse(uri)

database = result.path[1:]
user = result.username
password = result.password
host = result.hostname
port = result.port

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': database,
        'USER': user,
        'PASSWORD': password,
        'HOST': host,
        'PORT': port,
    }
}
  • Нам нужно настроить SMTP-сервер в настройках .py. SMTP-сервер является почтовым сервером, ответственным, чтобы доставить электронные письма пользователям. Для развития вы можете использовать SMTP-сервер Gmail, но это имеет ограничения и не будет работать, если у вас есть 2 ФА. Вы можете обратиться к этому Статья Отказ Для производства вы можете использовать коммерческие услуги, такие как Sendgrid.
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = os.getenv('EMAIL_HOST')
EMAIL_USE_TLS = bool(os.getenv('EMAIL_USE_TLS'))
EMAIL_PORT = os.getenv('EMAIL_PORT')
EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD')

Для вашей справки вы можете увидеть настройки .py здесь Отказ

Создать .env Файл

  • Создать .env Файл и назначить секреты.
EMAIL_USE_TLS=True
EMAIL_PORT={EMAIL_PORT}
EMAIL_HOST_USER={EMAIL_HOST_USER}
EMAIL_HOST_PASSWORD={EMAIL_HOST_PASSWORD}
CELERY_BROKER_URL="pyamqp://localhost:5672"
SECRET_KEY={SECRET_KEY}
DATABASE_URL=postgres://postgres:password@localhost:5432/postgres
POSTGRES_PASSWORD=password
APP_DOMAIN=*
DEBUG=True

Сельдерей

Нам нужно настроить сельдерей с некоторыми параметрами конфигурации. Создайте новый файл под названием Celery.py внутри Newseletter_site каталог:

import os

from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'newsletter_site.settings')

app = Celery('newsletter_site')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

Проектирование и реализация моделей и настроить администратор

Это схема, которую мы пытаемся построить. Схема реализована здесь Отказ Создать Newsletter/Models.py с тем же содержанием.

Нам нужен интернет-интерфейс для управления рассылкой. Мы будем использовать Django Admin для этой цели. Создать Newsletter/admin.py с содержимым этого файла.

Регистрация URL для Admin в Newsletter_site/URLS.PY. :

urlpatterns = [
    path('admin/', admin.site.urls),
]

Запустите Docker-Compose, чтобы начать зависимости: докер

Генерировать миграции для наших моделей: питон Управление. Макемиграциями

Чтобы применить сгенерированные миграции в базу данных Run: Python Manage.py мигрировать

Чтобы создать пользователь для входа в систему, выполните следующую команду и предоставьте свои данные: Python Manage.py CreatesuperUser

Запустите следующую команду, чтобы запустить приложение и открыть http://127.0.0.1:8000/admin Открыть Django Admin: Python Manage.py. runserver.

Беги сельдерея: Celery-A Newsletter_site Работник Добавьте рассылку и подписчик и подпишитесь к этому. Создайте проблему и отправьте его. Если все в порядке, вы увидите проблему, прибывающую в вашу электронную почту.

Когда мы нажимаем, отправьте следующее действие:

def send(modeladmin, request, queryset):
    for issue in queryset:
        tasks.send_issue.delay(issue.id)

send.short_description = "send"

Этот код отвечает за очередью до новой задачи, чтобы отправить проблему с помощью сельдерея. Опубликует задачу rabbitmq.

@shared_task()
def send_issue(issue_id):
    issue = Issue.objects.get(pk=issue_id)
    for subscription in Subscription.objects.filter(newsletter=issue.newsletter):
        send_email.delay(subscription.subscriber.email, issue.title, issue.content)


@shared_task()
def send_email(email, title, content):
    send_mail(
        title,
        content,
        'newsletters@nancychauhan.in',
        [email],
        fail_silently=False,
    )

Работник сельдерея использует эти задачи. Когда производитель публикует задачу, работник запускает соответствующую задачу. Когда мы публикуем задание Send_issue, мы определяем подписчик для рассылки и публикуют подзаправки для отправки фактической электронной почты. Эта стратегия называется вентиляторами. Вентилятор полезен, так как он позволяет нам повторить отправку электронных писем одному пользователю в случае сбоя.

В этом посте мы увидели, как использовать Rabbitmq в качестве очереди сообщений с сельдереем и Django, чтобы отправить объемные электронные письма. Это хорошая подгонка, где соответствующие очереди сообщений. Используйте очередь сообщений, если запрос нетерминистна или процесс является длительным и ресурсоемким.

Вы можете найти готовый проект здесь :

Первоначально опубликовано здесь

Спасибо за чтение! Поделитесь своими отзывами в окне комментариев.

Оригинал: “https://dev.to/_nancychauhan/introduction-to-message-queue-build-a-newsletter-app-using-django-celery-and-rabbitmq-in-30-min-60p”