Django微服务中如何合并RabbitMQ监听与服务启动无需单独运行消费文件
Django启动同时运行RabbitMQ消费者的实现方案
下面给出三种不同场景下的实现方式,你可以根据自己的使用场景选择:
本地开发最简方案:Django信号+子线程启动
这个方案不需要额外工具,修改项目代码后直接启动Django服务即可自动拉起消费者,适合开发阶段用:
- 步骤1:在你对应APP的
apps.py中添加消费者逻辑和启动代码,示例如下:
from django.apps import AppConfig import threading import pika import os def run_rabbitmq_consumer(): # 这里直接复制你原有receive.py中的全部消费逻辑即可 connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel() channel.queue_declare(queue='your_queue_name') def message_callback(ch, method, properties, body): # 你的消息处理业务逻辑 print(f"接收消息: {body.decode()}") channel.basic_consume(queue='your_queue_name', on_message_callback=message_callback, auto_ack=True) channel.start_consuming() class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app' # 替换为你自己的APP名称 def ready(self): # 规避runserver自动重载机制导致消费者重复启动的问题 if os.environ.get('RUN_MAIN') == 'true': # 把子线程设置为守护线程,Django关闭时消费者也会跟着关闭 consumer_thread = threading.Thread(target=run_rabbitmq_consumer, daemon=True) consumer_thread.start()
- 步骤2:确认你的
settings.py里的INSTALLED_APPS中注册的APP是指向上面的YourAppConfig,之后直接执行python manage.py runserver就会同时启动Django服务和RabbitMQ消费者。
注意:该方案只推荐本地开发用,生产环境不要把消费者和主服务放在同一个进程里,避免消费逻辑异常影响主接口服务可用性。
生产环境推荐方案:自定义Django管理命令+进程管理
这个方案解耦主服务和消费者,方便单独扩缩容和故障排查:
- 步骤1:在对应APP下新建
management/commands目录,目录下必须新建空的__init__.py文件,再新建start_consumer.py文件,内容如下:
from django.core.management.base import BaseCommand import pika class Command(BaseCommand): help = "启动RabbitMQ消息消费者" def handle(self, *args, **options): # 复制你原有receive.py的消费逻辑到这里 connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel() channel.queue_declare(queue='your_queue_name') def message_callback(ch, method, properties, body): # 你的业务处理逻辑 print(f"接收消息: {body.decode()}") channel.basic_consume(queue='your_queue_name', on_message_callback=message_callback, auto_ack=True) self.stdout.write("RabbitMQ消费者已启动,等待接收消息...") channel.start_consuming()
- 步骤2:用进程管理工具统一启动两个服务,不用手动开两个终端:
- 本地可以用
honcho工具,在项目根目录新建Procfile,内容如下:
安装honcho后执行web: python manage.py runserver consumer: python manage.py start_consumerhoncho start就会同时启动两个服务。 - 生产环境可以用supervisor、systemd或者Docker Compose,分别配置Django主服务和消费者两个进程,启动管理工具即可同时拉起两个服务。
- 本地可以用
小流量场景也可以直接在终端用
python manage.py runserver & python manage.py start_consumer实现后台同时启动。
内容的提问来源于stack exchange,提问作者Rp9
相关产品推荐
相关产品推荐

