• mq-rabbitmq


    介绍


    rabbitmq性能(1.2w+)高于activemq(6000+),低于rocketmq(10w+),通讯协议默认为amqp,通过插件扩展可支持stomp/mqtt等协议。


    概念


    连接

    tcp连接


    信道

    tcp上封装的虚拟连接,每个线程对应一个信道,即多路复用


    生产者


    消费者


    消息

    包括标签(消息头)和有效载荷(消息体)


    交换器exchange

    交换器直接与生产者交互,解耦生产者与队列,队列通过路由键绑定到交换器,本质为路由查询表


    交换器类型

    • direct:1对1映射完全匹配交换器和队列,默认交换器类型,默认以队列名称作为路由键
    • fanout:广播模式,忽略路由键配置,生产者发送的消息将由交换器发到所有与该交换器绑定的队列(绑定了其他交换器的队列并不会收到消息)
    • topic:通配符模式,根据路由键中的通配符决定将消息发到符合条件的queue,通配符*表示匹配一个字符,#表示匹配一个或多个字符,.表示匹配分割符,如test.#,可以匹配test.开头的所有路由键
    • headers:通过报文头中的自定义的键值对来确定消息存到哪个queue,实操中因为功能与direct雷同且性能较差,几乎不用

    队列queue

    消息存储位置,直接与消费者交互,一个队列可以有多个消费者


    路由键

    即交换器与队列的映射,队列可绑定多个路由键


    虚拟主机vhost

    可以隔离mq所有资源,有自己的权限,类比于命名空间


    生产消费机制


    生产消息


    生产消息可以选择模式,如下

    • 无模式:即生产者将消息发给mq后就算结束,不关心消息是否已经落到queue中。
    • 失败确认:开启故障检测模式,设置mandatory,特点是只有当消息没有落到queue中时会反馈给生产者,包括队列不存在/路由没有找到等情况。但是此种模式对于数据完整性来说有缺陷,无法保证反馈通知一定能通知到生产者(如此时生产者挂了),也就可能产生消息丢失的情况。
    • 事务:性能太差
    • 发送方确认模式:将信道设置为confirm模式,同事务模式冲突,可以与失败确认组合使用,其中又可以分为三种
      • 同步确认:即发送完后同步等待消息确认
      • 批量确认:发送批量消息后同步等待确认,仅会对整批消息返回一条确认消息,失败则意味着这批消息需要重发
      • 异步确认:即发送完后异步等待消息确认,通过先从信道中获取消息发送序号存储,等待消息落到queue中后,mq会通知生产者,此时可以将存储的序号删除,表示成功。

    备用交换器

    当主交换器无法路由到对应的queue时,将通过备用交换器进行路由,如设置了失败确认模式,会在备用交换器也失败的情况下才通知。


    消息过期

    主要有2种,

    • queue设置过期时间,x-message-ttl 参数,RabbitMQ保证死消息(在队列中的时间超过设定的TTL时间)不会被消费者获得,同时会尽快删除死的消费者。消息不会在消费者的缓冲区中过期,也就是说,只要队列在消息过期前将消息推送给消费者,消费者就一定能处理到这条消息。重新入队(例如被取消确认或者信道关闭或拒绝并重新入队)的消息的过期时间保留初始值,即不刷新过期时间。
    • 单条记录设置过期时间,只对处于队头的消息判断是否过期(即不会扫描队列),所以,很可能队列中已存在死消息,但是队列并不知情。这会影响队列统计数据的正确性,妨碍队列及时释放资源。

    消费消息


    拉取get

    即为轮询模式,当没有消息时返回空回复


    推送consume

    常见使用方式,即mq有消息时主动推送给消费者


    消息应答模式

    与生产者的确认模式类似,消费者需要告诉mq消息是否已正确消费,目的是确保消息的完整性。主要有有种模式

    • 自动确认:autoAck=true,即收到消息就自动确认
    • 手动确认:mq会等待消费者返回ack信号后才删除消息,在未收到ack时,消息处于正在消费阶段,其他消费者无法消费到,只有当此消费者与mq断开连接后(如果连接没断,mq允许消费者一直处理该条消息),mq认为此消息没有被消费,将重新投递给消费者。对于某些无法处理的消息,可以在消费者进行拒绝处理,此时该消息可以进入死信队列,等待后续处理。

    消息拒绝

    消息拒绝有两种方式,

    • reject:可以使用requeue标识,=false则不重新发送(可进入死信队列),=true则mq会重新投递消息
    • Nack:同reject,可以一次拒绝多个消息

    死信交换器

    概念同普通交换器没有区别,只不过特意标识为用来处理‘死了的’消息,设置参数为x-dead-letter-exchange。使用场景主要为2种,对异常消息进行后续处理(如人工介入等),可以实现延时处理消息的能力(如实现下单待付款到时间关闭)
    和备用交换器的区别

    • 备用交换器是主交换器无法路由消息,那么消息将被路由到这个新的备用交换器,而死信交换器则是接收过期或者被拒绝的消息。
    • 备用交换器是在声明主交换器时发生联系,而死信交换器则声明队列时发生联系。
      场景分析:备用交换器一般是用于生产者生产消息时,确保消息可以尽量进入 RabbitMQ,而死信交换器主要是用于消费者消费消息的万不一失性的场 景(比如消息过期,队列满了,消息拒绝且不重新投递)

    触发时机

    • 消 息被拒绝且requeue=false
    • 消息过期(默认queue是不会过期,可以设置队列过期或单条消息过期)
    • 队列达到最大值(默认无限长度)

    队列高可用


    队列属性配置


    参考

    https://www.liangzl.com/get-article-detail-6832.html
    https://blog.csdn.net/weixin_39776991/article/details/111618735

  • 相关阅读:
    mysql install steps
    d3js
    js布局库
    mac 学习笔记
    js图形库
    zeromq 笔记
    C语言程序员必读的5本书
    Java基础
    JS中的toString方法
    给你六种面额1 5 10 20 50 100元的纸币假设每种币值的数量足够多
  • 原文地址:https://www.cnblogs.com/wish5714/p/14963866.html
Copyright © 2020-2023  润新知