
来自:架构之美
1.业务场景剖析
公司业务系统(比如:电商系统)中有大量涉及定时任务的业务场景,例如:实现买卖双方在线沟通的IM系统,为了确保接收方能够收到消息,服务端一般都会有重试策略,即服务端在消息发出的一段时间内,如果没收到接收方的确认信息,则重新发送消息。这就是一个典型的定时任务场景—消息发出等待固定的时间后,触发消息重发逻辑,重发逻辑首先判断所发消息是否收到确认信息,如果没有就将对应的消息再发送一次。类似的场景有很多,例如:自动取消长时间未支付的订单、买家收货一段时间以后自动确认打款等等。
应对上述场景比较粗暴的解决方案是定时扫库,例如:业务将订单的支付超时时间定义为2小时。可以每1分钟扫一次订单库,将超时订单取消。显然,此方案不够优雅,主要问题如下:
1.增加数据库读压力;
2.不够精确,会有最长1分钟的滞后;
扫库的方案一般体量不大时可以使用,当业务发展到一定规模后就不再适用。对IM消息重发秒级别的定时需求,只能增加扫库的频率,但过于频繁的扫库很可能会将数据库拖垮。显然需要更优雅的技术方案解决定时任务问题。
2.时间轮算法剖析
2.时间轮算法剖析
图1 时间轮算法
图2 时间轮
3.基于Redis实现时间轮
3.基于Redis实现时间轮
图3 Redis实现时间轮
4.长时间跨度定时需求实现
4.长时间跨度定时需求实现
图4 长时间跨度定时需求实现方案
5.延时服务中台化
5.延时服务中台化

图6 消息队列解耦
6.延时消息
6.延时消息
7.改造MQ实现延时消息
7.改造MQ实现延时消息
图7 RocketMQ消息存储模型
8.思考
9.总结
针对同一业务需求,会有多种技术方案,单从技术角度看很容易判断出方案的好坏,但我们看问题需要多角度和多维度,不能只关注于方案本身,从上面延时消息实现来看,最优雅的方案同时也是最复杂、实现难度最大方案。反之,借助外部组件可以用较低的投入实现同样的使用效果,虽然有缺陷,但对业务来说感受不到差别,所以我们选择技术方案时不一定要过于追求完美,要结合公司实际情况和团队技术实力,计算投入产出比(ROI),作出合理选择。
架构师最核心的能力是根据场景给出优雅的解决方案,适合就是最好的,既不保守设计又不过度设计。NX的架构师,是把复杂问题简单化,简单问题做没;SB(SomeBody)的架构师,刚好相反,是把简单问题复杂化,复杂问题搞不定!
希望您是一个NX的架构师!那么问题来了,做一个NX的架构师,需要具备哪些思维方式?欢迎留言交流。
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼
如有收获,点个在看,诚挚感谢

