领券中心项目,我是如何用 Redis 做实时订阅推送的?( 二 )


首先我们以user_id作为key,然后mod队列数hash到redis SortedSet队列里面 。为什么要这样呢,因为如果用户同时订阅了两张劵并且推送时间很近,这样的两条推送就可以合并成一条~,并且这样hash也相对均匀 。下面是部分代码的截图:

领券中心项目,我是如何用 Redis 做实时订阅推送的?

文章插图
 
然后要决定队列的数量,一般正常来说我们有多少台处理的服务器就定义多少条队列 。因为队列太少,会造成队列竞争,太多可能会导致记录得不到及时处理 。
然而最佳实践是队列数量应该是可动态配置化的,因为线上的集群机器数是会经常变的 。大促的时候我们会加机器是不是,并且业务量增长了,机器数也是会增加是不是~ 。所以我是借用了淘宝的diamond进行队列数的动态配置 。
领券中心项目,我是如何用 Redis 做实时订阅推送的?

文章插图
 
我们每次从队列里面取多少条记录也是可以动态配置的
领券中心项目,我是如何用 Redis 做实时订阅推送的?

文章插图
 
这样就可以随时根据实际的生产情况调整整个集群的吞吐量~ 。所以我们的定时任务集群还是具有一个特性就是支持动态调整~ 。
最后一个关键组件就是负载均衡了 。这个是非常重要的!因为这个做得不好就会可能导致多台机竞争同时处理一个队列,影响整个集群的效率!
在时间很紧的情况下我就用了一个简单实用的利用redis一个自增key 然后 mod 队列数量算法 。这样就很大程度上就保证不会有两台机器同时去竞争一条队列~ 。
领券中心项目,我是如何用 Redis 做实时订阅推送的?

文章插图
 
最后我们算一下整个集群的吞吐量


推荐阅读