zoukankan      html  css  js  c++  java
  • RabbitMQ之概念介绍(二)

    简介:

      MQ全称为Message Queue,消息队列是一种应用程序间的通信方法。

      其是消费者-生产者模型的一个典型代表,一端往消息队列中不断写入消息,另一端不断读取/订阅消息。

    简单使用场景举例:

      将项目中无需即时返回且耗时的操作提取出来,进行异步处理,大大降低了服务器的请求响应时间。

      如:打印日志模块无需即时返回,且写磁盘是一种比较慢的行为,可以将其写到MQ中,生产者不需要关心是否立马写到磁盘。

    典型应用场景:

      异步处理请求:读写分离

      应用解耦:生产者消费者读写分离

      流量削峰:把流量控制到MQ这一层,不会实际的走到server侧

      负载均衡:同一个Queue上的多个消费者被负载均衡(一条消息只上报给一个人)

      消息订阅:根据订阅信息自动上报消息,类型NIO的处理逻辑

    几个重要概念:

    Queue

      消息队列,其作用是先进先出,存储来自Producer的消息,上报消息给Consumer,多个Producer可以订阅同一个Queue,但是Queue中的数据之后上报给其中一个人(可以用来做负载均衡),上报完之后数据被丢弃,如果未能上报或者说无Consumer,则该消息一直存在;

           下图是简化版(中间有一层Exchange),C和P一比一,实际有Exchange的存在

         

         下图时一个生产者对应多个消费者,两个消费者C1,C2平均每人处理一条P生产的消息A,B

         

    Exchange

      The core idea in the messaging model in RabbitMQ is that the producer never sends any messages directly to a queue.Actually, quite often the producer doesn't even know if a message will be delivered to any queue at all.

      Instead, the producer can only send messages to an exchange. An exchange is a very simple thing. On one side it receives messages from producers and the other side it pushes them to queues. The exchange must know exactly what to do with a message it receives. Should it be appended to a particular queue? Should it be appended to many queues? Or should it get discarded. The rules for that are defined by the exchange type.

       交换机,决定了消息路由规则,但是它不会存储,生产者塞进来数据时,如果没有Queue bind到Exchange的话,它会直接丢弃Producer发送过来的消息;

      上面展示了Queue的大致工作原理,但是实际上P生产的消息不会直接放到Queue中,而是要经过Exchange,Exchange再将消息路由到一个或者多个Queue中,不符合路由规则的直接丢弃。(Exchange怎样确定将消息路由到哪个队列或者丢弃的呢?请看下面讨论Binding key和exchange type)。

      Exchange有四种类型,不同类型有着不同的策略。Exchange Type如下:

      fanout(广播):将发送到该Exchange的消息路由到所有它直接绑定的Queue中(不关心binding key)

        

      direct:把消息路由到那些binging key和routing key完全匹配的Queue中。

        如下图:C1订阅的Queue1使用binging key booking绑定Exchange,那么P发送的所有以booking为routing key的消息都会发送到Queue1中,也会上报给C1.(C2也是如此,因为其也绑定了booking)

        

      topic:topic基本同direct,其区别时direct是完全匹配,topic支持模糊匹配。*用于匹配一个单词,#用于匹配多个或0个单词(这里的单词指的是以点号分割的,如my.name对应 my name 两个单词)

        

        

    Binding

      Binding是Exchange和Queue之间连接的桥梁。在绑定(Binding)Exchange和Queue的同时,一般指定一个Binging Key。Producer将消息发送到Exchange的时候,一般会产生一个Routing Key,当RoutingKey和Binding Key对应上的时候,消息就会发送到对应的Queue中。

    Connection

      一个实际的tcp连接,生产者和消费者都是通过tcp连接到MQ中的。

    Channel

      虚拟连接,建立在Connection连接的基础上,数据流动都是通过Channel来进行的。

      Bind:

  • 相关阅读:
    【反演复习计划】【bzoj2154】Crash的数字表格
    【反演复习计划】【bzoj3529】数表
    【反演复习计划】【bzoj3994】DZY loves maths
    【反演复习计划】【bzoj3994】约数个数和
    【反演复习计划】【bzoj2818】gcd
    【反演复习计划】【bzoj1011】zap-queries
    BZOJ3991: [SDOI2015]寻宝游戏
    BestCoder Round #75
    BZOJ4417: [Shoi2013]超级跳马
    BZOJ4416: [Shoi2013]阶乘字符串
  • 原文地址:https://www.cnblogs.com/gc65/p/8988156.html
Copyright © 2011-2022 走看看