Celery是实现消息队列的一个工具,本篇博客将介绍消息队列的基础知识,以及celery实现消息队列的总体方法。想要实现用Celery实现消息队列实例的朋友,可以从本篇博客中找到我写的另一篇介绍使用Celery和RabbitMQ实现消息队列的博客。
目录
- 消息队列
- 消息队列原理
- 消息队列特性
- celery实现消息队列
- celery特性
- celery原理
- celery实现
消息队列
消息队列原理
消息队列简称为 MQ (Messges Queue),是一种通信方式。这种通信方式包含Producer(消息生产者)、Consumer(消息消费者)、Queue(队列)、Message(消息体)和Backend(存储消息消费结果的数据库)组成。
Producer生产出Message,并放入Queue中;Consumer监听队列,并从Queue中取出Message进行消费。消息队列中的Queue与数据结构中的队列相同,遵循先进先出FIFO原则,因而先进入消息队列的消息会优先被消费者消费出去。消费者消费消息结束,会将返回结果存入Backend中。
消息队列特性
解藕
从消息队列的原理中可以看出,消息队列中的生产者和消费者执行自己的功能相互独立,因而消息队列第一个特性就是解藕。
消峰
大型项目中有时会面临阶段性消息高峰导致系统崩溃的现象,消息队列一定程度上解决了这个问题。在系统高峰期,可以通过增加消费者,各个消费者并行地消费,提升系统的吞吐率,进而降低延迟时间。
异步
以发送短信为例,假设发送短信的时间为5秒,系统高峰时间中同时有20个用户向消息队列中发送消息请求发送短信,如果一条一条执行这些任务需要100秒时间。这意味着同一时刻发送消息的任务,延迟时间可以相差100秒之久。这种延迟时间对于用户是无法接受的。使用消息队列则可以通过增加消费者数量同时处理这20个用户的请求。这20个请求无需相互等待,其完成的结果可以存储在数据库中,等用户自行去数据库中调取的到消息完成的结果。
celery实现消息队列
在学习celery过程中找到了很好的学习材料,这里分享给大家。牛哄哄的celery 中介绍了celery实现消息队列的方法,并且给出了代码实例,配合其对应的教学视频学习效果会更好。
ps:这是我发现的最好的参考材料👍🏻
celery特性
celery简化了从0到1实现消息队列的复杂工作,只需要简单的指令就可以创建异步任务和定时任务、让消费者监听消息队列、创建多个消费者,并让他们并行地从消息队列中获取任务并将执行任务的结果存入指定的数据库中。celery让用户只需要关注消息队列中的组建分别进行哪些任务,而无需去考虑实现异步、并发等非常基础底层的操作。
celery原理
celery的实现依赖于Broker(消息中间件)和Backend(存储任务完成结果的数据库)。在定义celery任务时首先要定义这两个组件。通常我们可以使用redis或rabbitmq来实现Broker和Backend的功能。(ps: 如果是新手的话,建议先尝试用redis)。
celery实现
参考教学视频中的内容,或参考我的另一篇侧重于介绍实现的博客使用Celery+RabbitMQ实现消息队列