RabbitMQ整理
如何保证消息的幂等性?
幂等性指一次或多次请求一个资源,对于资源本身应该具有同样的结果,也就是说,其任意多次执行对资源本身所产生的影响均与一次执行影响相同。在MQ中指消费多条相同的消息,得到与消费该消息一次相同的结果。
解决方案
1 乐观锁解决方案
2 通过Redis原子性解决生产者在发送消息时,为每条消息设置一个全局唯一的messageId,消费者拿到消息后,使用setnx命令,将messageId作为key放到redis中:setnx(messageId,1),若返回1,说明之前没有消费过,正常消费;若返回0,说明这条消息之前已消费过,抛弃。
3 唯一ID+指纹码唯一ID+指纹码机制,利用数据库主键去重Select count(1) from T_order where ID=唯一ID+指纹码
4 状态机幂等也就是通过数据库字段状态来判断,重复消费无效
RabbitMQ有什么特点?
可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性。
灵活的分发消息策略。这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。
分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
支持集群。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
多种协议。RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
支持多种语言客户端。RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
可视化管理界面。RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
插件机制。RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。
RabbitMQ有哪几种Exchange类型?
Direct exchange
将队列绑定到交换机,消息的 routeKey 需要与队列绑定的 routeKey 相同。
Fanout exchange
一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上,类似发布订阅。
Topic exchange
把消息路由到bindingKey与routingKey模糊匹配的Queue中,这种交换机是使用通配符去匹配,路由到对应的队列。通配符有两种:"*" 、 "#"。需要注意的是通配符前面必须要加上"."符号。
符号:有且只匹配一个词。比如 a.*可以匹配到"a.b"、"a.c",但是匹配不了"a.b.c"。
# 符号:匹配一个或多个词。比如"rabbit.#"既可以匹配到"rabbit.a.b"、"rabbit.a",也可以匹配到"rabbit.a.b.c"。
Headers Exchange
它跟上面三种有点区别,它的路由不是用routingKey进行路由匹配,而是在匹配请求头中所带的键值进行路由。
有哪几种分发消息的策略?
简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
如何保证消息可靠性?
消息持久化
队列和消息都支持持久化,配置不同队列持久化需要在声明队列时添加参数 durable=True,这样在rabbitmq崩溃时也能保存队列仅仅使用durable=True ,只能持久化队列,不能持久化消息消息持久化需要在消息生成时,添加参数 properties=pika.BasicProperties(delivery_mode=2)
confirm机制
从producer 到 exchage 会返回一个confirmCallBakck
ACK事物机制
需要开启手动确认消息从exchange 到 queue 投递失败会返回一个returnCallBack
什么是死信队列?
死信交换机和死信队列与普通的队列没区别,当消息成为dead message,可以被重新发送到另一个交换机这个交换机就是死信交换机。
消息成为死信的三种情况
- 1 队列消息长度达到限制
- 2 消息被拒收,并且不把消息重新放入目标队列。
- 3 有消息过期限制
什么是AMQP高级消息队列协议?
AMQP全称:Advanced Message Queuing Protocol(高级消息队列协议)
server: 又称Broker,接收客户端的链接,实现AMQP实体服务
Connection: 链接,应用程序与Broker的网络连接
Channel:网络信道,几乎所有的操作(数据的读、写)都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表
一个会话任务。
Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;
Body则就是消息体内容。
Virtual host:虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual host 里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange和Queue。一种逻辑概念,类似Redis的逻辑数据库。用来划分具体的服务。
Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列Binding:Exchange 和Queue之间的虚拟连接,Binding中可以包含routing key
Routing key:一个路由股则,虚拟机可用它来确定如何路由一个特定消息。Queue:也称为message
Queue,消息队列,保存消息并将它们转发给消费者。