发布时间:2017-07-18 09:49:33 文章来源:互联网
微博 微信 QQ空间
  我们这里举一个具体的场景来说一下倒排索引是如何应用到实时推送中的。

  比如一个App对在广东的男性用户进行一次推送,会经过一个这样通用的推送流程:一个推送的任务到达一个调度的节点,决定是否下发推送任务,如果下发,则会经过目标人群的检索,筛选出男且是广东的用户,接下来进行通道检索,信鸽这边既有自建的通道,也有厂商的通道,用户在推送的时候,他可能觉得厂商的通道更加稳定、更加高效,这个时候他可以选择对于华为设备走华为通道、小米设备就走小米通道,对于其它的设备就走信鸽自建的通道。
 
  下一步就是地域检索,信鸽这边的设备是就近接入的,我们在全国部署有这几个集群,分别是深圳集群、上海集群、天津集群和海外的HK集群。这里选择了广东的用户,所以选择深圳集群。
 
  对于一个传统的系统来说,一次推送可以这样实现,一个应用下的N个用户的推送,转换成N次RPC节点间调用,人群信息、通道信息、地域信息分别保存在Mysql或者Nosql数据库中,每个RPC调用,需要到数据库里面检查一下他是否是男的,是否是广东的用户,再看一下是不是华为的设备或者小米的设备,判定完之后要进行地域的检索,看看接入的是哪个集群。整个流程下来之后,要经过大量的数据库操作,才能完成一次推送。
 
  但是经过倒排索引的构建之后,所有的数据都可以放到内存中。比如男性人群,可以构建一个bitmap,小米的通道也是一个bitmap原文www.yinhang123.net,华为的通道也是一个bitmap,不同的地域分别是不同的bitmap。当一次任务下发的时候www.yinhang123.net,对bitmap进行一些&操作,就可以把最终需要推送的人群下发到相应的接入机中,整个过程可以做到ms级别。
 
  对于推送下发整个流程,检索是一方面,另一方面还需要查询路由信息找到终端TCP长连接的接入机,这些路由信息包含接入机的编号、进程的编号、长连接socket fd的编号,用一个long数据类型即可保存,所有的路由信息保存在分布式的Nosql内存数据库中,整个推送流程只有接入机的路由需要进行数据库的查询,结合本地的缓存,可以做到kw/s的推送下发速度。

另一视角

换一换