在Django请求/响应周期中使用Celery/RabbitMQ(队列)调用API

3 投票
1 回答
1795 浏览
提问于 2025-04-16 14:23

我正在开发一个产品,需要爬取API并计算返回结果。目前我使用的是Django作为产品框架。我详细查看了Celery和RabbitMQ的文档,以及关于队列的一般知识。

我想实现的目标是:
1. 监控和管理不同供应商的每个API调用。
2. 多个队列和多个消费者。
3. 实时重新调度队列中的任务。

这里的主要问题是,在整个过程中,最耗时的环节是API请求,通常需要1秒到20秒不等。使用Celery和RabbitMQ是否合适呢?我不能使用带确认的Rabbit队列来发起API请求,因为这样会让其他请求在队列中等待,这样就会造成延迟。而如果使用没有确认的队列,就无法跟踪失败的请求,也无法重试它们。那么,我该如何使用队列来解决这个问题呢?

其次,关于监控,我查看了这个http://www.rabbitmq.com/management.html,这是RabbitMQ的管理和监控插件,但我找不到获取队列中已处理消息信息的方法,这对我来说非常重要。有没有办法获取RabbitMQ的这些信息呢?

我是否应该使用其他队列,比如ActiveMQ或ZeroMQ,以便获得更好的监控插件,特别是获取关于已处理消息的信息。

1 个回答

1

我使用Beanstalk已经有一段时间了,效果非常好。

服务器:https://github.com/kr/beanstalkd
客户端库:https://github.com/PeterScott/beanstalkc
Django助手:https://github.com/jonasvp/django-beanstalkd
Django管理应用:https://github.com/humanfromearth/django-beanstalk

我觉得Beanstalk有很多你需要的功能。例如:
1. 你可以设置TTR(运行时间),也就是一个任务需要运行多久才会被放回队列。
2. 如果一个任务快到达它的TTR了,你可以“触碰”它,来重置TTR的倒计时。
3. Beanstalk会在服务器、管道和任务层面跟踪统计信息。所以你可以看到有多少任务是活跃的、延迟的、总共的等等。

RabbitMQ非常强大,但它比较复杂。我发现Beanstalk要轻便得多,灵活性也更高,使用起来更简单。

撰写回答