文档章节

饿了么的移动APM架构实践

摩云飞
 摩云飞
发布于 2016/12/12 19:33
字数 1246
阅读 686
收藏 2

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

作者简介:胡彪,饿了么移动技术负责人,移动技术总监。负责饿了么移动架构,新技术预研与实践;移动安全,移动应用开发等等。09年投身移动互联网研发,曾先后就职于新蛋、盛大、百度、腾讯等国内外知名企业。

发布日期:2016-12-06

本文针对表达不清晰的地方进行了调整,并针对关键信息进行了标注,可以参考原文进行对比;


简单的说 APM 即应用性能管理,主要指对关键业务应用进行监测优化,提高应用的可靠性质量,保证用户得到良好的服务。同时通过监控不断优化应用,达到提高用户体验的同时节省成本的目的。下面是维基百科上的介绍:

Application performance management is the monitoring and management of performance and availability of software applications. APM strives to detect and diagnose complex application performance problems to maintain an expected level of service. APM is “the translation of IT metrics into business meaning.”

为什么饿了么需要研发 APM 系统?

饿了么作为一家全球领先的 O2O 移动互联网公司,目前日订单量超过 650 万,超过 98% 的订单量来自于 App 端。

  • O2O 业务具有即时性集中性等特点,订单主要集中在午高峰和晚高峰两个时段,系统高峰期面临高并发、高负载等多重压力。
  • 早期再业务爆发高峰期,为了抗住系统压力基本靠不断堆人堆机器。随着技术不断提高和业务变化,存在部分机器利用率不高的问题。
  • 国内移动网络环境极为复杂,WIFI、4G、3G、2.5G(Edge)、2G 等多种移动网络并存。
  • Android系统碎片化过于严重。

APM系统的挑战

  • 多语言并存,目前饿了么后端有 Java、Python、PHP、Go 等;
  • H5 端 Vue JS、Angular JS、React JS 等多框架并存;
  • 多终端并存,Backend、Frontend、iOS、Android、Hybird、Semi-Hybird 等,且交叉混合较多。
  • 高并发,海量数据。目前仅后端每天收集到 APM 相关数据 40TB+ 。
  • Mobile Native 端 APM 不能影响宿主 App 运行,且不能明显增加用户流量、电量等消耗。
  • 如何做到无侵入 APM 至关重要。

饿了么APM架构

移动端架构

移动端架构

Why protobuf?

使用 Protobuf 可以达到约 60% 的数据压缩比,达到节省流量目的的同时增加了数据 decode 复杂度,初步防止抓包轻易阅读报文行为。

自定义格式的协议均有此特点;说实话,我并不确定 protobuf 在移动端使用是否真的具有绝对优势;

Why 7Z?

鉴于 APM 收集到的数据量较大,对于系统分析有益,而对于用户来说用处不大,且会占用较多用户流量的情况;经过对比 Gzip,7Z,Snappy 等多种压缩算法,并综合多种因素考虑后,我们选择了 7Z 压缩算法。7Z+Protobuf 在多条数据的使用场景中最高可达 97.4% 的压缩比,单条数据使用场景也可达到 88.6% 的压缩比。

后端架构1.0

后端架构1.0

  • 通过 Nginx+lua 模块来完成 7Z 解压缩、Protobuf 反序列化 等工作,之后再将数据写入 access.log 中;
  • 通过 Flume 读取 access.log ,将数据写入 Kafka ;
  • Kafka 只有一个 Topic ,ETL Service 直接消费 Kafka 。根据消息类型不同做不同业务逻辑处理,然后将数据写入 ES 或者 LinDB(饿了么框架工具部自研);
  • Webport 展示数据结果;

缺点:

  • Nginx+lua 模块处理能力有限;
  • 反复读写 access.log 让系统变成了一个 IO 密集型系统;
  • Kafka 只有一个 Topic ,一旦一种类型数据出现问题,将会影响其它类型数据处理;
  • 所有数据都依赖 ETL Service 来处理,但是每种消息的处理逻辑完全不同。部分处理比较复杂的消息严重影响了 ETL 的消费能力,导致 Kafka 数据大量堵塞,数据延迟极高;

从这个架构中可以看出饿了么的特点:很喜欢使用各种开源的东西搭建一个看似“牛逼”的架构,然而一些东西并没有什么卵用;

后端架构2.0

后端架构2.0

  • 使用 Gateway 来代替 Nginx ,智能降级熔断;
  • 放弃 flume ,使用 Collector Service 代替 lua 模块,简单处理之后直接将 Protobuf 数据插入 Kafka ;
  • 使用 Dispatch Service 对每种类型消息做简单处理之后,分 Topic 插入 Kafka 中,确保每个 Topic 中消息格式统一;
  • 增加 Transport Service 将 Metadata 存储 ES 中;
  • 增加 Alerting Service ,异常指标及时通知;
  • 在 ES 之上增加一层 API Service ,提供各种 DIY 数据指标;

一堆轮子被造出来了,然后这篇文章却不说清楚细节,哎~


原文地址:这里

本文转载自:URL居然能超出长度限制,我也是醉了

摩云飞
粉丝 377
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
加载中

评论(0)

应用性能管理大讲堂2016年终盛典—心路

在即将过去的2016年里,身为程序猿/运维攻城狮的你是否还经常陷在和产品经理剪不断理还乱的复杂关系中,在项目上线遇到性能问题后又沉浸在各部门之间的扯皮中,在这一年里项目研发过程中是否...

听云APM
2016/11/16
151
0
fir.im Weekly - 聊聊 Google 开发者大会

中国互联网的三大错觉:索尼倒闭,诺基亚崛起,谷歌重返中国。12月8日,2016 Google 开发者大会正式发布了Google Developers 中国网站 ,包含了Android Developers 的官网、文档、博客教学视...

风起云飞fir_im
2016/12/12
408
0
掘金 x 饿了么技术沙龙 | 架构实践专场

活动介绍 掘金 x 饿了么技术沙龙由掘金、饿了么联合主办,本次活动为架构实践专场,聚焦 Java。 本次活动会邀请垂直行业的优秀工程师来分享优秀的实践经验,技巧方法。旨在为开发者提供线下技...

掘金
2018/10/12
99
0
应用性能管理大讲堂2016年终盛典—心路

在即将过去的2016年里,身为程序猿/运维攻城狮的你是否还经常陷在和产品经理剪不断理还乱的复杂关系中,在项目上线遇到性能问题后又沉浸在各部门之间的扯皮中,在这一年里项目研发过程中是否...

听云APM
2016/11/16
248
0
掘金 x 饿了么技术沙龙 | 架构实践专场

🙋 报名 扫码报名: 报名链接:点我报名 🚀 介绍 掘金 x 饿了么技术沙龙由掘金、饿了么联合主办,本次活动为架构实践专场,聚焦 Java。 本次活动会邀请垂直行业的优秀工程师来分享优秀的...

稀土君
2018/10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

apache服务器 --Internal Server Error(内部服务错误)

问题显现: 首先,我先展示一下错误提示代码: Internal Server ErrorThe server encountered an internal error or misconfiguration and was unable to complete your request. Ple......

二营长意大利炮
39分钟前
15
0
唱作俱佳,腾讯AI艾灵领唱中国新儿歌

唱作俱佳,腾讯AI艾灵领唱中国新儿歌 今年六一儿童节,腾讯联合北京荷风艺术基金会发起“腾讯荷风艺术行动”,给孩子们送上两份礼物,为音乐美学中国素质教育的发展做出贡献。 其中一份就是由...

腾讯技术资讯
41分钟前
39
0
BeetlSQL3.0 难搞

最近想支持一下nosql,难搞,每个nosql server,都很难一天掌握安装和基础用法,所以先决定选用clickhouse ,apache drill (操作文件),Cassandra,这三个下手 hadoop系列也挺好的,但确实没时...

闲大赋
41分钟前
26
0
生产计划体系学习

生产计划的内容: 1、生产的最终产品与零部件数量 2、生产的批量和产出时间 3、产品产出的日程计划 生产计划编制思路,按照分层次来进行的 1、主生产计划(MPS) 2、零部件生产计划(MRP) ...

旺仔没馒头
42分钟前
19
0
如何使用Maven创建具有依赖项的可执行JAR? - How can I create an executable JAR with dependencies using Maven?

问题: I want to package my project in a single executable JAR for distribution. 我想将我的项目打包在一个可执行的JAR中进行分发。 How can I make a Maven project package all depen......

javail
44分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部