杭州网站推广优化公司,做网站赔了8万,做网站搞流量挂联盟广告变现,苏州建站模板展示RabbitMQ中是可以实现延迟消息的#xff0c;一般有两种方式#xff0c;分别是通过死信队列以及通过延迟消息插件来实现。 扩展#xff1a;
死信队列
当rabbitMQ中的一条正常的消息#xff0c;因为过了存活时间#xff08;TTL过期#xff09;#xff0c;队列长度超限一般有两种方式分别是通过死信队列以及通过延迟消息插件来实现。 扩展
死信队列
当rabbitMQ中的一条正常的消息因为过了存活时间TTL过期队列长度超限被消费者拒绝等原因无法被消费时就会变成Dead Message 即死信。
当一个消息变成死信之后他就能被重新发送到死信对列中其实是交换机-exchange。 那么基于这样的机制就可以实现延迟消息了。那就是我们给一个消息设定TTL 但是并不消费这个消息等他过期过期后就会进入到死信队列然后我们再监听死信队列的消息就行了。
而且rabbitMq中的这个ttl是可以设置任意时长的这相比于RocketMQ只支持一些固定的时长而显得更加灵活一些。
但是死信队列的实现方式存在一个问题那就是可能造成队头阻塞因为队列是先进先出的而且每次只会判断队头的消息是否过期那么如果队头的消息时间很长一直都不过期那么就会阻塞整个队列这时候即便排在他后面的消息过期了那么也会被一直阻塞。
基于RabbitMQ的死信队列可以实现延迟消息非常灵活的实现定时关单并且借助RabbitMQ的集群扩展性可以实现高可用以及处理大并发。他的缺点第一是可能存在消息阻塞的问题还有就是方案比较复杂不仅要依赖RabbitMQ而且还需要声明很多队列处理增加系统的复杂度 RabbitMQ插件
其实基于RabbitMQ的话可以不用死信队列也能实现延迟消息那就是基于 rabbitmq_delayed_message_exchange插件这种方案能够解决通过死信队列实现延迟消息出现的消息阻塞问题但是该插件从RabbitMQ的3.6.12开始支持的所以有对版本有要求。 这个插件是官方出的可以放心使用安装并启用这个插件之后就可以创建x-delayed-message类型的交换机了。
前面我们 提到的基于死信队列的方式是消息先回投递到一个正常队列在ttl过期后进入死信队列但是基于插件这种方式消息并不会立即进入队列而是先把他保存在一个基于erlang开发的mnesia数据库中然后通过一个定时器去查询需要被投递的消息再把他们投递到x-delayd-message交换机中。
基于rabbitmq插件的方式可以实现延迟消息并且不存在消息阻塞的问题但是因为是基于插件的而这个插件支持的最大延迟时间是2^32-1毫秒大约49天超过这个时间会被立即消费。
不过这个方案也有一定 限制它将延迟消息存在于mbesia表中并且在当前节点上具有单个磁盘副本存在丢失的问题。 目前该插件的当前设计并不真正适合包含大量延迟消息例如数十万或者百万的场景