rabbitmq 延时消息,rabbit 延迟队列

  rabbitmq 延时消息,rabbit 延迟队列

  00-1010一、前言1。实施原则2。元件选择2。方案设计(1)服务器(2)生产者(3)消费者(SpringBoot的实现(1)生产者(2)消费者(3)通用工具包

  00-1010延迟任务应用广泛,延迟任务的典型应用场景包括订单超时自动取消;支付回拨重试。其中,超时取消订单具有幂等属性,无需考虑重复消费的问题。支付回拨重试需要考虑重复消费的问题。

  延期任务有以下特点:将在未来某个时间点执行;一般只有一次。

  00-1010生产者将带有延迟信息的消息发送到RabbitMQ交换机,等待延迟时间结束,将消息转发到绑定队列。消费者通过监控队列来使用消息。延迟任务的关键是消息留在交换机中。

  很明显,基于RabbitMQ的延迟任务的实现对服务器的可靠性要求很高,交换机中没有消息的持久化机制,比如单机模式服务的重启,没有启动的延迟任务全部丢失。

  

目录

 

  

一、序言

 

  

1、实现原理

RabbitMQ服务需要x-delayed-message插件来处理延迟消息。

 

  00-1010延迟任务的实现需要生产者将消息可靠地传递给交换机,所以使用确认机制就足够了。

  订单生成后,先放入仓库,然后将订单明细以订单ID为键存储在Redis (persisted)中,并向RabbitMQ发送异步确认请求。如果收到正常发货退货,Redis中带有order ID key的数据将被删除,内存将被回收;否则,将从Redis中查询订单数据并再次发送。

  00-1010延迟任务的实现要求消费者以不丢失信息的方式消费消息,具体体现在:手动确认消息的消费,防止消息丢失;消费端持续稳定,防止消息堆积;有一个消息消费失败的重试机制。

  考虑到订单延迟取消是幂等运算,所以不需要考虑消息的重复消耗。

  00-1010的实现部分只贴了一部分核心源代码。请访问GitHub了解完整的项目。

  00-1010考虑到下单是一个极其重要的操作,应该先把订单放在仓库里入库,再进行后续的操作。

  for(long I=1;i=10I) {/* 1。模拟订单生成*/b order order=create order(I);/* 2.订单入库*/orderservice . remove byid(order);orderservice . saveourupdate(order);/* 3.将订单存入信息redis */redistutils . set object(rabbittemplateconfig . order _ prefix I,order);/* 4.将消息异步发布到rabbit MQ */rabbit template . convertandsend(rabbit MQ config . delay _ exchange _ name,rabbitmqconfig.delay _ key,order,RabbitUtils.setDelay(30000),rabbit utils . correlation data(order . get orderid()));}生产者可靠地传递信息。

  public void confirm(correlation data correlation data,boolean ack,String cause){ if(correlation data==null){ return;} String key=ORDER _ PREFIX correlation data . getid();If (ack) {/*如果消息传递成功,删除Redis中的订单数据,回收内存*/Redis utils . delete object(key);} else {/*从Redis读取订单数据并重新post */BUORDER ORDER=Redis utils . getobject(key,BUORDER . class);/*重新发布消息*/rabbit template . convertandsend(rabbit MQ config . delay _ exchange _ name,rabbitmqconfig.delay _ key,order,rabbitutils.setdelay (30000),rabbit utils . correlation data(order . get orderid()));}}

  00-1010由消费者手动确认以避免消息丢失;自动重试失败。

  @ rabbit监听器(queues=rabbit MQ config .DELAY _ QUEUE _ NAME)public void consumer节点01(通道通道,消息消息,订购单)抛出io异常{ if(objects。等于(0,顺序。getorderstatus()){/*修改订单状态,设置为关闭状态*/订单服务。更新byid(新业务部门订单(订单。getorderid(),-1));渠道。基本确认(消息。getmessageproperties().getDeliveryTag(),false);log.info(String.format(消费者节点01消费编号为【%s】的消息,订单。get orderid()));}}消费者可靠消费应至少开启两个及以上应用,确保消息队列中不积压消息。

  

2、组件选型

上述代码涉及一个工具类兔子,存在于如下依赖中,主要封装兔子英语字母表中第十七个字母极常用的工具方法。

 

  依赖关系groupIdxin.altitude.cms/groupId artifactIducode-CMS-common/artifactId版本1 .4 .3 .1/版本/依赖关系以上就是兔子英语字母表中第十七个字母消息队列实现延迟任务示例的详细内容,更多关于兔子英语字母表中第十七个字母消息队列延迟任务的资料请关注盛行信息技术其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: