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,消息队列,保存消息并将它们转发给消费者。