本文共三篇,看完之后,使用RabbitMq + Celery进行日常业务是没问题的。
一、背景介绍
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量,目前项目中一直在用RabbitMq + Celery进行分布式异步调度任务,最近抽出时间从头整理一下。
二、RabbitMq简介
首先,我们看下RabbitMq的发展史
RabbitMq由三部分组成:交换器,绑定,队列。
如下图
下面我们看一下关于先关概念:
1、RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
2、MQ:消息队列(Message Queue),应用程序A可以给应用程序B发送消息,能够有效解耦,支持高并发,支持异步操作等等。
3、AMQP:Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
4、生产者:消息的生产者,将消息发送到MQ
5、消费者:消息的消费者,从MQ接收消息并进行处理
6、Exchange:交换器,将生产者的消息根据规则路由到不同的队列以便不同的消费者拿到对应的消息。
7、RabbitMQ常用的Exchange Type有三种:fanout、direct、topic。
fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中,广播。
direct:把消息投递到那些binding key与routing key完全匹配的队列中。
topic:将消息路由到binding key与routing key模式匹配的队列中。
1.RabbitMQ支持消息确认,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除;如果RabbitMQ没有收到回执并检测到消费者的RabbitMQ连接断开,则RabbitMQ会将该消息发送给其他消费者(如果存在多个消费者&#x