Как подключиться к кластеру 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",
]
}