参考资料

在自动删除队列之前,队列可以闲置多长时间(How long a queue can be unused for before it is automatically deleted)
定义了队列自动过期的时间。
参数格式 “x-expires”:number
如果队列在指定的时间段内未被使用,则该队列将被自动删除。
这可以确保不再需要的队列不会一直存在于RabbitMQ服务器上,从而占据资源。
两者配合可以指定DLX发送的交换机和键,之前已经研究过就不做赘述了
Max length参数用于限制队列中消息的最大数量。当队列中的消息数达到最大值时,新的消息将被拒绝并返回给发布者。
Max length bytes参数用于限制队列中消息的最大总大小(磁盘空间。当队列中所有消息的大小总和达到最大值时,新的消息将被拒绝并返回给发布者。
这两个参数可以用于控制队列的大小,以避免队列过度增长导致系统资源耗尽。在设置这些参数时,需要根据具体的业务需求和系统资源情况进行权衡和调整。
注意,Max length bytes的单位是byte。比如要设置1G的最大磁盘空间
'x-max-length-bytes': 1073741824
用于延迟队列的内存分配,从而减少内存的使用量。
在Lazy mode下,队列的消息不会立即被写入磁盘,而是先被存储在内存中,直到内存达到一定的阈值时才会被写入磁盘。
默认情况下,消息会一直存在内存中,占用过多内存可能会导致运行过慢、消息丢失、系统崩溃等问题
使用Lazy mode可以在一定程度上降低队列的内存使用量,提高系统的性能和可扩展性。
然而,由于消息需要等待一定时间才能被写入磁盘,因此在使用Lazy mode时需要注意消息的持久化和数据丢失的风险。如果需要确保消息不会丢失,需要将消息设置为持久化,并且在队列中启用持久化模式。
参数配置格式 “x-queue-mode” : “lazy”
用于集群,暂不涉及
RabbitMQ的Master locator用于在集群中查找当前拥有某个队列的主节点(Master Node)。在RabbitMQ集群中,一个队列可以被复制到多个节点上,其中一个节点被指定为主节点,其他节点为从节点。主节点负责处理所有的读写请求,而从节点只负责复制主节点上的数据。
消息的可靠性投递是指在消息传递过程中,确保消息能够被成功地传递到目标节点并被消费者正确地处理。
在消息传递中,可能会发生网络故障、节点宕机等问题,这些问题可能会导致消息丢失或重复传递,从而影响系统的可靠性和稳定性。
注意
消息的可靠性投递就是要保证消息投递过程中每一个环节都要成功,那么这肯定会牺牲些性能,性能与可靠性是无法兼得的
如果业务实时一致性要求不是特别高的场景,可以牺牲一些可靠性来换取性能。
消息的传递模型如下

对应第一步的生产者到交换机的这一步,确保消息成功发送到交换机
对应的是交换机到队列这一步,确保消息成功从交换机发送到队列中
当然在实际生产环境下,我们不会出现这种问题,必须对所有的name和key进行严格测试才能上线(很少有这种问题 ) ;
交换机和队列的持久化机制,保证服务器故障或重启后,消息仍然存在
启动手动确认模式,前面有提到。
只有当消费者确保业务运行成功后,再确认接受消息。
同一个消息,第一次接收,正常处理业务;
如果同一个消息,第二次接收,那就不能再处理了,否则就重复处理了。
概念:对一个资源,无论请求一次还是多次,该数据本身造成的影响应该是相同的,不能因为重复的请求而造成资源重复造成影响。
(个人理解:有点类似数据库的一致性
接口幂等性是指:一个接口用同样的参数反复调用,不会造成业务错误,那么这个接口就是具有幂等性的;
这些接口必须要要做幂等设计:
问:sql语句中哪些语句是非幂等的?
所以需要对insert的进行幂等操作,比如数据库自带的约束。或者在插入前进行查询,避免重复插入。
当生产者发送消息时,设置一个全局唯一的messageId,消费者拿到消息后,使用redis的setnx指令存储messageId,如果存储成功(返回为1)说明消息还为被处理,如果返回为0,则说明已经被处理过了。
关于SETNX
SETNX 指令常用于实现分布式锁的场景,通过尝试设置一个特定的键来获取锁,如果设置成功则表示获取到了锁,否则表示锁已经被其他客户端持有。
SETNX key value
- 1
当执行 SETNX 指令时,会按照以下步骤进行处理:
- 如果键 key 不存在,则设置键 key 的值为 value。
- 如果键 key 已经存在,则不进行任何操作,返回 0。
- 如果设置成功,则返回 1。
redis
项目依赖新增:
spring-boot-starter-redis
生产者:
消费者:
spring.rabbitmq.listener.simple.acknowledge-mode = manual代码略