开放消息服务(ONS)原理与实践沈询中间件自我介绍• 花名沈询@阿里巴巴中间件• 新浪微博:淘宝沈询_WhisperXD• 阿里分布式数据库DRDS,TDDL负责人• 阿里分布式消息服务ONS(Notify,MetaQ)负责人• 加群聊架构:326140964OpenNotificationService(ONS)• ONS的应用场景• ONS的设计思路• ONS的关键概念• 消息乱序问题• 消息重复问题• 分布式事务与ONSONS的应用场景ONS的应用场景• 异步• 解耦• 最终一致• 并行ONS的应用场景• 过年了,拜年发微信– 普通青年:编辑微信,群发给所有人– 文艺青年:编辑微信,交给美腻秘书发送,自己去~~~~~~– 二逼青年:编辑微信,发送;编辑微信,发送;编辑微信,发送;编辑微信,发送;编辑微信,发送;编辑微信,发送;编辑微信,发送;消息系统• 消息中间件– 解耦– 异步– 最终一致– 并行• 举一个淘宝的简单的例子交易创建交易日志直冲系统其他200个系统消息系统• 消息中间件– 解耦– 异步– 最终一致– 并行交易创建交易日志直冲系统其他200个系统0.1s10s0.1s10s交易创建交易日志直冲系统消息中间件0.1s0.1s其他200个系统ONS的设计思路ONS的设计思路和关键概念• 设计假定:– 每台PC机器都可能down机不可服务– 任意集群都可能处理能力不足– 最坏情况一定会发生– 内网环境需要低延迟来提供最佳用户体验• 关键设计– 分布式集群化– 强数据安全– 海量数据堆积– 毫秒级投递延迟无单点集群化设计发布者发布者发布者OnsServerOnsServer订阅者订阅者订阅者集群集群集群• 理论上无限的处理能力• 集群级别高可用强数据安全和高可用发布者发布者发布者NotifyServerNotifyServerONSServer发送消息消费消息发布者发布者订阅者单队列RAID保证数据冗余单队列RAID保证数据冗余异步跨机复制冗余单队列RAID保证数据冗余单队列RAID保证数据冗余异步跨机复制冗余海量数据堆积能力• 任意集群都可能处理能力不足• 消息堆积是常态交易创建交易日志直冲系统消息中间件0.1s0.1s其他200个系统海量数据堆积能力• 面向堆积设计– 大量堆积,系统稳定,延迟不增• 百亿级别的消息堆积能力• 双11多年考验• 单消息Server不可用数据不丢• 默认就是落磁盘策略,并针对磁盘吞吐做了大量优化• 集群可无限扩展,保证足够堆积能力毫秒级的投递延迟• 采用长轮询/推送方式ONSServer订阅者ONS的关键概念主题(Topic)• 第一级消息类型• 书的标题• 交易消息消息类型(Tag/MessageType)• 第二级消息类型• 书的目录– 方便检索使用• 交易消息– 交易创建– 交易完成发送/订阅组(ProducerID/ConsumerID)• 发送/接受机器的集群消息乱序问题消息乱序问题• 产生原因• 有序队列优劣分析• 阿里中间件经验谈产生原因• 吞吐+容错vs.方便容易理解发布者OnsServer订阅者订阅者订阅者集群集群集群0123456有序队列优劣分析• 优势:– 容易理解– 处理问题容易• 劣势:– 并行度瓶颈– 异常处理• BUT– 我们需要集群的容错性和高吞吐!阿里中间件经验谈• 在世界上解决一个计算机问题最简单的方法:• “恰好”不需要解决它!阿里中间件经验谈• 一笔订单有三个状态(创建,付款,发货)– 订单之间没有先后顺序,所以乱序无所谓– 某应用只关注付款:)Bob给Smith转账异步事务单元Bob账户事务时间序事务单元Smith账户多人通过消息转账情况异步事务单元2事务时间序Smith账户异步事务单元1阿里中间件经验谈• 不关注乱序的应用是大量存在的• 队列无序并不意味着消息无序– TCP协议– 可以通过发送端编号和接收端恢复的方式恢复顺序消息重复问题消息重复问题• 产生原因• 阿里中间件经验谈产生原因• 网络不可达问题OnsServer订阅者订阅者阿里中间件经验谈• 最好的解决方法是• 恰好不需要–幂等– S*S=S– 某个操作无论重复多少次,结果都一样阿里中间件经验谈• 幂等–无论做多少次结果都一样– insertintoT(col1)values(1)– updateTsetcol=2wherecol=1– deletefromTwherecol=1• 非幂等– updatesetcol=col+1阿里中间件经验谈• 非幂等消息去重– 保证有个唯一ID标记每一条消息– 保证消息处理成功与去去重表日志同时出现• 代价?分布式事务与ONSDRDS实践–事务的分布式优化Bob账户Smith账户事务时间序事务单元DRDS实践–事务的分布式优化事务时间序Bob账户Smith账户DRDS实践–事务的分布式优化异步事务事务1事务2事务3事务4事务5事务时间序异步3异步3异步5事务1事务2事务3事务4事务5事务时间序Bob账户Smith账户Bob账户Smith账户DRDS实践–事务的分布式优化异步事务单元Bob账户事务时间序事务单元Smith账户ONS消息与事务转账• 关键设计难点– 如何保证消息发出与Bob账户减钱同时成功或同时失败?– 消息处理超时如何解决?– 消息处理失败如何解决?消息发送者事务单元同时成功、同时失败(事务消息)事务操作Trx.begin()查看Bob是否有100元减少Bob100元Trx.commit()发消息ONS消息集群ONS消息集群ONS消息集群消息接收者收消息处理消息发送者事务单元同时成功、同时失败(事务消息)事务操作Trx.begin()查看Bob是否有100元减少Bob100元Trx.commit()发消息ONS消息集群ONS消息集群ONS消息集群消息接收者收消息处理消息发送者事务单元同时成功、同时失败(事务消息)事务操作Trx.begin()查看Bob是否有100元减少Bob100元Trx.commit()ONS消息集群ONS消息集群ONS消息集群消息接收者收消息处理发消息确认消息发送消息发送者事务单元处理超时问题(重复)ONS消息集群ONS消息集群ONS消息集群消息接收者事务单元发消息确认消息发送事务操作Trx.begin()Smith加一百元插入去重表Trx.commit()小结ONS已经正式登录阿里云• 阿里使用最广泛的消息服务系统• 包含交易、商品几乎所有的的应用都在使用。• 高峰期流量• 双11每秒8亿笔交易• 堆积消息,系统写入不受到影响• 支持事务消息模式ONS已经正式登录阿里云• • DRDS/ONSQQ群– 326140964– 可扫码加群