首页 » 网站推广 » 友盟pushphp技巧_以友盟UPush为例深度解读消息推送的筛选架构解决筹划应用与实践

友盟pushphp技巧_以友盟UPush为例深度解读消息推送的筛选架构解决筹划应用与实践

访客 2024-11-04 0

扫一扫用手机浏览

文章目录 [+]

1. 业务背景

友盟+推送U-Push日均下发量百亿级,个中筛选任务日均数十万,筛选设备每分钟峰值可达7亿+,本文将分享友盟+技能架构团队在长期生产实践中沉淀的筛选架构办理方案。

友盟pushphp技巧_以友盟UPush为例深度解读消息推送的筛选架构解决筹划应用与实践

如何担保百亿级的下发量?

友盟pushphp技巧_以友盟UPush为例深度解读消息推送的筛选架构解决筹划应用与实践
(图片来自网络侵删)

友盟+U-Push筛选是Push产品的核心功能,个中实时筛选是面向推送哀求较高的付费Pro用户供应的核心能力之一,实现了用户实时打标、筛选、分发、触达的功能。
友盟+U-Push的设备识别以device_token为基准,为担保尽可能的触达我们留存了近期所有可能触达客户的device_token,以10亿真实设备为例,每个设备安装10个集成友盟+SDK的运用可以产生10个device_token,牵扯到硬件环境变动导致的device_token漂移问题,可能产生更多device_token。

( 图1.1.1 友盟+U-Push业务数据流简图)

图1.1.2 友盟+U-Push功能清单

2. U-Push筛选架构概览

2.1 高下行两个核心链路

U-Push做事由两个关键链路组成,下行链路担保客户的触达,上行链路承载终端采数和与客户做事真个数据同步。
个中下行链路紧张分为任务调度、筛选中央,上行链路紧张做事是多种收数通道(为兼容历史问题)和设备中央,上行通过设备中央实现跟下行桥接。

图2.1.1 友盟+U-Push筛选业务场景

在U-Push做事中,依照业务场景不同定义了多种任务类型,个中除单播、列播直接下发外组播、广播、自定义播、自定义文件播均须要通过筛选做事处理后才可实行下发,下行链路中(如图2.1.2)优先级最高是的任务受理和任务发送流程(赤色链路),即无论发生什么情形都要担保客户的精确下发,是U-Push做事稳定性的底线。
出于融灾考虑,筛选做事在架构上与主链路解耦。

图2.1.2 筛选和核心链路隔离

2.2 数据架构目标和设计

提到筛选,实在质是通过建立合理的标签索引系统实现数据的快速定位。
筛选的目标是U-Push核心设备库,但是为避免筛选要求影响到核心库稳定须要将待筛选凑集分库冗余存储,与一样平常OLAP,OLTP场景不同,U-Push筛选的运用处景更加苛刻。

1. 不俗的在线任务并发能力

筛选实质还是在线场景,具有一定的并发能力,并发压力紧张在于压榨系统IO上,通过合理的中间件利用、严谨的做事调度、针对性场景的差异化设计降落单次筛选的实行韶光,提高并发。

2. 实时海量数据剖析和传输能力

筛选供应了多种剖析维度(图2.2.2),支持灵巧的语法组合。
筛选做事不仅要知足对海量数据的实时查询剖析,还要支持对单次可能破亿的结果集做低本钱传输。

图2.2.2 筛选支持的字段类型

3. 本钱可控

统统问题都是本钱问题,从行业看全民上云后做事架构的本钱问题更是备受关注,尤其在友盟+弘大的业务量下本钱问题更加主要。

4. 为下贱任务并行发送创造条件

友盟+U-Push的发送层集群用于大量的发送节点,最空想的设计便是在任务筛选阶段即完成数据切片、分发、调度,下贱直接并行发送以达到最高效率。

U-Push筛选在持续的技能迭代中,和多领域专业团队深度互助,充分利用不同组件的特性,通过整合Tair、AnalyticDB for MySQL(ADS)、OSS、MaxCompute(ODPS)、Lindorm、HBase、SchedulerX等产出了一套兼顾稳定、性能、和本钱的均衡办理方案。

筛选分为离线和实时两部分,离线通过ODPS天生设备主库快照,导入ADS。
实时通过消费数据上行做事的设备信息更新事宜,实时更新ADS或者RDB库。
在实行筛选时候,对付较大结果集通过upload或者dump到OSS的办法输出多个小文件,传输给发送链路下贱实行并行发送。

图2.2.4 筛选做事数据流向

上述业务链路和数据构造先容了筛选目前的整体设计,但是要搪塞繁芜的客情和多变的业务场景还须要做更多细节设计。

3. 设计细节

3.1 筛选库的场景设计

从上面的概览可以看出,筛选架构中的紧张抵牾便是下行链路中海量数据的读和上行链路中设备属性更新的高频写的抵牾,办理这个抵牾须要大量的资源来担保数据同等性和性能,在常规的设计思路中在目前的本钱资源下险些是不可行。
大数据三大宝,冷热分离分库分表,通过业务剖析调研,U-Push将业务分成多少场景,基于客户的不同生命周期的业务诉求和做事能力将客户指向不同场景,只管即便优化客户体验。

图3.1.1 筛选库的场景设计

组播和广播筛选我们紧张环绕ADS来培植,ADS供应了实时和离线两种更新办法,在产品形态上只对Pro客户开放实时筛选能力,在架构设计上通过分库的办法隔离不同层客户的数据,供应差异化做事,提高稳定性。

离线部分:通过离线主库担保了所有客户的T+1筛选能力。
在实际业务中离线主库只有读要求作为所有极度场景下的兜底,离线主库以device_token分区,可以实现完备打散但是聚合查询的时候性能稍差。
为了提高部分客户尤其是新客户的体验我们设计了新客户离线库,修正为客户分区,提高了单客户聚合查询的效率。
但是新客户离线库因客户间的规模差异随意马虎引发分区倾斜,生产中这个表须要持续关注,及时清理和转移,否则在跑ads_loader的时候可能破线。

图3.1.2 离线主库的分区状态

图3.1.3 以客户为分区的分区倾斜情形

实时部分:担保实时筛选做事体验是全体系统的重点,将实时筛选再细分为VIP实时库、测试设备库(方便客户接入阶段实时获取测试效果)、新客户实时库(新增客户一样平常设备量很小,U-Push会免费供应一段韶光的实时筛选做事)。
与离线分区类似,在分区设计上同样对大规模场景数据和较少规模场景的数据分表,特殊的测试设备库可能产生大量脏数据,整体隔离出来。

图3.1.2 客户场景迁移

新客户接入伊始基于客户规模区分,在不同的生命周期节点会被引入特定的场景,在担保大盘能力的条件下只管即便输出更优质的客户体验。

3.2 利用OSS传输和切分文件

在上述设计中通过离线和实时的区分,降落了高频写可能对设备库造成的影响。
但是始终绕不过海量数据的传输问题,为规避这个问题U-Push采取差异化的设计思路,以结果集规模做区分,对大结果集直接通过ADS dump到OSS,基于不同客户的并行度做远程切分,在OSS完成upload和split操作后返回文件路径凑集,后续链路只保留文件路径集,直至进入发送层实行并行发送。
对小结果集通过select拉取到内存整合报文传输,后续链路直接发送设备ID。
通过OSS做中间存储,极大的降落冗余的IO损耗。

ADS3.0由于整体架构改动改为通过外部表的办法dump到OSS,与2.0可以dump出单个文件不同3.0在dump后会产生一系列小文件直接导致原有的方案不可行,在通过和ADS团队沟通后ADS特地在3.0版本完善了dump单个文件的功能,致谢ADS的同学。

图3.2.1 筛选查询中的性能瓶颈风险

3.3 查询缓存和预筛选

谈到查询场景,一定会有缓存的一席之地,与一样平常设计思路不同,U-Push直接放弃了针对实时筛选能力的查询缓存,由于在这样的设备量级下随时的设备更新是一定。
U-Push的实时筛选库是一个高频写低频读的场景,但是对单次读的哀求比较苛刻,首先对未开启实时功能的离线客户,由于设备库是快照形式,一天内的多次读拿到的结果一定相同这时候设置缓存就很故意义,比如新闻、气候、工具类客户的习气,一天内发送多次广播,就不必每次再去重新天生筛选集文件。

图3.3.1 查询缓存逻辑流程图

预筛选功能的开拓是个小插曲,前面讲到U-Push放弃了对实时的查询缓存,导致客户的每次发送都要重新去天生文件,在担保数据实时性的角度考虑无可非议,但是碰着“较真”的客户就很有压力。
比如新闻类客户极度关注下发的时效性,通过开拓者掌握台可以查看每个任务的筛选韶光,有时候同类2s的差异也会引发客户在DING群的\"大众客诉\"大众。
客户的诉求可以理解但是这也耗费了团队大量的精力。
通过和个别客户沟通U-Push开拓了预筛选功能,在客户习气性发送的前一段韶光预先调度实行筛选逻辑天生设备ID凑集,通过丢失少量的数据时效性来压缩下发韶光,争取发送速率。

图3.3.1 友盟+U-Push轨迹

3.4 Alias筛选的优化

筛选要求可以归类为两种场景:

Alias功能依赖的ID Mapping场景,NvN的设备ID和Alias映射。
tag组播和iOS广播功能的select场景,条件查询,基于ADS实现。

Alias功能简介:Alias许可开拓者为设备绑定别名,别名由alias_type,alias两个属性组成,譬如开拓者可以标识设备A,为他增加alias_type=telephone_number, alias=13900000000以此来给设备A增加手机号的属性。
在发送时候可以绕开device_token,直接通过做事端指定alias实现触达,alias是一个范例的NVN ID Mapping场景,一个设备在同一个alias_type下面同时只能拥有一个alias。
这也是符合一样平常业务场景的,比如上例一样平常一个设备只有一个手机号,设置新手机号后会覆盖原alias。
如果须要知足双卡双待的功能,须要设置两个alias_type,即alias_type=telephone_number_main,alias_type=telephone_number_secondary。
alias的一样平常利用场景是开拓者通过自定义文件播上传一批文件,文件内容为某个alias_type下多少设备alias的凑集(百千万万级)。
筛选做事扫描文件后依次找出alias值mapping的device_token。

3.4.1 Alias的早期设计

说到Mapping,轮询,高吞吐查询,首当其冲选Redis,早期的U-Push也是如此。

图3.5.1 alias早期数据构造设计

alias利用Redis的Set和Hash构造实现正查和反差的功能,为什么反差用hash,前面讲到1个设备在1个alias_type下只保存最新的alias。
这也是出于保护用户的目的,如果1个设备同时存在多个alias下,在开拓者实行圈选的时候可能会多次选出这个设备造成多次无效触达。

这个设计平淡无奇,的确也可以知足绝大部分客户的筛选场景,但是随着业务量的增加有几个问题逐渐暴露

轮询成为海量设备查询的瓶颈,且不可打破。
Redis数据持久化难的问题凸显,数据剖析难上加难。
Alias无法很好的知够数据返还链路的需求。

3.4.2 研究Alias的解法

分库的确是很好的思路但是仍旧无法知足性能问题和持久化问题,而且随着行业对大数据的关注,数据返还也成为更多开拓者的诉求。
打通数据返还链路做好客户数据的存、取、管、用已经是一个主要的行业方向。
为理解决这个问题U-Push通过离线和实时相结合制订方法

分库,增加KA级别客户独享库,压缩横向扩容空间。
分层,基于Lindorm做持久化分层存储。
离线留存,通过日志系统留存下行筛选结果,一方面完善统计需求,一方面通过回执返还客户。

3.4.3 基于Lindorm宽表的分层设计

用宽表代替Redis的Set设计做正查,用普通表基于设备ID的联合主键做反查,在查询时候通过将单次轮询改为多次mget只管即便压缩IO损耗探求相应性能和做事稳定的中间值,Lindorm的磁盘存储可以知足业务需求的同时通过exporter的配置实现lindorm数据T+1同步至ODPS。

图3.5.2 基于Lindorm款表的分层设计

3.4.4 数据迁移的考试测验和思考

数据迁移是在很多业务架构中都是痛中之痛,如何担保稳定、平滑、安全的迁移须要付出大量的本钱。
U-Push在Alias的数据迁移中做了多种方案的研究和思考。

Tair整体dump迁移,dump方案理论上可行但是有较大的业务风险,出于稳定性的考虑放弃。
写要求增量更新,通过客户的写要求逐key迁移,会有漫长的灰度韶光,且无法实行彻底清理,胜在稳定性强。
扫描设备主库,分客户批次灰度迁移。
在U-Push的功能中,供应了appkey下alias_type的功能,客户可以在开拓者掌握台查询appkey下的alias_type列表,为实现这个功能对appkey和alias_type做了凑集索引,这个索引成为数据迁移的关键。
通过扫描设备库获取appkey和device_token,结合alias_type去反查库查找alias,再拿appkey+alias_type+alias去正查库查询device_token列表完成迁移。

第三种方法可以实现存量数据的完美迁移,对线上做事险些没影响,但是在百亿级设备下,以1wTPS打算仍旧须要10天的韶光,好在该方案可以实现单个客户的灰度与回滚。

5. 结语

U-Push筛选做事只是U-Push浩瀚做事中的一环,在友盟+巨大的业务量下,为知足形形色色的各行业需求输出了大量精细的设计,本文列出的只是冰山一角,日均下发量百亿级做到游刃有余离不开其他技能架构团队在筛选做事迭代中的共同协作。

目前U-Push已经以Push通道为根本,整合了微信、短信、隐私短信升级为多通道触达做事,为浩瀚有名的App如:今日头条、澎湃新闻、作业帮、易车等供应了触达能力,后续持续接入支付宝小程序、头条号等更多运营场景通道,持续为客户供应稳定、高性能、低本钱的触达能力担保。

友盟+,海内领先的第三方全域数据智能做事商,截至2020年6月已累计为200万移动运用和890万家网站供应十年的专业数据做事。

标签:

相关文章

Python编程从入门到精通,探索编程之美

编程已经成为现代社会的一项基本技能。Python作为一种简单易学、功能强大的编程语言,在我国教育领域备受关注。本文将从Python...

网站推广 2025-03-02 阅读1 评论0

Scum07代码编程之美与适用方法

编程已成为当今社会不可或缺的技能之一。Scum07代码作为一款经典的编程语言,在我国众多程序员中备受推崇。本文将深入解析Scum0...

网站推广 2025-03-02 阅读1 评论0

Linux环境下的前端代码运行优化与步骤

前端技术逐渐成为软件开发的核心。Linux操作系统因其稳定性、安全性、开放性等特点,成为众多开发者和企业青睐的运行环境。本文将从L...

网站推广 2025-03-02 阅读1 评论0