Топология и Click CLI
Топология и Click CLI
Топология описывается обычными идемпотентными функциями:
def setup_orders(channel) -> None:
channel.exchange_declare(exchange='orders', exchange_type='direct', durable=True)
channel.queue_declare(queue='orders.created', durable=True)
channel.queue_bind(
exchange='orders',
queue='orders.created',
routing_key='orders.created',
)После init_app зарегистрируйте callback и consumer:
with app.app_context():
get_setup_registry().register(setup_orders)
get_consumers_registry().register(order_consumer)Повторная регистрация того же объекта игнорируется — это защищает от особенностей development reloader.
# Проверка config и registrations без подключения к RabbitMQ
flask --app service:create_app rmq check
# Объявить topology на всех alias
flask --app service:create_app rmq setup
# Запустить consumer thread для каждого зарегистрированного consumer
flask --app service:create_app rmq consume
# Ограничить конкретным брокером
flask --app service:create_app rmq setup --using analytics
flask --app service:create_app rmq consume --using analyticsЭто Click-команды стандартного Flask CLI: Flask сначала находит factory, загружает config и extensions, затем вызывает команду.
В production выполняйте setup как release/init job, а consume — как отдельный long-running workload. Не стартуйте consumers внутри Gunicorn worker: fork/reload создаёт неконтролируемые дубликаты потоков.