一、消息推送是什么消息推送常常在APP运营过程中,作为提高活跃,增加用户粘性的利器被广泛使用。产运的同学更希望可以看到每场推送活动后的实际统计数据。例如推送的时效性,渠道的推送成功率,到达率和用户的点击率。对于海量推送数据的统计与查询也面临着不小的挑战,本文主要对Flink实时计算技术在海量推送消息实时统计场景进行介绍
消息推送是一种产运同学通过推送工具主动给APP用户发送消息,消息可直接显示在手机通知栏,能起到提醒用户、增强用户黏性的作用,由于其投放精准、成本低廉是产品及运营团队常用的手段。
二、现有消息推送架构 2.1 消息推送的作用产品侧:功能提醒,引导用户关注,提高产品功能使用率与用户体验。
运营侧:活动运营,促销活动告知,提高用户参与度与粘性;召回用户 / 提高活跃度与留存等等
- 日志量大,同步延迟
- 推送服务日志数据平均每小时1G左右,峰值5G左右,数据同步延迟4小时左右。
- 存在大量无效日志和重复落地的数据
- 由于数据量级过大,业务排查问题时跑一个简单的SQL聚合语句往往需要占用大量集群资源。
- 问题排查效率低
- 各渠道服务日志散落在不同日志目录
- 不同厂商的推送策略不同,判断推送是否push到达,需要结合不同app项目的客户端到达埋点日志和推送回执日志。
- 缺乏测试结果的实时反馈
- 缺乏对业务测试数据的实时结果反馈,单条数据的推送到达点击测试,需要测试,分析师,大数据,基础服务同学,研发共同配合才能拿到测试结果。
- 问题排查,测试校验,需要反复沟通,影响效率。
- 推送信息查询效率低
- 需要消耗大量kafka缓存数据才能拿到结果数据
- hive只能提供t-1的离线结果数据。
- SLA统计支撑业务单一
- 只支持主板业务,缺乏对创新业务支撑。
- 重复造轮子
- 不同app、不同场景推送数据统计需求缺乏统一看板,每个push效果统计结果都需要加工SQL逻辑。
在进行实时统计计算引擎的选型时,对比了目前流行的实时统计开源项目,storm、spark streaming、flink。下面图表是对三个计算引擎的特点作了对比总结
| 产品 | 模型 | 吞吐量 | 事务机制 | 状态管理 | 容错性 | 延迟 | 支持hive-catalog | API |
|---|---|---|---|---|---|---|---|---|
| storm | native(数据进入立即处理) | 低 | 默认At-least-once可实现 Exectly-once | 无 | ACKs、zk | 毫秒 | 否 | 基础API |
| spark | mirco-batch(微批处理) | 高 | 默认At-least-once可实现 Exectly-once | 有 | CheckPoint、WAL | 秒级 | 否 | 声明式 |
| flink | native&batch | 高 | At-least-once与Exectly-once 自由切换 | 有 | distribted snapshot分布式快照 | 毫秒 | 支持 | 声明式 |
- 从处理效率上来说,基于管道式数据推送的Flink在高吞吐低延迟方面更胜一筹。
- 同时 Flink1.10版本完美的支持了hive catalog,可以利用hive的元数据管理,将实时的流数据与hive数据仓库中的历史数据进行join操组起来。
3.相对于storm和spark来说,flink可以用一套SQL逻辑同时进行离线和实时任务的开发,节省来大量的开发时间。 - flink的exact once语义保证了数据不会被重复消费和遗漏。
事件驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。比较典型的就是以kafka为代表的消息队列几乎都是事件驱动型应用。
流与批一体的世界观无界数据流:无界数据流有一个开始但是没有结束,它们不会在生成时终止并提供数据,必须连续处理无界流,也就是说必须在获取后立即处理event。对于无界数据流我们无法等待所有数据都到达,因为输入是无界的,并且在任何时间点都不会完成。处理无界数据通常要求以特定顺序(例如事件发生的顺序)获取event,以便能够推断结果完整性。
有界数据流:有界数据流有明确定义的开始和结束,可以在执行任何计算之前通过获取所有数据来处理有界流,处理有界流不需要有序获取,因为可以始终对有界数据集进行排序,有界流的处理也称为批处理。
分层api你可以在表与 DataStream/DataSet 之间无缝切换,以允许程序将 Table API 与 DataStream 以及 DataSet 混合使用。
Flink提供的最高层级的抽象是 SQL 。这一层抽象在语法与表达能力上与 Table API 类似,但是是以SQL查询表达式的形式表现程序。SQL抽象与Table API交互密切,同时SQL查询可以直接在Table API定义的表上执行。
支持有状态计算Flink在1.4版本中实现了状态管理,所谓状态管理就是在流失计算过程中将算子的中间结果保存在内存或者文件系统中,等下一个事件进入算子后可以让当前事件的值与历史值进行汇总累计。
支持exactly-once语义Exactly once: 对于一条message,receiver确保只收到一次
支持事件时间EventTime目前大多数框架时间窗口计算,都是采用当前系统时间,以时间为单位进行的聚合计算只能反应数据到达计算引擎的时间,而并不是实际业务时间3.4、Flink在实时消息推送统计中的应用
1.代码案例
四、总结


