首页 > 代码库 > RabbitMQ 基础概念

RabbitMQ 基础概念

Broker:消息协商器。消息队列的实体,它在TCP/IP等端口上监听AMQ消息


 vHost:虚拟主机。功能上类似于web的虚拟主机,都是把数据按照功能或项目的不同划分为不同的虚拟主机;用户只被授予访问虚拟主机的权限,而没有其他比这高级的访问控制措施。客户端与Broker沟通需要先建立连接,这些连接仅限于连接用户和虚拟主机。


 channel:通道。客户端在连接中声明一个通道,这个通道是客户与Broker之间的一个逻辑连接;客户端的操作都是通过通道来实现的。具体的操作需要客户端声明相应的组件。

   常用的组件:

    - 交换器(Exchange),它是发送消息的实体;可以显式命名

    - 队列(Queue),这是接收消息的实体;可以显式命名;如果不命名,系统会自动生成一个队列,名称也为随机的,随机生成的队列生命周期会在当次生成它的连接断开时结束

    - 绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息;绑定的交换器


 message:消息

   消息的组成:

    - 元数据,例如内容的编码或者表明来源的字段。

    - 标志位,标记消息投递时候的一些保障机制。

    - 一个特殊的字段叫做routing key。


exchange:交换器

  交换器负责把producer的消息按指定的规则分配给queue

  规则有四种:

    - direct

    - topic

    - headers

    - fanout 群发,向所有绑定的queue


 queue:队列

   broker储存消息的位置,他可以由producer和consumer任意一方建立。

temporary queue:临时队列

      声明队列时如果不指明队列名称,那么声明的队列将是一个自动命名的队列,这个队列会在连接断开时自动删除,因为它属于一次会话的专属队列,会话结束,它也就应该结束了。


 消息从发送到接收的流程:

   消息发送客户端-create channel-》exchange-》queue-》-create channel -消息接收客户端 (接收端的接收流程还不确定)


   broker在发送消息成功后会立即删除掉保存在queue中的该条消息。如果设置了回执,broker会在收到回执后执行删除。


 consumer关闭、broker服务关闭都会造成任务失败和消息丢失。

     - consumer异常: message acknowledgment。如果consumer发生异常消息未收到的情况下,broker不会删除掉该消息,而是重新发送,直到收到consumer返回回执才会删除。

    - broker异常: 对队列和消息进行持久化。

   - 队列持久化:在队列声明中将持久化的参数设置为true即可使队列持久化;这个设置必须在producer和consumer同时设置;另外,已声明并存在队列的属性是不能修改,因此需要重新声明一个新的队列

   - 消息持久化: 依据原始消息数据,在实例化消息对象时,传入消息持久化的参数

默认的这种持久化并不是非常的强壮,因为在broker接受消息后有一小段时间内消息是未保存的。另外,rabbitmq不会对每条消息执行fsync,因此消息有可能是在内存的缓存中,并未真正的写到磁盘上。如果需要更妥当的持久化,需要用到事务Transaction 具体详情:https://www.rabbitmq.com/confirms.html


round-robin dispatching:消息轮询分发

  如果有多个worker,borker会将消息按照奇偶数轮流分发给worker;

Qos:服务质量

     消息有的长,有短,如果一个worker分发到的消息都很长,而一个worker分发到的都比较短,那么一个worker会很繁忙,另一个会很闲。这样就需要去平衡消息的分发。

     设置qos :basic_qos(null, 1, null)。1代表的是broker一次只发送一条消息给worker,如果worker没有完成上一条发送的消息、没有给broker发送回执,那么则不会继续给这个worker发送下一条消息,下一条的消息会发送给一个空闲的worker来处理。

 

(未完待续....)

RabbitMQ 基础概念