RabbitMQ 6种工作模式

  • 先来列几个问题
  • RabbitMQ是什么,起源
  • RabbitMQ能干什么,作用、场景
  • RabbitMQ特征是什么,特色
  • RabbitMQ是怎么做到的,原理

    我一直认为,认知一件事情的顺序是循序渐近的,它是什么,它能做什么,它是怎么做到的。
    之前的一个项目中我原本用redis的zset来做消息队列。在数据量不大的情况下,仍会出现一些异常情况,例如消费者(一个php进程)会因为一个数据的异常,导致队挂掉。虽然有supervisor会进行监测,拉起之后,如果再遇到类似的消息处理,仍旧可能会导致整个进程死掉,更致命的是我们没有进行异常通知机制,往往是客户反馈了我们才去排查。这滞后性带来的后果可想而知。所以我就换了专业的MQ 首选了RabbitMQ。至于为什么,我先不讲。

RabbitMQ的起源

Rabbit科技有限公司开发了RabbitMQ,并提供对其的支持。起初,Rabbit科技是LSHIFT和CohesiveFT在2007年成立的合资企业,2010年4月被VMware旗下的SpringSource收购。RabbitMQ在2013年5月成为GoPivotal的一部分。

RabbitMQ的特征

  • rabbitMQ的服务端是由erlang(二郎)语言写的。

  • 可靠性(Reliability)

    RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。

  • 灵活的路由(Flexible Routing)

    在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。

  • 消息集群(Clustering)

    多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。

  • 高可用(Highly Available Queues)

    队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。

  • 多种协议(Multi-protocol)

    RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。

  • 多语言客户端(Many Clients)

    RabbitMQ 几乎支持所有常用语言,比如PHP、 Java、.NET、Ruby、Go等等。

  • 管理界面(Management UI)

    RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。

  • 跟踪机制(Tracing)

如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。

  • 插件机制(Plugin System)

RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

RabbitMQ的基本术语概念解析

  • 术语

    • broker
      一个或者几个erlang节点,称之为broker。一般来说是一个rabbit实例

    • virtualHost
      vhost其实是一个虚拟概念,类似于权限控制组,一个VirtualHost里面可以有若干个Exchange和Queue,但是权限控制的最小粒度是VirtualHost。打个比方就是virtualhost对于broker来说就像虚拟机和宿主机之间的关系一样。

    • exchanger 交换机

      • bindingkey
        交换机和queue绑定起来的键值
      • routingkey
        exchanger根据路由键进行消息投递

      这个交换机跟我们平常上网用得哪个物理交换机不是一回事。
      接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。ExchangeType决定了Exchange路由消息的行为。
      在RabbitMQ中,ExchangeType有direct、Fanout和Topic三种,不同类型的Exchange路由的行为是不一样的

    • QUEUE
      消息队列,用于存储还未被消费者消费的消息。

      • Message
        由Header和Body组成
        Header是由生产者添加的各种属性的集合

        1 Message是否被持久化[deliveryMode 1 是非持久化,2 是持久化]

        2 由哪个Message Queue接受[routing-key (路由键)]

        3 优先级是多少[priority (优先级) ]。
        delivery-mode (消息可能需要持久性存储[消息的路由模式])
        Body是真正需要传输的数据

    • Connection
      一个位于客户端和Broker之间的TCP连接

    • Channel 信道

      仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。
      之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接;

      信道是一个类似于NIO(一种TCP多路复用技术)的技术 在RabbitMQ中每个生产者、消费者线程各把持一个信道,多个信道复用了同一个TCP 连接。当每个信道的流量不是很大时,复用单连接可以在产生性能瓶颈的情况下有效地节 TCP 连接资源。当信道本身的流量很大时,就会开辟多连接,将这些信道均摊到这些连接中

    • producer
      消息生产者

    • consumer
      消费消息者

RabbitMQ的消息投递和消费的流程图

  • producer 生产消息,将消息扔给broker,broker 通过routingkey 路由键,找到相应的交换机exchange,由其通过bindingkey来找到相应的queue对列存储起来。消费的时候,consumer跟broker建立起connection(tcp链接),设置一个信道channel,消费broker下面的queue中的数据

  • 消费者流程图类似

RabbitMQ的工作模式

一 simple模式

    • 消息产生者将消息放入队列
    • 消息的消费者监听消息队列,如果队列中有消息就消费掉
    • 消息被拿走后,自动从队列中删除

二 work queues工作模式

    • 多个消费端消费同一个队列中的消息,队列采用轮询的方式将消息是平均发送给消费者,此处的资源是竞争关系
    • 特点:可以有多个消费者
    • 问题:同一个消息会被不同的消费者都消费掉;
    • 解决方案:synchronize
    • 场景:发红包

三 pub/sub 发布订阅工作模式

  • 特点:相对于Work queues模式多了一个交换机,此处的资源是共享的
  • 流程: 生产端先把消息发送到交换机,再由交换机把消息发送到绑定的队列中,每个绑定的队列都能收到由生产端发送的消息
  • 场景:群发邮件,聊天、广播

四 routing模式

  • 流程:每个消费者监听自己的队列,并且设置带统配符的 routingkey
    生产者将消息发给broker,由交换机根据 routingkey 来转发消息到指定的队列
  • 特点:多个消费者,可以按需消费信息

五 topics模式

  • 特点:其实是路由模式的一种,区别Topics 模式发送消息和消费消息的时候是通过通配符去进行匹配的
  • 说明:通配符有如下注意点:

    */#星号或者井号代表通配符
    星号代表多个单词,而井号代表一个单词
    路由功能添加模糊匹配
    消息生产者生产消息,把消息交给交换机 exchange
    交换机 exchange 根据 key 的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

六 RPC模式

  • RPC 远程过程调用,客户端远程调用服务端的方法 ,使用 MQ 可以实现 RPC 的异步调用
    -
  • 流程:这是基于Direct交换机实现的,流程如下:

    客户端即是生产者也是消费者,向 RPC 请求队列发送 RPC 调用消息,同时监听RPC响应队列
    服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果
    服务端将RPC方法 的结果发送到RPC响应队列
    客户端监听RPC响应队列,接收到RPC调用结果

RabbitMQ的作用和应用场景

  • mq的作用削峰、填谷、异步、解耦

  • 发送短信,增加客户积分、金币、给客户兑换的道具

  • 点赞信息异步入库,更新点赞数
    等等等……

  • 场景:等待一个远程服务器上的函数返回结果

RabbitMQ的exchange类型

direct、topic、fanout、headers

headers Exchange与Direct、topic、fanout不同,它是通过匹配AMQP消息的header而非路由键。
headers Exchange与Direct Exchange类似,性能方面比后者差很多,所以在实际项目中用的很少,通过一张图来直观感受一下其工作流程

headers exchange主要通过发送的request message中的header进行匹配,其中匹配规则(x-match)又分为all和any,all代表必须所有的键值对匹配,any代表只要有一个键值对匹配即可。headers exchange的默认匹配规则(x-match)是any

总结:

这次写了,RabbmitMQ的起源,特征、术语、6种工作模式,以及应用场景。
1 特征:灵活、可靠、高可用、多语言客户端支持,多协议支持,插件机制
2 6种工作模式:简单、work queue、pub/sub、路由模式、主题模式、RPC模式
3 简单粗暴的,就用简单模式,多个客户端交替消费的work queue模式,一股脑扇出的订阅模式,拥有自主选择权的路由模式,还有类似正则表达的主题模式,最后还有一个圈的RPC模式。


以下无正文

thank godness ,我还能学的下去。

参考链接:https://juejin.cn/post/699310666187959501
https://blog.csdn.net/qq_15329947/article/details/86590758

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注