我以每秒5个任务的速度创建任务。我可以在RabbitMQ中看到消息传入率平均为5.2 / s,我有240个消费者分布在4个虚拟机中(每个VM 60个),每个工作者处理一个持续20秒的任务。 从理论上讲,我应该在没有排队的情况下处理100K任务。
我看到大量未经过批准的消息。如何摆脱Unacked消息或添加一个计时器来杀死它们,这是否意味着我的工作人员会遇到问题?
How can I recover unacknowledged AMQP messages from other channels than my connection's own?
队列标签
Ready Unacked Total incoming delivery / get ack
21,884 960 22,844 5.0 / s 0.40 / s 0.40 / s
Exchange 标签:stackoverflow直接D 5.0 / s 5.0 / s
这是我的celeryconfig文件。
CELERYD_CHDIR = settings.filepath
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = "US/Eastern"
CELERY_ACCEPT_CONTENT = ['json', 'pickle', 'yaml']
CELERY_IGNORE_RESULT = True
CELERY_RESULT_BACKEND = "amqp"
CELERY_RESULT_PERSISTENT = True
BROKER_URL = 'amqp://stackoverflow:stackoverflow@rabbitmq:5672'
BROKER_CONNECTION_TIMEOUT = 15
BROKER_CONNECTION_MAX_RETRIES = 5
CELERY_DISABLE_RATE_LIMITS = True
CELERY_TASK_RESULT_EXPIRES = 7200
CELERY_IMPORTS = ("cc.modules.stackoverflow")
CELERY_DEFAULT_QUEUE = "default"
CELERY_QUEUES = (
Queue('default', Exchange('default'), routing_key='default'),
Queue('gold', Exchange('stackoverflow'), routing_key='stackoverflow.gold'),
Queue('silver', Exchange('stackoverflow'), routing_key='stackoverflow.silver'),
Queue('bronze', Exchange('stackoverflow'), routing_key='stackoverflow.bronze'),
)
CELERY_DEFAULT_EXCHANGE = "stackoverflow"
CELERY_DEFAULT_EXCHANGE_TYPE = "topic"
CELERY_DEFAULT_ROUTING_KEY = "default"
CELERY_TRACK_STARTED = True
CELERY_ROUTES = {
'process_call' : {'queue': 'gold', 'routing_key': 'stackoverflow.gold', 'exchange': 'stackoverflow',},
'process_recording': {'queue': 'silver', 'routing_key': 'stackoverflow.silver', 'exchange': 'stackoverflow',},
'process_campaign' : {'queue': 'bronze', 'routing_key': 'stackoverflow.bronze', 'exchange': 'stackoverflow',}
}
答案 0 :(得分:1)
消息确认就像SQL中的事务一样,提交你必须确认从RabbitMq收到的消息。此功能有助于避免系统中的消息丢失。
导航至消息确认标题 https://www.rabbitmq.com/tutorials/tutorial-two-python.html