• 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同时设置;另外,已声明并存在队列的属性是不能修改,因此需要重新声明一个新的队列

    $channel->queue_declare('task_queue', false, true, false, false);
    

      

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

        

    $msg = new AMQPMessage($data,
           array('delivery_mode' => 2) # make message persistent
           );

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


    round-robin dispatching:消息轮询分发

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

    Qos:服务质量

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

    basic_qos(null, 1, null);

          参数1:prefetch_size 

          参数2:prefetch_count 

      参数3:a_global

    (未完待续....)

  • 相关阅读:
    什么是32位汇编的flat平坦内存模式
    oracle随机操作
    网线8根排列顺序
    vb创建NT服务
    函数声明后面加个stdcall是什么意思
    一些基础问题。
    ArcGIS Server中地图打印的实现
    添加BaseCommand 和Base Tool 的注意事项
    获取字符串中的某个子字符串
    AE, C#,按纸张打印地图
  • 原文地址:https://www.cnblogs.com/mysic/p/6015571.html
Copyright © 2020-2023  润新知