想找人做网站,湖北网络推广有限公司,长治专业做网站,做一个小程序需要多少钱?前言
延时任务是我们在项目开发中经常遇到的场景#xff0c;例如订单超时30分钟自动取消#xff0c;邮件5分钟后通知等等#xff0c;对于这样的应用场景#xff0c;我们又该如何应对呢#xff0c;尤其是在微服务环境下#xff0c;如何保证我们的延迟任务并发问题以及数据…前言
延时任务是我们在项目开发中经常遇到的场景例如订单超时30分钟自动取消邮件5分钟后通知等等对于这样的应用场景我们又该如何应对呢尤其是在微服务环境下如何保证我们的延迟任务并发问题以及数据安全等等问题。本节内容作者会根据以往的项目开发经验介绍几种延时任务的实现方案。
正文
方案一定时任务db数据库 - 方案说明以订单30分钟超时支付取消订单为例用户下单后在db数据库记录订单的下单时间,开启一个定时轮询任务比如每5分钟扫描一次数据库的数据查询下单时间加上30分钟小于当前时间并且还未支付的订单数据根据查询结果将查询到的数据做关单的处理。 - 需要注意的问题如果是微服务项目要使用分布式任务xxl-job等中间件实现定时任务如果使用的springtask等要加分布式锁避免任务在多个服务上重复执行任务执行失败最好有重试机制保证成功率。 - 优缺点优点是实现简单基本不用引入第三方的中间件。缺点是性能低下耗费系统资源没有用来处理的业务数据定时任务会空跑。 方案二使用MQ消息中间件 - 方案说明使用MQ消息中间件实现目前已知的支持延时任务的消息中间件有rabbitmq、rocketmq等其底层基本都是通过延时队列实现。需要注意的是rabbitmq的延迟队列需要安装插件支持rocketmq只支持固定时间等级的延迟任务。只要将延迟消息发送到mq消息中间件中开启客户端的监听监听延迟队列的消息从而消费消息。 - 需要注意的问题增加消息中间件会增加系统的复杂度同时要保证消息中间件的高可用。 - 优缺点天然支持高并发性能好实现了业务解耦。缺点是增加了系统的复杂性。 方案三使用redis实现 - 方式一使用redis的key过期监听机制 ①实现原理通过开启redis的key过期监听机制在redis配置文件中设置notify-keyspace-events Ex开启key过期的事件监听机制当key过期后会通过发布订阅机制发布key过期的消息客户端通过继承实现KeyExpirationEventMessageListener监听器实现key过期的消息监听。 ②实现方案使用redis的String数据类型以订单id为key并设置过期时间当key过期后通过监听到key的过期事件然后在处理具体的业务数据。 ③问题官方不推荐使用安全级别低可能会存在数据丢失的问题。 - 方式二使用zset数据结构实现 ①实现方案使用redis的zset数据结构以订单id为keyscore的值为定单过期的时间戳通过定时任务查询前n条数据如果数据过期则处理对应的关单业务并将处理后的key删除。 ②优缺点读取缓存数据性能优秀虽然也存在资源的浪费。增加了系统的复杂性。 - 方式三使用redisson的延迟队列实现 ①通过redisson的延迟队列RDelayedQueue实现其底层也主要是通过redis的zset数据结构加redis的订阅发布机制实现集成更加方便使用简单是redis方式实现延迟队列的最佳实践。 结语
具体使用哪种方案要根据项目的实际情况而定。关于方案的具体实现请持续关注作者的更新内容关注我不迷路。本节内容到这里就结束了我们下期见。。。。。。