【发布时间】:2018-09-20 20:35:36
【问题描述】:
我在一个 Python Django 项目中工作。
它的一个功能是当有人从网络应用程序发送一些数据时,将它们转发到移动设备。
对于此功能,应用程序使用第三方服务GCM 和Amazon SNS。以下是应用程序的数据流。
Web 应用程序 ------> Amazon SNS --------> GCM --------> Android 设备
由于 Amazon SNS 端可能存在网络延迟、操作延迟和故障,Web 应用程序使用celery 作为调度器应用程序来实现异步、重试等行为。Celery 将 SNS 发送任务存储在队列中并异步处理它们.
Celery 作为调度程序使用 RabbitMQ 作为其代理应用程序。以下是数据流。
Web App --> Celery --> RabbitMQ --> Amazon SNS --> GCM --> Android 设备
发现与 Celery 和 RabbitMQ 组件相关的问题。
我们可以看到,当 celery 向 RabbitMQ 发送任务时,特定的 RabbitMQ 队列数增加,这意味着 celery 成功创建了任务对象并发送到队列。
但特定任务永远存在于队列中(队列数不会减少)并且不会继续将消息发送到 Amazon SNS,这意味着 Celery 不会再次从队列中选择存储的任务。
(我可以绕过 Celery 成功向 SNS 推送消息,这意味着与 SNS 的连接没有问题。)
这可能会导致celery 不从RabbitMQ 中挑选存储的任务?
【问题讨论】:
标签: python rabbitmq django-celery