quartz+redis实现类似mq功能

quartz+redis实现类似mq功能
一. 项目中实际情况问题
在实际项目开发过程中,常常遇到一个完整流程需要多个上游服务和下游服务共同完成,
其中一些上游服务并不关心下游服务怎样实现,只关心下游是否成功接收消息。这就是常见的将上下游服务进行“逻辑解耦和物理解耦”。互联网中常使用mq来实现这个功能。
基于实际项目开发需求和经费等问题,使用quartz和redis队列来实现该功能。
二. quartz 定时器和redis队列介绍
quartz:是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。quartz允许开发人员根据时间间隔来调度作业。在模拟mq功能中,quartz充当定时监听的角色。
redis队列:redis队列本质上是一个双向链表,开发人员可以对链表进行各种操作。在模拟mq功能中,redis链表左边出队列,右边进队列。根据redis性质,可以保证一个队列里面的消息只被一个进程获得。
三. 项目中应用
1. 项目中实际应用场景(如图1)

                          图1

根据以上情况,将整个流程拆分为3部分,各个部分相互不干扰:
1) 第三方请求后存入发送消息队列,返回给第三方接收成功结果
2) 云平台从发送消息队列里面获取消息,并调用微信服务器发送消息。不论发送成功或者失败,将记录存入结果消息队列。
3) 云平台从结果消息队列拿出记录,向数据库存储记录。
2. 项目应用及配置
1) 定时器配置说明
定时器在该功能本质是定期创建线程从redis队列中获取发送消息记录,如果队列中有,则发送,发送完成后再次从redis中获取,直到发送完成。为了避免线程太少堆积大量消息,或者线程太多,消耗过多性能,因此配置定时器线程池,发送消息记录的定时器和保存记录的定时器公用一个线程池,根据实际情况占用线程池资源。
2) 主要实现

               图2 两个定时器公用一个线程池



               图3 开启concurrent,保证定时起线程
                              图3 redis队列中获取并发送

四. 使用心得
该实现是基于对消息和数据没有精确要求,可以接受数据少量丢失。如果对数据有精确要求还需要使用mq来完成。使用定时器和redis简单模拟mq,可以迅速响应第三方,合理运用线程。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值