• 队列


    临时队列

      临时队列对应的是没有持久化的队列,也就是如果 RabbitMQ 服务器重启,那么这些队列就不会存在,所以我们称之为临时队列。

    自动删除队列

      自动删除队列和普通队列在使用上没有什么区别,唯一的区别是,当消费者断开连接时,队列将会被删除。自动删除队列允许的消费者没有限制,也就是说当这个队列上最后一个消费者断开连接才会执行删除。

      自动删除队列只需要在声明队列时,设置属性 auto-delete 标识为 true 即可。系统声明的随机队列,缺省就是自动删除的。

     

    单消费者队列

      普通队列允许的消费者没有限制,多个消费者绑定到多个队列时,RabbitMQ 会采用轮询进行投递。如果需要消费者独占队列,在队列创建的时候,设定属性 exclusive  true。

    自动过期队列

      指队列在超过一定时间没使用,会被从 RabbitMQ 中被删除。

      什么是没使用?1.一定时间内没有 Get 操作发生。2.没有 Consumer 连接在队列上。

      特别的:就算一直有消息进入队列,也不算队列在被使用。

      通过声明队列时,设定 x-expires 参数即可,单位毫秒。

      比如这个队列会在当消费者断开连接时 10 秒后过期。

     

    永久队列

    队列的持久性

      持久化队列和非持久化队列的区别是,持久化队列会被保存在磁盘中,固定并持久的存储,当 Rabbit服务重启后,该队列会保持原来的状态在 RabbitMQ中被管理,而非持久化队列不会被保存在磁盘中,Rabbit 服务重启后队列就会消失。

      非持久化比持久化的优势就是,由于非持久化不需要保存在磁盘中,所以使用速度就比持久化队列快。即是非持久化的性能要高于持久化。而持久化的优点就是会一直存在,不会随服务的重启或服务器的宕机而消失。

    在声明队列时,将属性 durable 设置为“false”,则该队列为非持久化队列,设置成“true”时,该队列就为持久化队列

     

    队列级别消息过期

      就是为每个队列设置消息的超时时间。只要给队列设置 x-message-ttl 参数,就设定了该队列所有消息的存活时间,时间单位是毫秒。如果声明队列时指定了死信交换器,则过期消息会成为死信消息。

     

    队列保留参数列表

    参数名

    目的

    x-dead-letter-exchange

    死信交换器

    x-dead-letter-routing-key

    死信消息的可选路由键

    x-expires

    队列在指定毫秒数后被删除

    x-ha-policy

    创建 HA 队列

    x-ha-nodes

    HA 队列的分布节点

    x-max-length

    队列的最大消息数

    x-message-ttl

    毫秒为单位的消息过期时间,队列级别

    x-max-priority

    最大优先值为 255 的队列优先排序功能

    • 对队列中消息的条数进行限制 x-max-length
    • 对队列中消息的总量进行限制 x-max-length-bytes

    消息的属性

      消息标准化可以减少开发人员重复使用的痛苦,所以 RabbitMQ 对消息进行了如下标准化:

      按照 AMQP 的协议单个最大的消息大小为 16EB(2  64 次方),但是 RabbitMQ 将消息大小限定为 2GB(2  31 次方)。

     

    在发送消息时,我们还可以对消息的属性做更细微的控制,比如构建 Request-Response 模式,参见代码 native 模块包 cn.enjoyedu.setmsg。

    消息存活时间

      当队列消息的 TTL 和消息 TTL 都被设置,时间短的 TTL 设置生效。

      如果将一个过期消息发送给 RabbitMQ,该消息不会路由到任何队列,而是直接丢弃。

      为消息设置 TTL 有一个问题:RabbitMQ 只对处于队头的消息判断是否过期(即不会扫描队列),所以,很可能队列中已存在死消息,但是队列并不知情。这会影响队列统计数据的正确性,妨碍队列及时释放资源。

    消息的持久化

      默认情况下,队列和交换器在服务器重启后都会消失,消息当然也是。将队列和交换器的 durable 属性设为 true,缺省为 false,但是消息要持久化还不够,还需要将消息在发布前,将投递模式设置为 2。消息要持久化,必须要有持久化的队列、交换器和投递模式都为 2。

      消息属性的设置方法,包括如何将消息的持久化,参见代码 native 模块包 cn.enjoyedu.MsgDurable 

    应用程序的类型和版本号

     

    Request-Response 模式

      前面的模式中都是一方负责发送消息而另外一方负责处理。而我们实际中的很多应用相当于一种一应一答的过程,需要双方都能给对方发送消息。于是请求-应答的这种通信方式也很重要。它也应用的很普遍。

    在 RabbitMQ 中使用

     

  • 相关阅读:
    EasyTransaction主要源码分析
    编程哲理小故事:Tina的运动会方阵
    多维扩展点的思考与设计——解决渠道、产品增加引发的腐化问题
    分布式事务框架Seata及EasyTransaction架构的比对思考
    设计,架构,框架之间是什么关系?
    你知道如何画好一幅架构图么?
    学会分享痛苦
    建立你自己的博客
    使用正确的工具软件
    掌握主动权
  • 原文地址:https://www.cnblogs.com/Soy-technology/p/11610427.html
Copyright © 2020-2023  润新知