rabbitmq 交换机类型
-
fanout 广播模式:将消息交给所有绑定到交换机的队列。
-
direct 精确匹配:根据生产者中binding key 来和消费者端 routing key 做精确匹配(equal)。
-
topic 模糊匹配:routing key中可以带 * 和 # 来做模糊匹配, “*” 用于匹配一个单词,“#” 用于0~N个单词
rabbitmq 消息模型
rabbitmaq 工作队列模式
存在的问题
- 消费者1比消费者2的效率要低,一次任务的耗时较长
- 然而两人最终消费的消息数量是一样的
- 消费者2大量时间处于空闲状态,消费者1一直忙碌
实现能者多劳(乱序):
设置 channel.basicQos(1)
,告诉RabbitMQ一次不要向工作人员发送多于一条消息。 或者换句话说,不要向工作人员发送新消息,直到它处理并确认了前一个消息。 相反,它会将其分派给不是仍然忙碌的下一个工作人员。
rabbitmaq 订阅模式(Fanout,Direct,Topic)
-
1个生产者,多个消费者
-
每一个消费者都有自己的一个队列
-
生产者没有将消息直接发送到队列,而是发送到了交换机
-
每个队列都要绑定到交换机
-
生产者发送的消息,经过交换机到达队列,实现一个消息被多个消费者获取的目的
注意:Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!
如何避免消息丢失
1) 消费者的ACK机制。可以防止消费者丢失消息。
-
消费者自动ACK
-
消费者手动ACK
2) 消息持久化。防止MQ宕机,消息丢失
-
交换机持久化
-
队列持久化
-
消息持久化