第1页
指数级增长业务下的 服务架构改造
环信⾸首席架构师 梁宇鹏 @⼀一乐
第2页
增长速度
第3页
增长速度
每⽉月⼀一翻 春节假期 2x 同时在线近千万
第4页
公司及个⼈人
环信,即时通讯云服务 帮助移动APP添加IM功能
专注IM领域 环信⾸首席架构师,原新浪微博通讯技术专家 XMPP开源项⽬目Jabberd2、Ejabberd、Openfire
第5页
⼤大纲
架构演化 经验教训 ⼯工具实践
第6页
服务架构
第7页
服务架构
IDC 3 Cluster Cell 4 Machine 500+ Erlang 120+
第8页
架构演化
100K -> 1M -> 10M -> more 伸缩性 可⽤用性
第9页
伸缩性,通⽤用
⽔水平 -> 容量 -> 分区 MySQL,千库万表 Cassandra,动态扩容? Mnesia,fragment
垂直 -> 性能 Redis缓存,业务独⽴立
第10页
伸缩性,通讯
分层设计 连接层、会话层、推送层
读写分离 写库读缓 -> ⽂文件服务,Token存储 写处理迁移 -> 关系存储从IM到REST
第11页
可⽤用性,通⽤用
需求增加 解耦,Kafka/Redis
峰值应对 队列,群发消息流控 降级 ,消息第⼀一,登录次之
第12页
可⽤用性,通讯
软实时 HOL blocking -> 队列迁移 or 清除
降级 开关 -> 关停异常接⼝口,留缓存舍DB 数据恢复 -> ⽤用户注册⽇日志
第13页
⼤大纲
架构演化 经验教训 ⼯工具实践
第15页
经验教训
不完美主义 不多写代码 e.g. 会话存储拆分
头疼医头也医脚 先容忍失败,再解决问题 e.g. 节点关闭逻辑
不头疼不医头 量化分析 e.g. VM参数调整回滚
第16页
经验教训
未⾬雨绸缪,超容量压测 峰值总⽐比预期要早到来 数据仿真,从业务数据分析 e.g. 群⽤用户分布 抓⼤大放⼩小 e.g. 登陆流程
第17页
经验教训
多租户多业务 通⽤用性外有易变性 随新⽤用户进来⽽而改变 意外热点 IN、TFboys
第19页
云上新挑战
性能波动导致承载容量下降 Noisy Neighbors 取消数据节点磁盘快照
问题排查透明性? 资源到服务,rds也要监控
第20页
云上新挑战
特定云问题 SLB⼼心跳检查 SLB性能瓶颈
容量以及服务限制 跨云设计 只⽤用公共特性
第21页
Dev & Ops
Ops can dev 会武术有⽂文化 Nginx 降级限流
Dev for ops 好基友⼀一辈⼦子 优化减少运维负担
第23页
演练
第24页
⼤大纲
架构演化 经验教训 ⼯工具实践
第25页
语⾔言问题
第26页
我们⽤用Erlang
轻量级线程,消息传递 并发友好,消息的软实时投递
速错 Fail Fast 有错误不影响整体,健壮
不可变变量 ⽆无副作⽤用,不容易出错
⼀一切皆缘
第27页
我们⽤用Erlang
⽇日志组件Lager 同步异步切换问题,增加限流high_water_mark flume backend + no thrift compact protocol support
VM崩溃和调教 port_get_data in ERTS6.3 http://t.cn/RAOhWji dist_buf_busy_limit: +zdbbl 2048000
第28页
我们⽤用Erlang
公平的调度器,并不公平的世界 越来越多的线程
Mnesia死等和数据改造 多个节点同时重启更容易出现 开箱即⽤用 /= 开箱够⽤用 new hash module for fragment
第29页
我们也⽤用Java
语⾔言像⾷食物 ⼝口味之争 要开味蕾?要见世界!
语⾔言只是⼯工具 ⼀一门语⾔言就可以活 不要为语⾔言⽽而活
第30页
压测⼯工具
TSung TCPCopy
65535 problem? ReuseAddr and Port Client 200+
第31页
团队协作
及时决策 讨论要有定论
要⾃自组织 ⾃自我驱动,要有⽅方向
远程办公 注意沟通效率 + Slack Skype
第33页
未来展望
同时在线⼏几千万、上亿 ⾯面向全球⽤用户的即时通讯系统 微服务架构改造,Docker部署到开发 更多的优秀⼈人才,不再2+3+4 多语⾔言Erlang Java Go
第34页
谢谢
@环信即时通讯云 @⼀一乐