MQ使用场景
流程异步化
业务解耦
流量削峰填谷
RabbitMQ核心概念
先来看一眼rabbitMQ的架构图:
broker:接受客户端连接,实现AMQP协议。
connection:和具体broker建立网络连接。
channel:逻辑概念,几乎所有操作都在channel中进行,channel是消息读写的通道,一个connection可以建立多个channel。
message:应用程序和broker之间传递的数据,由properties和body组成。properties可以对消息进行修饰,比如消息的TTL,correlationId等高级特性;body是消息实体内容。
Virtual host:虚拟主机,用于逻辑隔离,最上层消息的路由。一个Virtual host可以若干个Exchange和Queue,同一个Virtual host不能有同名的Exchange或Queue。
Exchange:交换器,接受消息,根据路由键转发消息到绑定的队列上。
binding:Exchange和Queue之间的绑定关系,告诉exchange把消息路由到哪个队列
routing key:exchange结合routing key来确定如何路由一条消息。
Queue:消息队列,用来存放消息的队列。
消息确认机制
结合上图中消息发送的链路, 我们可以看出一条消息发出去后可能在哪些环节出问题:
Producer发出后由于网络故障Broker没有收到
Producer发出后Broker宕机导致消息丢失
Broker发送给Consumer后由于网络故障Consumer没有收到
Broker发送给Consumer后Consumer宕机导致没有处理
RabbitMQ提供了发布者确认和消费者确认机制来解决这些问题,发布者确认是指Broker收到Producer的消息后,会给Producer发送一条确认消息,如果消息的durable属性为
true, Broker会等消息成功持久化到磁盘后再发送publisher-confirm,发布者确认是异步的,不会影响发布的性能;消费者确认是指消费者收到消息后需要发送一条确认消息给
broker(可以开启自动确认模式,但可能丢消息),broker如果没有收到consumer的确认,会把消息重发.
生产者增加确认机制非常简单,channel开启confirm模式,然后增加监听, 如果使用的spring-rabbit框架, 把connection-factory的publisher-confirms配置为true,
并在RabbitTemplate配置一个confirm-callback的Listener:
|
|