RabbitMQ学习初整理
rabbitMQ是AMQP的实现,相关语义如下
Broker:提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列
Queue:消息的载体,每个消息都会被投到一个或多个队列
Bingding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来
Routing Key:路由关键字,exchange根据这个关键字进行消息投递
vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离
Producer:消息生产者,就是投递消息的程序
Consumer:消息消费者,就是接受消息的程序
Channel:消息通道,在客户端的每个连接里,可建立多个channel
核心概念
1:在mq领域中,producer将msg发送到queue,然后consumer通过消费quue完成P.C解耦
2:kafka是由producer决定msg发送到哪个queue
3:rabbitmq是由Exchange决定msg应该怎么样发送到目标queue,这就是binding及对应的策略
Exchange
Direct Exchange:直接匹配,通过Exchange名称+RoutingKey来发送与接收消息
Fanout Exchange:广播订阅,向所有消费者发布消息,但只有消费者将队列绑定到该路由才能接收到消息,忽略RoutingKey
Topic Exchange:主题匹配订阅,这里的主题指的是RoutingKey,RoutingKey可以采用通配符,如:*或#,RoutingKye命名采用" . " 来分割多个词,只有消息这将队列绑定到该路由且指定RoutingKey符合匹配规则时才能收到消息
Headers Exchange:消息头订阅,消息发布前为消息定义一个或多个键值对的消息头,然后消费者接收消息同时需要定义类似的键值对请求头(如:x-match=all 或 x-match=any),只有请求头与消息头匹配,才能接收消息,忽略RoutingKey
默认的Exchange:如果用空字符串去声明一个exchange,那么系统就会使用"amq.direct"这个exchange,我们创建一个queue时,默认的都会有一个和新建queue同名的routingKey绑定到这个默认的exchange上
RabbitMQ如何确保消息发送和消息接收
消息发送确认
1:ConfirmCallback
ConfirmCallback是一个回调接口,消息发送到Broker后触发回调,确认消息是否到达Broker服务器,也就是只确认是否正确到达Exchange中
2:ReturnCallback
通过实现ReturnCallback接口,启动消息失败返回,此接口是在交换器路由不到队列时触发回调,该方法可以不使用,因为交换器和队列是在代码里绑定的,如果消息成功投递到Broker后几乎不存在绑定队列失败,除非代码写错
消息接收确认
RabbitMQ消息确认机制(ACK)默认是自动确认的,自动确认会在消息发送给消费者后立即确认,但存在丢失消息的可能,如果消费端消费逻辑抛出异常,假如你用回滚了也只是保证了数据的一致性,但是消息还是丢了,也就是消费端没有处理成功这条消息,那么就相当于丢失了消息
消缺确认模式
AcknowledgeMode.NODE:自动确认
AcknowledgeMode.AUTO:根据情况确认
AcknowledgeMode.MANUAL:手动确认
消费者收到消息后,手动调动Basic.Ack或Basic.Nack或Basic.Reject后,RabbitMQ收到这些消息后,才认为本次投递完成
Basic.Ack:用于确认当前消息
Basic.Nack:用于否定当前消息
Basic.Reject:用于拒绝当前消息
Nack,Reject后有能力要求是否requeue消息或者进入死信队列