RabbitMQ
介绍
消息队列是典型的:生产者消费者模型
生产者不断向消息队列生产消息,消费者不断从队列中获取消息。消息的生产和获取都是异步的,只关心消息的发送和接收,没有业务逻辑的侵入,实现了生产者和消费者的解耦
端口:5672
界面版端口:15672
常见MQ产品
- ActiveMQ:基于JMS
- RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
- RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会
- Kafka:分布式消息系统,高吞吐量
RabbitMQ消息类型
RabbitMQ是一个消息的代理者,负责接收
(1)基本消息模型
P:生产者,也就是要发送消息的程序
C:消费者:消息的接受者,会一直等待消息到来。
queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。
(2) 任务消息模型
P:生产者:任务的发布者
C1:消费者1,领取任务并且完成任务
C2:消费者2:领取任务并且完成任务
这种方式最大的特点是:可以被多个消费者消费
当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度,长此以往,消息就会堆积,无法及时处理。
此时就可以使用任务消息类型,让多个消费者绑定到同一个队列中,共同消费队列中的消息。
特点:队列中的消息一旦被消费就会消失,因此任务不会被重复执行。
平均分配
1.正常情况下如果一个队列有多个消费者,RabbitMQ是按照任务数进行平均分配,例如有10个任务,每个消费者各5个,而不管每个任务的时间长短是否一样
2.如果想要实现真正平均分配任务,应该是从任务总耗时来考虑,即如果有10个任务,其中有8个任务时间很短,有2个任务时间较长,但是8个较短的任务耗时与2个较长任务耗时差不多,此时最好让RabbitMQ做到这样的分配才算合理
3.实现平均分配的方式是
设置channel.basic_qos(prefetch_count=1)
设置自动应答
(3)订阅模型分类
P:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)
C:消费者,消息的接受者,会一直等待消息到来。
Queue:消息队列,接收消息、缓存消息。
Exchange:交换机,图中的X。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!
Exchange有以下3种类型:
1.Fanout:广播,将消息交给所有绑定到交换机的队列
1) 可以有多个消费者
2) 每个消费者有自己的queue(队列)
3) 每个队列都要绑定到Exchange(交换机)
4) 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定
5) 交换机把消息发送给绑定过的所有队列
6) 队列的消费者都能拿到消息。实现一条消息被多个消费者消费
2.Direct:定向,把消息交给符合指定routing key 的队列
- 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
- 消息的发送方在 向 Exchange发送消息时,也必须指定消息的 RoutingKey。
- Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息
- P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。
- X:Exchange(交换机),接收生产者的消息,然后把消息递交给 与routing key完全匹配的队列
- C1:消费者,其所在队列指定了需要routing key 为 error 的消息
- C2:消费者,其所在队列指定了需要routing key 为 info、error、warning 的消息
3.Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符!
通配符规则:
#:匹配一个或多个词
*:匹配不多不少恰好1个词
(4)RPC