知识卡片
从推模式长连接到拉模式定时批量消费:一次真正解决持续性故障的架构级调整
内容
某音乐公司最初的数据流架构,是清洗后的数据由数据实时清洗平台(ETL)直接、实时地推(Push)写入HDFS——这个架构需要维持长连接,运行起来非常不稳定,隔三差五就出现数据异常,进而导致下游的计算结果也跟着异常。团队最初尝试了很多具体的技术手段去优化这个问题:保证长连接的稳定性、连接断开后的重试机制、调整HDFS服务端参数,但这些局部优化都没能彻底解决问题——每天异常不断,旧异常还没处理完,新异常又冒出来了。真正的转折点是团队意识到不能再停留在”优化具体技术点”这个层面,而要从架构本身入手:在数据实时清洗平台之后加入了一层Kafka(数据缓存重用层),清洗后的数据先写入Kafka,离线计算不再依赖直接、实时、长连接的推送方式,而是改为由新开发的KG-Camus组件(参考LinkedIn的Camus实现),通过作业调度系统按固定间隔定时拉取数据到HDFS——数据消费模式从”推”彻底转变为”拉”,不再需要维持HDFS Client的长连接,不同业务还可以根据自己的实际需求配置不同的拉取时间间隔。这次架构调整上线之后,此前反复出现的那类异常基本再也没有出现过。这个案例揭示了一条排查”持续性、反复出现的系统性故障”的重要经验:当针对具体技术细节的一轮又一轮优化(调整参数、加重试逻辑)始终无法根治一类反复发生的问题时,这往往是一个信号,说明问题的根源不在某个具体的实现细节,而在于架构本身的通信模式选择(这里是”推”这种要求维持长连接、实时性强但容错性差的模式)——遇到这种情况,与其在同一个架构模式内部持续打补丁,不如认真评估是不是应该切换到一种从设计上就天然更健壮的通信模式(这里是”拉”模式的定时批量消费,不依赖脆弱的长连接、可以自然容忍短暂的网络波动)。
参考来源
- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.1 某音乐公司的大数据实践"节,"6.1.3 在大数据平台重构过程中踩过的坑"(源文件:_epub-src/OEBPS/Text/Chapter6_1_4.xhtml)
- 结论依据:原文说明"此架构需要维持……常不稳定,隔三差五地出现数据异常……当时尝试过很多种手段去优化……都不能彻底解决……不能只从具体的技术点去优化了……在数据实时清洗平台(ETL)后加了一层数据缓存重用层(Kafka)……此方式使数据消费模式由原来的推方式改为拉模式……从此架构调整上线后,基本没有类似的异常出现了",直接支撑本卡片结论。
- 原始内容:此架构需要维持常不稳定,隔三差五地出现数据异常……当时尝试过很多种手段去优化,如保证长连接、连接断后重试机制、调整HDFS服务端参数等,都不能彻底解决……此方式使数据消费模式由原来的推方式改为拉模式……从此架构调整上线后,基本没有类似的异常出现了。