RabbitMQ
MQ产品常用的三种协议:
1:JMS rocketMQ,activeMQ
2.AMQP RabbitMq
3.MQTT activeMQ
RabbitMQ是AMQP的一种实现。
AMQP是什么?
基本概念
broker:消息代理
producer: 消息的生产者
consumer: 消息的消费者
exchange: 交换机
route: 路由规则
Queue: 消息队列
1.消息的生产者生产消息(指定消息的元数据)
2.交换机根据路由规则放入到指定的队列 成为绑定
3.消息代理把消息投递给订阅了此队列的消费者(消费者也可按照需求自行获取)。
交换机
默认: direct类型的Exchange路由规则也很简单,它会把消息路由到那些Binding key与Routing key完全匹配的Queue中。类似集群模式 一对一,正常情况下的 队列名字严格匹配,交换机设置队列名字和路由规则
fanout : fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。 类似广播模式 不一样,我擦,什么玩意。竟然是绑定这个交换机的queue,然而每一个queue还是只能消费一次。。这是什么逻辑。再见了 rabbimq
Topic : 对key进行模式匹配
如果RabbitMQ没有收到回执并检测到消费者的RabbitMQ连接断开,则RabbitMQ会将该消息发送给其他消费者(如果存在多个消费者)进行处理。这里不存在timeout,一个消费者处理消息时间再长也不会导致该消息被发送给其他消费者,除非它的RabbitMQ连接断开。
这里会产生另外一个问题,如果我们的开发人员在处理完业务逻辑后,忘记发送回执给RabbitMQ,这将会导致严重的bug——Queue中堆积的消息会越来越多。消费者重启后会重复消费这些消息并重复执行业务逻辑。
另外publish message 是没有ACK的。
1. connection error; protocol method: #method<connection.close>(reply-code=530, reply-text=NOT_ALLOWED - access to vhost '/' refused for user 'springcloud', class-id=10, method-id=40)
说明:账户springcloud没有对 “/” 的权限,在 mq 管理页面上添加权限即可