2020.07.02
迭代启动前,项目组对某订阅推送功能指派我进行技术方案选型与设计。
业务场景
创建某活动后在活动开始前15分钟向所有报名此活动的用户手机推送一条通知。例如:创建某活动开始时间为2020.07.16 15:00:00,则在2020.07.16 14:45向所有报名参与此活动的用户推动一条活动即将开始的通知推送。
技术备选方案
方案一:延时队列
所有产品线消息队列使用的中间件均为RabbitMQ,RabbitMQ本身并不支持延时队列,若要实现延时队列需要借助死信队列交换器,实现原理大致如下图
后台创建活动时,生成一条过期时间为从当前时间到活动开始前15分钟 TTL的消息推入缓冲队列,待消息过期时通过死信队列再次消费,调用个推进行PUSH。
方案二:定时任务
使用Quartz定时任务框架结合数据库完成动态定时任务,创建活动时生成活动开始前15分钟的定时任务,到期直接进行推送。
方案三:redis定时轮询
使用rediszSet有序的特性,将活动开始时间向前推15分钟设定为元素的分数值,将活动id设置为元素值,zset中会根据分数值进行排