Как подключиться к кластеру RabbitMQ с помощью Django?

В документации:

https://github.com/Bogdanp/django_dramatiq/blob/master/django_dramatiq/apps.py

В нем приводится следующий пример:

DEFAULT_BROKER = "dramatiq.brokers.rabbitmq.RabbitmqBroker"
DEFAULT_BROKER_SETTINGS = {
    "BROKER": DEFAULT_BROKER,
    "OPTIONS": {
        "host": "127.0.0.1",
        "port": 5672,
        "heartbeat": 0,
        "connection_attempts": 5,
    },
    "MIDDLEWARE": [
        "dramatiq.middleware.Prometheus",
        "dramatiq.middleware.AgeLimit",
        "dramatiq.middleware.TimeLimit",
        "dramatiq.middleware.Callbacks",
        "dramatiq.middleware.Retries",
        "django_dramatiq.middleware.AdminMiddleware",
        "django_dramatiq.middleware.DbConnectionsMiddleware",
    ]
}

Но не говорится о подключении к кластеру с несколькими узлами в случае обхода отказа.

Я знаю, что в оболочке можно сделать что-то вроде этого:

credentials = pika.PlainCredentials(getenv('RMQ_USER'), getenv('RMQ_PASS'))

        parameters = [
            pika.ConnectionParameters(host=getenv('RMQ_1'), port=getenv('RMQ_PORT_1'), credentials=credentials,
                                      virtual_host=getenv('VIRTUAL_HOST')),
            pika.ConnectionParameters(host=getenv('RMQ_2'), port=getenv('RMQ_PORT_2'), credentials=credentials,
                                      virtual_host=getenv('VIRTUAL_HOST')),
            pika.ConnectionParameters(host=getenv('RMQ_3'), port=getenv('RMQ_PORT_3'), credentials=credentials,
                                      virtual_host=getenv('VIRTUAL_HOST'),
                                      connection_attempts=5, retry_delay=1)
        ]

Но я не знаю, как это сделать из настроек Django.

Таким образом мне удалось передать список узлов

# Construct a semicolon-separated string of connection URLs
RMQ_USER = getenv('RMQ_USER')
RMQ_PASS = getenv('RMQ_PASS')
VIRTUAL_HOST = getenv('VIRTUAL_HOST')
RMQ_PORT_1 = getenv('RMQ_PORT_1')
RMQ_PORT_2 = getenv('RMQ_PORT_2')
RMQ_PORT_3 = getenv('RMQ_PORT_3')
RMQ_NODE_1 = getenv('RMQ_NODE_1')
RMQ_NODE_2 = getenv('RMQ_NODE_2')
RMQ_NODE_3 = getenv('RMQ_NODE_3')

rabbit_nodes = [f"{RMQ_NODE_1}:{RMQ_PORT_1}", f"{RMQ_NODE_2}:{RMQ_PORT_2}", f"{RMQ_NODE_3}:{RMQ_PORT_3}"]

url = ";".join([f"amqp://{RMQ_USER}:{RMQ_PASS}@{node}" for node in rabbit_nodes])

DRAMATIQ_BROKER = {
    "BROKER": "dramatiq.brokers.rabbitmq.RabbitmqBroker",
    "OPTIONS": {
        "url": url,  # Use the semicolon-separated URL string
    },
    "MIDDLEWARE": [
        "dramatiq.middleware.Prometheus",
        "dramatiq.middleware.AgeLimit",
        "dramatiq.middleware.TimeLimit",
        "dramatiq.middleware.Callbacks",
        "dramatiq.middleware.Retries",
        "django_dramatiq.middleware.DbConnectionsMiddleware",
        "django_dramatiq.middleware.AdminMiddleware",
    ]
}
Вернуться на верх