赞
踩
消息 (Message) 是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串、JSON等,也可以很复杂,比如内嵌对象。
消息队列中间件 (Message Queue Middleware,简称为MQ) 是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
消息中间件一般有两种传递模式:点对点模式和发布/订阅模式。
点对点模式是基于队列的,消息生产者发送消息到队列,消息消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。
发布订阅模式定义了如何向一个内容节点发布和订阅消息,这个内容节点称为主题(topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者则从主题中订阅消息。主题使得消息的订阅者与消息的发布者互相保持独立,不需要进行接触即可保证消息的传递,发布/订阅模式在消息的一对多广播时采用。
RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。
如上图,RabbitMQ基础概念如下:
生产者创建消息,然后发布到RabbitMQ 中。消息一般可以包含2个部分:消息体和标签消息体也可以称之为 payload,在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个JSON 字符串。消息的标签用来表述这条消息, 比如一个交换器的名称和一个路由键。 生产者把消息交由 RabbitMQ,RabbitMQ 之后会根据标签把消息发送给感兴趣的消费者 (Consumer) 。
消费者连接到 RabbitMQ 服务器,并订阅到队列上。 当消费者消费一条消息时, 只是消费消息的消息体 (payload) 。 在消息路由的过程中, 消息的标签会丢弃, 存入到队列中的消息只有消息体,消费者也只会消费到消息体, 也就不知道消息的生产者是谁,当然消费者也不需要知道。
RabbitMQ 的生产者生产消息井最终技递到队列中,消费者可以从队列中获取消息并消费。
多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊,即轮询给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理:
生产者并不是将消息直接投递到队列中的,而是将消息发送到Exchange (交换器,通常也可以用大写的 "X" 来表示),交换机不存储消息,而是将消息路由到一个或者多个队列中。如果路由不到,或许会返回给生产者,或许直接丢弃。
RoutingKey: 路由键。生产者将消息发给交换器的时候, 会指定一个RoutingKey,用来指定这个消息的路由规则。
Binding: 绑定。 RabbitMQ 中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键( BindingKey) ,这样RabbitMQ 就知道如何正确地将消息路由到队列了:
生产者将消息发送给交换器时, 需要一个RoutingKey, 当BindingKey 和RoutingKey 相匹配时, 消息会被路由到对应的队列中。
RabbitMQ 常用的交换器类型有fanout、 direct、 topic、 headers 这四种 。
我们知道无论是生产者还是消费者,都需要和 RabbitMQ Broker 建立连接,这个连接就是一条 TCP 连接,也就是Connection。 一旦TCP 连接建立起来,客户端紧接着可以创建一个AMQP信道 (Channel),每个信道都会被指派一个唯一的ID。信道是建立在Connection 之上的虚拟连接, RabbitMQ 处理的每条AMQP指令都是通过信道完成的。
这里采用了类似于NIO的TCP连接复用机制,提高了系统的性能,整体通讯过程如下图所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。