java延时队列解决方案,java延时调用方法

  java延时队列解决方案,java延时调用方法

  00-1010前言数据库轮询原理优缺点Java延迟队列Reids监控失败键创建一个监控类实现MessageListener接口RocketMq延迟消息摘要。

  在00-1010项目中经常会遇到以下要求:

  如果30分钟没有付款,订单将自动取消。支付成功后,一分钟后会给用户发送短信提醒用户评价。…为了满足延迟任务的要求,我们可以采用以下解决方案:

  

目录

 

  00-1010定时扫描一个线程当天创建的订单的数据库,根据订单的创建时间判断订单是否超时,更新超时订单。该技术通过将Spring Boot与石英相结合来实现,具体实现可以参考上一篇文章。

  00-1010优点:

  这个方案很简单,quartz也支持集群操作。

  缺点:

  系统有大量的订单数据,每隔几分钟对数据库进行一次轮询,会消耗服务器和数据库大量的内存。有延迟。即使每1分钟扫描一次数据库,也会有1分钟的延迟。

  00-1010原则

  它是由JDK自己的DelayQueue实现的,这是一个无界的阻塞队列。只有当延迟到期时,队列才能从中获取元素,并将其放入DelayQueue中的对象。技术只能使用JDK的DelayQueue进行相关操作。

  优点和缺点

  优势:

  该方案基于内存操作,具有较高的效率和较低的任务触发时延。

  缺点:

  队列中的消息都存储在内存中,一旦服务器重启,所有的数据都会消失,无法展开进行聚类。由于本机内存有限,一旦订单数据过大,很容易出现OOM异常。

  00-1010原则

  该方案使用Redis的Keyspace通知,并使用key failure提供的回调机制处理相关业务实现。

  实现技术

  基于reids方案,实现了MessageListener接口。

  实施步骤

  修改Redis配置文件并打开redis.conf文件。搜索“notify-keyspace-events”以找到原始的notify-Keyspace-events ,并将其修改为“notify-keyspace-events Ex”。到目前为止,Redis支持对关键过期事件的监控。

  

前言

@Componentpublic类RedisKeyExpirationListener实现message listener { private static final Logger Logger=Logger factory . get Logger(RedisKeyExpirationListener . class);public static final String KEY _ PREX= test :3360 order : queue ;@ Override public void on Message(Message Message,byte[]pattern){ try { String expired key=Message . tostring();//判断是否(按键!expired KEY . contains(KEY _ PREX)){ return;}//满足条件处理具体业务逻辑} catch(exception one){ logger . error( failure event fails ,e);}}}优点和缺点

 

  优势:

  基于Redis的实现很简单。

  缺点:

  当客户端断开连接并重新连接时,所有事件都将丢失。在高并发场景下,存在大量的失效关键场景,会导致失效时间的延迟。该方案用于业务量小、可靠性要求低的场景。

  00-1010实施原则

  基于RocketMQ设置消息级别,发送延迟的消息。RocketMQ延迟消息将临时存储在名为SCHEDULE_TOPIC_XXXX的主题中,并根据延迟级别存储在特定的队列中。queue ID=delay time level1,即只有具有相同延迟的消息存储在一个队列中,以便具有相同传输延迟的消息可以被顺序消耗。代理将按照预定的方式使用SCHEDULE_TOPIC_XXXX,并将消息写入真正的主题。具体步骤如下:

  修改消息的主题名称和队列信息,将消息转发到延迟主题SCHEDULE_TOPIC_XXXX的CosumeQueue,延迟服务消费SCHEDULE_TOPIC_XXXX消息,在CommitLog中重新存储信息,将消息投递到目标主题,消费目标主题中的数据。/* * *发送延迟消息* @ param topic * @ param msg */public void senddelaymessage(string topic,object msg){ messagemsgmessage=new message();//设置消息级别msg message . setdelaytimelevel(2);rocket MQ template . convertandsend(topic,msg);}注意:RocketMQ延迟消息的延迟长度不支持任何延迟长度,延迟长度由特定的延迟级别指定。默认情况下,支持18级延迟消息,延迟级别在RocketMQ服务器的MessageStoreConfig类的以下变量中定义:

  例如,如果指定的延迟级别为2,则意味着延迟持续时间为5s,即延迟级别从1开始计数。

  优点和缺点

  优势:

  支持高并发场景消息处理。

  缺点:

  引入额外的消息队列来增加项目的维护性和复杂性。支持固定持续时间的消息延迟,并且需要针对任何消息延迟进行扩展。

  00-1010本文解释了处理延迟任务的几种解决方案及其相关的优缺点,并针对不同的业务场景选择合适的解决方案。有关Java延迟任务的更多信息,请搜索以前关于普及它的文章,或者继续浏览下面的相关文章。我希望你能支持在未来盛行它!

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

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