美文网首页
RabbitMQ概念与模型

RabbitMQ概念与模型

作者: nick四叶草 | 来源:发表于2018-06-24 16:27 被阅读0次

    什么是RabbitMQ

    ​ MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。

    ​ RabbitMQ是MQ的一种。其是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

    1、MQ应用场景

    • 异步处理
      • 如用户注册后,需要发送注册邮件和注册短信。使用MQ后,接口的响应效率将大大提高。
    • 应用解耦
      • 如用户下单后,订单系统需要通知库存系统 。使用MQ后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦 。
    • 流量削峰
      • 一般发生在短时间内的大量请求,如秒杀、团抢活动等。使用MQ后,可以控制活动的人数 ,缓解短时间内高流量压垮应用 。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。 秒杀业务根据消息队列中的请求信息,再做后续处理 。
    • 消息通讯
      • 可以实现点对点消息队列,或者聊天室等
    • 日志处理
      • 如Kafka的应用,可解决大量日志传输的问题

    2、生产消费消息模型

    生产者

    ​ 消息发送者,在MQ中被称为生产者(producer),一个发送消息的应用也被叫做生产者,用P表示

    消费者

    ​ 生产者“生产”出消息后,最终由谁消费呢?等待接受消息的应用程序,我们称之为消费者(Consuming ),用C表示

    消息模型

    ​ 消费者(consumer)订阅某个队列。生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者。

    3、RabbitMQ 基本概念

    图片描述
    • Broker: 接收和分发消息的应用,RabbitMQ Server就是Message Broker。
    • Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。
    • Connection: publisher/consumer和broker之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。
    • Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
    • Exchange: message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
    • Queue: 消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。
    • Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。

    生产者发送消息到broker server(RabbitMQ)。在Broker内部,用户创建Exchange/Queue,通过Binding规则将两者联系在一起。Exchange分发消息,根据类型/binding的不同分发策略有区别。消息最后来到Queue中,等待消费者取走。

    4、Exchange Type

    RabbitMQ常用的Exchange Type有三种:fanout、direct、topic。

    • fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中。
    • direct:把消息投递到那些binding key与routing key完全匹配的队列中。
    • topic:将消息路由到binding key与routing key模式匹配的队列中。

    5、RPC

    MQ本身是基于异步的消息处理,前面的示例中所有的生产者(P)将消息发送到RabbitMQ后不会知道消费者(C)处理成功或者失败(甚至连有没有消费者来处理这条消息都不知道)。 但实际的应用场景中,我们很可能需要一些同步处理,需要同步等待服务端将我的消息处理完成后再进行下一步处理。这相当于RPC(Remote Procedure Call,远程过程调用)。在RabbitMQ中也支持RPC。

    RabbitMQ中实现RPC的机制是:

    • 客户端发送请求(消息)时,在消息的属性(MessageProperties,在AMQP协议中定义了14中properties,这些属性会随着消息一起发送)中设置两个值replyTo(一个Queue名称,用于告诉服务器处理完成后将通知我的消息发送到这个Queue中)和correlationId(此次请求的标识号,服务器处理完成后需要将此属性返还,客户端将根据这个id了解哪条请求被成功执行了或执行失败)
    • 服务器端收到消息并处理
    • 服务器端处理完消息后,将生成一条应答消息到replyTo指定的Queue,同时带上correlationId属性
    • 客户端之前已订阅replyTo指定的Queue,从中收到服务器的应答消息后,根据其中的correlationId属性分析哪条请求被执行了,根据执行结果进行后续业务处理

    参考资料

    1. MQ的使用场景
    2. RabbitMQ与AMQP协议详解

    相关文章

      网友评论

          本文标题:RabbitMQ概念与模型

          本文链接:https://www.haomeiwen.com/subject/svzjyftx.html