Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

大鱼架构演进

1,407 views

Published on

"大鱼" App从启动到3.x版本, 全过程架构演进

Published in: Mobile
  • Be the first to comment

大鱼架构演进

  1. 1. 云应用 | 2016.01.20 1 大鱼架构演进 云应用 2016.01.20
  2. 2. 云应用 | 2016.01.20 2 1. Demo阶段 2. PGC: 热点、话题 3. PGC: 热点、群聊 4. PGC: 热点、万人群聊 5. UGC: 热点、万人群聊、弱社交 6. UGC: 热点、社交分享 -> LBS 7. 总结 目录
  3. 3. 云应用 | 2016.01.20 3 • RxJava: 多线程, 线程池, 任务管理, 异常管理. 禁 止使用AsyncTask, Thread等Android/Java原生 线程相关以及Android Annotation这种注解型框架 • Retrofit: 网络请求 • Picasso: 图片加载与缓存 • Okhttp: 网络通信 • 数据持久化: Android原生 • UI: RecyclerView, support-v21, Toolbar, SnackBar等Android Lollipop预览版相关控件 Demo阶段 Android客户端架构[0.1, 0.3)
  4. 4. 云应用 | 2016.01.20 4 • 白色: 不需要或者需要很少的开发与维护 • 绿色: 需要日常开发与维护 • 蓝色: 需要超越日常工作量的投入, 存在 可控的风险 • 橙色: 需要预研与验证的技术, 存在不可 预知的风险 Demo阶段 Android客户端架构[0.1.0, 0.3)
  5. 5. 云应用 | 2016.01.20 5 • 运营管理平台 • 服务器业务接口 • MySql数据持久化 • 一台开发主机 Demo阶段 服务器架构
  6. 6. 云应用 | 2016.01.20 6 • Demo版本, 修了两天BUG, 改了几次UI, 就这么上了 • 额外: 预研直播, 群聊相关技术 PGC: 热点、话题
  7. 7. 云应用 | 2016.01.20 7云应用 | 2016.01.20 7 PGC: 热点、群聊 差异化: 给用户游戏一 样的用户体验
  8. 8. 云应用 | 2016.01.20 8 • 实时网络游戏 • 高可用, 高并发, 优秀的 可扩展性 参考的架构 网易Pomelo架构 https://github.com/NetEase/pomelo
  9. 9. 云应用 | 2016.01.20 9 • 引入 Socket.io 框架 • 因为服务器开发是Java工程师, 所以 我们选择了Socket.io + Netty 的方 案 • Socket.io 对移动端的支持, 比当时 的 Pomelo 架构鲁棒性高太多, 现在 的 Pomelo 内部也改用 Socket.io 了 • Socket.io长连接单机可以达到百万 级别, 函数式API PGC: 热点、群聊 服务器架构 – 陈明
  10. 10. 云应用 | 2016.01.20 10 • Socket.io.RxJava: 将 Socket.io 的 函数式接口, 以及大鱼的相关业务接口 改成RxJava Observable式 • 将Retrofit的网络异常, 与 Socket.io 的网络异常全部封装到同一个模块, 代 理给RxJava • SharePrefer: 对SharedPreference 的链式封装, 简化SharedPreference 使用, 源代码GIST点我 PGC: 热点、群聊 Android客户端架构[0.3.0, 0.6)
  11. 11. 云应用 | 2016.01.20 11 PGC: 热点、群聊 Android客户端架构[0.3.0, 0.6) 设备唯一ID方案, Google与Apple的推荐方案
  12. 12. 云应用 | 2016.01.20 12 PGC: 热点、群聊 Android客户端架构[0.3.0, 0.6) 设备唯一ID方案, 我们的MUID方案
  13. 13. 云应用 | 2016.01.20 13 • 视差动画 - Parallax effects • View Property Animation • Layout Transition, Activity Transition, Fragment Transition • Shared Element Animation • View Animation • Canvas, Bitmap! PGC: 热点、群聊 Android客户端架构[0.3.0, 0.6) 动画相关 • 游戏引擎 – Game engines • Libgdx • Cocos2d-x • Unity • … 做了十几个动画效果, 改了几个版本UI
  14. 14. 云应用 | 2016.01.20 14云应用 | 2016.01.20 14 广播风暴: 同一个话题人数达到1250的时候, 同时发一条消息, 机房网卡就爆了(50MB)
  15. 15. 云应用 | 2016.01.20 15 • n² 流量 • 解决方案: 参考网络游戏, 服务器分区 – 连接服务器物理分区, 聊天房间业务逻辑分区 – 精简json结构, 或者更换为protobuf – 控制广播范围, 从全广播改成声波广播 – 控制用户发送消息频率 – 控制用户接收消息频率 – 图片url使用短code, 由客户端拼接 PGC: 热点、群聊 广播风暴 Connector Connector Connectormaster Connector 消息队列 消息队列 消息队列 消息队列
  16. 16. 云应用 | 2016.01.20 16云应用 | 2016.01.20 16 最终方案: 魅族Push通道protobuf重构版本
  17. 17. 云应用 | 2016.01.20 17 • Fresco: 比Picasso更优秀的性 能, 更好的扩展性, 对动画的渲 染效率远高于Android原生控件 • Nebula.dayu: 基于nebula, 对 大鱼业务的封装 • Nebula.dayu.RxJava: 将 Nebula与大鱼业务改造成 RxJava式管理, 附加事务推送等 nebula暂时缺失的模块 • UI又改了 PGC: 热点、万人群聊 Android客户端架构[0.6.0, 0.8)
  18. 18. 云应用 | 2016.01.20 18 • Push通道: 独立的, 只针对大鱼业务 • 因为原版还在测试阶段, 并没有target 第三方应用 PGC: 热点、万人群聊 服务器架构
  19. 19. 云应用 | 2016.01.20 19 • 声波控制消息广播范围和数量 PGC: 热点、万人群聊 服务器架构 声波控制
  20. 20. 云应用 | 2016.01.20 20 • 分组实现 PGC: 热点、万人群聊 服务器架构 声波架构 – By 陈金平 Socket服务群,消息收集分发,订阅 Http服务群,非消息业务,图片 Http服 务,运 营和管 理平 台,以 及监控 平台 消息生成服务 消息下发服务 赞/踩,投票站 队服务 Redis Mysql规定数据 库 归档服务 FastDFS 用户 消息路由中心 (整理消息) 发言 Location服务集群(用户订阅路由中心) 发言 通知逻辑组下发 逐个发送消息 订阅,投票,站队 主题,消息管理等 鉴权和用户管 理服务 大组消息队列A 小房间 A1 小房间 A2 … … Slave
  21. 21. 云应用 | 2016.01.20 21 • 分组实现 PGC: 热点、万人群聊 服务器架构 声波架构 – By 陈金平 大组消息队列A 小房间 A1 小房间 A2 … … Slave 消息接收服务集群 消息分发服务集群 消息路由中心 Redis集群 组临时消息队列 精选时消息队列归档用消息队列 用户群 发消息 存入数据库 转发路由中心 定时分组通知集群 收消息
  22. 22. 云应用 | 2016.01.20 22 • 还是解决不了这种问题: – 用户B与A, C能聊天互动 – 用户A与C却互相看不到 • 但是却将一个房间爆满, 另一个房间只有 几个人的寂寞感, 平均分配到了所有人 PGC: 热点、万人群聊 服务器架构 声波架构 用户A 用户C用户B
  23. 23. 云应用 | 2016.01.20 23云应用 | 2016.01.20 23 并行开发流程
  24. 24. 云应用 | 2016.01.20 24
  25. 25. 云应用 | 2016.01.20 25云应用 | 2016.01.20 25 Apk安全相关: 对于一个应用, 外发到应用市 场, 首要保证安全, 其次是渠道分发推广
  26. 26. 云应用 | 2016.01.20 26 • 添加Apk自我保护方案 • 使用Gradle Flavor来定制渠道打包 • RxJava作为整体架构的基础考虑 • Https签名从Java层移动到C层 • 敏感数据使用Gradle加密, C层解密 • 随着项目的变大, SQLite简直就是 业界毒瘤, • 不, 一切Android偏Framework的 API都是业界毒瘤 • UI又改了, 2次 PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1]
  27. 27. 云应用 | 2016.01.20 27 • 外部工具Gradle加密数据, 或者流程 • Gradle将APK的release签名加密到NDK层 • Gradle编译过程中将编译的Dex代码信息加密到 NDK层 • Android NDK层反向校验APK的Dex代码信息 • Android NDK层反向校验APK的签名 • Android NDK层解密次数据, 或解密流程 PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1] Apk自我保护方案
  28. 28. 云应用 | 2016.01.20 28 • 比如Http签名加密整体流程 PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1] Apk自我保护方案
  29. 29. 云应用 | 2016.01.20 29 • 加密解密 PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1] Apk自我保护方案 Android Apk NDK层解密 Gradle 编译过程加密
  30. 30. 云应用 | 2016.01.20 30 • 自签名校验 PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1] Apk自我保护方案
  31. 31. 云应用 | 2016.01.20 31 • Dex代码校验 PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1] Apk自我保护方案
  32. 32. 云应用 | 2016.01.20 32 • 二次打包流程 • 早期互联网Android应用, Ant编译的时候, 二次打包 Apk来加密, 原理与此一致 PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1] Apk自我保护方案
  33. 33. 云应用 | 2016.01.20 33 • 第二次优化版本, 修改 Gradle编译链, 简化成一 次打包 PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1] Apk自我保护方案
  34. 34. 云应用 | 2016.01.20 34 • 自我保护方案从大鱼2.0.0之后, 脱离大鱼, 单独维护, 可供其他应用使用, 音乐, 视频, 智能生活等多个 APP已经用到 项目地址: http://gitlab.meizu.com/AppArch/security • 因为集成比较复杂, 后来又做了个gradle插件, 来帮助应用傻瓜式集成此方案 项目地址: http://gitlab.meizu.com/Cloud/securityplugin PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1] Apk自我保护方案
  35. 35. 云应用 | 2016.01.20 35 • 使用Gradle Flavor来定义渠道Flavor • 借助Gradle resValue, buildConfigField等接口, 将渠道信息注入到Apk的代码与资源中, 以供数据统计 • 修改Gradle Android编译链, 在assemble的时候, 通过时间戳+机编码将apk以及混淆文件mappings绑 定到一起, 归档起来, 以供retrace • 此归档流程已经集成至魅族Gradle插件2.x版本, 由于服务器不支持x.y.z.CI_CODE 这种版本名, 所以全 功能版本为 dev.2.3 项目地址: http://cloud.meizu.com/dayu/meizugradleplugin/tree/dev_23 PGC: 热点、万人群聊、弱社交 Android客户端架构[1.0.0, 2.0.1] 渠道分发
  36. 36. 云应用 | 2016.01.20 36云应用 | 2016.01.20 36 2.0版本之后, 群聊被砍
  37. 37. 云应用 | 2016.01.20 37 • Https全REST full化, 签名 改为Oauth头签名, hmac- sha256加密算法 • Retrofit升级为2.0-beta3 最新架构 • 全面废弃了渣渣SQLite, 改 用realm数据库并加密, 开 发效率提升了无数倍 • JVM层添加Kotlin语言 • UI又改了 PGC: 热点、万人群聊、社交分享 Android客户端架构3.0.0
  38. 38. 云应用 | 2016.01.20 38 • RxJava: 刚开始很难用, 习惯了超好用, 可以大幅度提升多线程, 任务组合, 任务管理等开发效率 • Retrofit: 刚开始很好用, 习惯了更好用, 可以大幅度提升网络接口开发效率 • Realm: 刚开始很难用, 习惯了超好用, 可以大幅度提升数据库开发效率 • Picasso -> Fresco: 难用一点点, 但性能提升 • Kotlin: 刚开始很难用, 习惯了, 越用越好用, 可以大幅度提升敲代码的效率 • 但总体而言: 开发使用了过多不稳定的beta, 甚至experimental技术 总结 Android长期技术选用
  39. 39. 云应用 | 2016.01.20 39 • 技术选用: 尽量选择”绿色”, 甚至”白色”的技术, “蓝色”的技术一个阶段最多选一个 • 三方SDK: 各种auth2.0登录SDK, 各种支付SDK, 各种github开源库 • 渠道分发: Gradle必须要懂 • 数据统计: 海外Flurry, 国内友盟 • 推送平台: 极光, 或者parse这样的MBaas • 灰度测试, 云测 • Android安全: 壳固化技术, 二次打包技术, 或者像大鱼一样的apk保护方案 • 免服务器开发(Baas, MBaas): 海外parse, 国内LeanCloud, bmob等一堆抄袭的 • 总而言之, 所有以上都是资源, 我们要做的是按startup挑选组合一切可以使用的资源 总结 Startup阶段, 移动开发你会遇到的东西
  40. 40. 云应用 | 2016.01.20 40 • Ideas -> Validate: 产品idea的验证, 此过程在UI设计之前, 第三方validate公司有 Unbounce • Plan -> Visualize: 只有通过validate的idea, 才能进入原型图设计, 项目计划阶段 • Project Management: 进入项目管理阶段 • Website: 开发稳步进行的时候, 网站才开始建设, 一般5美刀就可以买到 • SEO: 搜索优化, 与渠道分发准备推进项目上线 • Payment & Legal: 支付接入, 账号系统, 以及法律规避 • Analytic: 产品正常运转了之后, 数据分析开始介入, 用数据来帮助产品提升 • 其实Analytic约等于 Validate, 形成一个子循环, 数据分析是用来自我Validate然后改进下一个产品需求 与迭代的 总结 Startup项目正确的流程
  41. 41. 云应用 | 2016.01.20 41 • 网易网络游戏框架: https://github.com/NetEase/pomelo • Google惟一ID方案: http://developer.android.com/training/articles/user-data-ids.html • Apk自我保护方案: http://gitlab.meizu.com/AppArch/security/tree/master • Apk自我保护方案插件: http://gitlab.meizu.com/Cloud/securityplugin/tree/master • 魅族Gradle插件: http://cloud.meizu.com/dayu/meizugradleplugin – dev_23分支中包含有apk及mappings归档插件代码 • 推特Oauth加密: https://dev.twitter.com/oauth/overview/creating-signatures • Startup 15个工具: http://creately.com/blog/diagrams/15-tools-to-launch-your-startup/?utm_content=bu 可供参考的资源
  42. 42. 云应用 | 2016.01.20 42 谢谢 云应用 – 刘俊

×