如何用Redis平衡海量信息推送的实效与体量

  • 时间:
  • 浏览:0
  • 来源:大发时时彩代理—大发大发彩票app

目前项目已上前线,运行平稳~

10(机器数)*5000(一次拉取数)=50000。如果 以MQ的形式把消息推送到消息中心,发MQ是异步的,算上其它处置0.5s。



最后当当我们 歌词 算一下整个集群的吞吐量:

下面当当我们 歌词 分析一下你你你这名 功能的业务情景:

架构很简单:当当我们 歌词 把用户的订阅推送记录存储到Redis集群的SortedSet队列上方,如果 以提醒用户提醒时间戳作为Score值,如果 在当当我们 歌词 个每业务Server上方起另一个定时器频率是秒级,我的设定可是1s,如果 经过负载均衡事先从某个队列上方获取要推送的用户记录进行推送。

首先当当我们 歌词 要定义定时任务集群要处置的另一个问題报告 :

方案3:定时任务集群

不多不多不多不多有传统定时任务可是太适合你你你这名 业务。

下面当当我们 歌词 分析以下你你你这名 架构:



ok~既然方案导致 有了,那怎样才能在一天时间内把你你你这名 方案落地呢?是的,我设计出你你你这名 方案到基本编码完成,时间可是一天,导致 时间太赶鸟……

然而最佳实践是队列数量应该是可动态配置化的,导致 线上的集群机器数是会时不时变的。大促的事先一般当当我们 歌词 会加机器,如果 业务量增长了,机器数也是会增加。不多不多不多不多有我是借用了淘宝的Diamond进行队列数的动态配置:

性能:除去效率等其它因素,基本与机器数成线性相关,机器数量不多吞吐量越大,机器数量少时相对的吞吐量就减少;

实效性:提高到了秒级,效果还可不需用接受;

单点故障?不居于的!除非Redis集群导致 所有Server全挂了……

推送的实效性的问題报告

你你你这名 相对来说就简单许多,用定时任务是去DB上方Load用户的订阅提醒记录,从中选出当前可不需用推送的记录。但有句话说得好任何脱离实际业务的设计后会耍流氓,下面当当我们 歌词 就分析一下传统的定时任务到底适不适合当当我们 歌词 的你你你这名 业务:

性能瓶颈。能够能够 一台机在处置,在大体量数据头上力不从心;

实效性差。定时任务的频率能够 太高,太高会给业务数据库造成很大的压力;

单点故障。万一跑的那台机挂了,那整个业务不可用了,这是另一个很可怕的事情。

当用户在领劵中心订阅了某个劵的领取提醒后,在后台就会生成一根用户的订阅提醒记录,上方记录了在哪个时间点给用户发送推送信息。不多不多不多不多有问題报告 就变成了系统怎样才能快速实时选出那此要推送的记录。

ok~ 到这里当当我们 歌词 整个定时任务集群就差不多基本落地好了。导致 你问我上方还有那此可不需用完善语录那可是:

推送的实效性:推送慢了,用户会抱怨那末及时通知当当我们 歌词 错过了开抢时机;

推送的体量大:爆款的神劵,人人都想抢。

加监控, 集群怎样才能可不需用木有监控呢,万一出问題报告 有任务堆积怎样才能办?

加在可视化界面;

最好有智能调度,增加任务优先级。优先级高的任务先运行嘛~

资源调度,万一机器数量居于问题,力不从心,优先保证重要任务执行。

下面是整个定时任务集群的架构图:

然而推送体量又会影响到推送的实效性。这果然另一个我就头疼的问題报告 ……那如果 当当我们 歌词 把问題报告 另一个个处置掉吧!

Redis可不需用作为另一个高性能的存储DB,性能要比MySQL好不多不多不多不多有,如果 支持持久化,稳定性好。

Redis SortedSet队列全天然支持以时间作为条件排序,完美满足当当我们 歌词 选出要推送的记录。

当当我们 歌词 每次从队列上方取多少条记录也是可不需用动态配置的 :

方案2:传统定时任务

首先当当我们 歌词 以user_Id作为Key,如果 Mod队列数Hash到Redis SortedSet队列上方。为那此要原先?导致 导致 用户同去订阅了两张劵如果 推送时间很近,原先的两条推送就可不需用合并成一根,如果 hash也相对均匀。下面是次要代码的截图:

如果 要决定队列的数量,一般正常来说当当我们 歌词 有多少台处置的服务器就定义多少条队列,导致 队列不多,会造成队列竞争,不多导致 会导致 记录得能够 及时处置。

其中另一个功能叫做领劵的订阅推送。那此是领劵的订阅推送?可是用户订阅了该劵的推送,在可领取前的一分钟就要把提醒信息推送到用户的App中。原先你你你这名 订阅功能应该是消息中心那边做的,如果 我不好你你你这名 短时间内做不了,不多不多不多不多有我就你你你这名 负责优惠劵的做了。具体方案可是到具体的推送时间点了,Coupon系统调用消息中心的推送接口,把信息推送出去。

公司目前注册用户50000W+,是哪家就全部都是可是打听了,比如有一张无门槛的优惠劵下单立减20元,那末抢这张劵的人就会比较多,当当我们 歌词 保守估计10W+,百万级别不好说。当当我们 歌词 初定为20W万人,那末这20W条推送信息要在一分钟推送完成,如果 另一个用户是可不需用订阅多张劵的。不多不多不多不多有当当我们 歌词 知道了你你你这名 订阅功能有另一个突出的难点:





MQ实在支持消息的延迟投递但尺度不多1s 5s 10s 500s 1m,用来做精确时间点投递不行。如果 用户执行订阅事先又撤除 订阅语录,要把发出去的MQ消息Delete掉你你你这名 操作有点头大,短时间内难以落地,如果 用户可不需用撤除 事先再订阅,这又涉及到去重的问題报告 ,不多不多不多不多有MQ的方案否掉。

实在发送20W的推送也可是十几s的事情。

为那此用Redis

实效性要高

吞吐量要大

服务要稳定,能够 有单点故障

这里解析一下为那此用Redis:

最后另一个关键组件可是负载均衡了。你你你这名 是非常重要的,导致 你你你这名 做得不好就会导致 导致 多台机竞争同去处置另一个队列,影响整个集群的效率。在时间很紧的情况下,我就用了另一个简单实用的利用Redis另一个自增Key如果 Mod队列数量算法。原先就很大程度上就保证不想有两台机器同去去竞争一根队列。

原先们是后会就束手无策了呢?实在后会的。当当我们 歌词 假若对传统的定时任务做另一个简单的改造,就可不需用把它变成可不需用同去多机跑,如果 实效性可不需用精确到秒级,同去拒绝单点故障的定时任务集群。这其中就要借助当当我们 歌词 的强大的Redis了。

方案1:MQ的延迟投递

原文发布时间为:2018-07-11

本文作者:浮云骑士LIN

本文来自云栖社区战略公司合作 伙伴“DBAplus社群”,了解相关信息可不需用关注“DBAplus社群”。



原先就可不需用随时根据实际的生产情况调整整个集群的吞吐量,不多不多不多不多有当当我们 歌词 的定时任务集群还具另一个特性可是支持动态调整。



前阵子开发了公司领劵中心的项目,你你你这名 项目是以Redis作为关键技术落地的。

综上所述,当当我们 歌词 就知道了一般传统的定时任务居于以下缺点: