焕新分布式应用体验 腾讯云AMQP消息协议产品全新升级 主讲人:岳小均 01AMQP协议简介和演进 AMQP协议介绍 AMQP(AdvancedMessageQueuingProtocol,高级消息队列协议)是一种为面向消息中间件设计的应用层协议,旨在实现分布式应用系统中消息的可靠传递。 AMQP协议以其模型灵活,功能丰富,多语言客户端健全,社区活跃,成为当前分布式应用架构下使用最广泛的消息协议,并有大量消息队列产品兼容支持。 交易信息 发布消息 扣减库存 通知发货 红包卡券 更新积分 Push推送 短信系统 积分系统 促销系统 仓储系统 库存系统 AMQP 订单系统 商和独立 AMQP协 成了一个 AMQP协议演进历程 2006.06 0.8 协议诞生JPMorgan在金融业务场景中,为了分布式应用之间消息互通,设计的一个开放的消息传输标准。 2006.12 0.9 快速改进在0.8基础上做了快速改进,根据用户需求,丰富消息特性和改进性能。 2008.11 0.9.1 成熟完善目前最被用户广泛使用的成熟完善的版本,有很多开源或商业化产品支持。 2011.11 1.0 国际标准成为国际标准IOS/IEC19464,但做了大量不兼容改进升级,所以支持的产品比较有限。 现在 广泛使用 有大量云厂厂商围绕议开发,形完善生态。 02开源AMQP产品存在的问题 现有主流开源产品架构问题 网络分区,容灾能力弱 现在最被广泛使用的开源产品是RabbitMQ产品,以其简单易用,文档丰富俘获了大量用户,广泛被用在核心业务系统。 但其架构在集群模式受集群架构和存储模型限制,容易受网络分区造成集群不可用,当消费异常时,消息堆积导致流控影响消息发送,经常给用户造成核心业务中断。 堆积流控,易失败 队列绑定,扩展能力弱 03腾讯云新AMQP存算分离架构 VirtualHosts QueueA RK=k1 Pull/Push Exchange QueueB M RK=k2 Pull/Push ConsumerB Producer ConsumerA 核心模型元素 •VirtualHosts •Exchange Topic...) •Queue (Fanout、Direct、 •RoutingKey/BindingKey •Connection •Channel •Message •Producer •Consumer m1m2 … mn m3 m4 … mm AMQP0.9.1模型定义 自研的存算分离架构 基于存算分离的架构,方便在云上支持Serverless弹性产品形态。 计算层: 计算层负责连接处理,协议解析,安全认证,限流熔断,业务逻辑处理等功能,是一个完全无状态的应用。 存储层: 存储节点由NameSrv和Broker节点组成,通过各种消息存储池化技术,组成一个多用户复用的存储池,提升存储密度,默认强制跨可用区容灾部署。 AMQPClusterInstance User Perspective ComputationalLayer MetadataDB RocketMQStoragePool NameSrvCluster NameSrvn NameSrv2 NameSrv1 BrokerClustern broker BrokerCluster2 broker BrokerCluster1 broker ProxyCluster3 Proxy ProxyCluster2 Proxy ProxyCluster1 Proxy Vhosts2Exqueue Vhosts1Exqueue 我们通过利用RocketMQ的轻量队列模型,一条消息可以建多个索引,将RocketMQ的一个轻量消息队列和AMQP协议中的队列映射起来,可以满足一条消息被多个队列索引的场景。 其他AMQP协议中的扩展字段也都可以作为header存储在RocketMQ消息中,实现协议兼容。 这样RocketMQ可以作为AMQP协议理想的存储层,并非常方便扩展高阶特性,比如消息轨迹。 CommitLog index 1 2 3 4 5 6 7 8 9 10 T1-ConsumeQueue1 Consumemessage T1-ConsumeQueue2 T2-ConsumeQueue1 CommitLog index 1 2 3 4 5 6 7 8 9 10 T1-LMQ-Q1 Consumemessage T1-LMQ-Q2 T1-LMQ-Q2- Consumer T1-LMQ-Q1- Consumer T2-Consumer1 T1-Consumer2 T1-Consumer1 T1 T2 T1 T1 T2 T1 T2 T1 T2 T1 1 3 8 4 6 10 3 5 7 9 T1 Imq=q1,q2 T2 T1 Imq=q2 T1 Imq=q1 T2 T1 Imq=q1 T2 T1 Imq=q1 T2 T1 Imq=q1,q2 1 4 6 8 10 1 3 10 存储模型映射 1.SendAMQPMessage Amqp-abc123 QueueA QueueB 2.Calculatethetargetqueuesetbasedontheroutingspecification 3.SendRocketMQtopicmessagebylmq.Topic=amqp-abc123,lmq=queueA,queueB RocketMQ Exchange AMQPSDK 计算节点收到AMQPSDK发送的消息后,会按照AMQP协议标准进行解码,然后根据订阅关系,计算目标队列列表,然后按照上一页介绍的模型映射关系,将AMQP消息转为RocketMQ的消息格式,写到存储的Broker中,并在存储层建立合适的索引,用来查询或消费消息。 m1 m2 m3 m1 m2 m3 发送消息流程 消费消息流程 因为AMQP协议是面向长连接的,并且支持拉模式和推模式消费,计算节点中通过连接的订阅关系信息,从Broker拉取消息,推送消息给AMQP客户端。 计算节点中维护一个轻量的SDK,通过POP请求和Broker交互获取消息,队列的消费位点信息维护在Broker中,这样计算层完全无状态,并且可以无限横向扩展。 PullMode PushMode SDK SDK2 PullQueueA SubscribeQueueA SubscribeQueueB NotifyMessage Connection&ChannelManager SubscribeQueueA&QueueBMessage NotifyMessage POPLMQ-QueueA POPLMQ-QueueA&LMQ-QueueB RocketMQ RocketMQ POPWorkerPool Proxy SDK 高可用可扩展容灾部署架构 计算节点: 用户购买的每个集群实例都对应一个AMQPProxy集群,每个集群都是多节点,可以快速的弹性扩缩容,并且强制跨可用区容灾部署。 存储节点: 存储节点由NameSrv和Broker节点组成,通过各项消息存储池化技术,组成一个多用户复用的存储池,提升存储密度,默认强制跨可用区容灾部署,并且铂金版存储集群也独占提供更高的隔离保障。 管控节点: 管控节点不承担数据流,每个地域部署一套管控服 务,也强制跨可用区容灾部署。 可用区1 可用区2 可用区3 AMQP Proxy1 AMQP Proxy2 AMQP Proxy3 AMQP Proxy4 NameSrv1 NameSrv2 NameSrv3 Broker1 Broker2 Broker3 BrokerN 管控节点 管控节点2 管控节点3 04新架构带来的新体验 基于新架构的Serverless产品体验 开箱即用零运维成本 全面兼容 AMQP .9.1协议 高可用高可靠可扩展 全流程监控诊断能力 客户案例–Celery支撑优化 Celery是一个基于Python的分布式任务队列系统,它主要用于处理大量消息的异步任务队列,后端经常选用RabbitMQ作为任务调度和存储。 Celery重度依赖RabbitMQ并且使用广播消息,自动删除队列,TTL,定时消息等高阶特性,之前经常会遇到性能瓶颈和内存溢出等问题,通过升级RabbitMQ后,稳定性明显提升,并且机器成本下降50%。 应用 生产 定时任务 (CeleryBeat) 发送 分发 分发 分发 反馈 反馈 反馈 Celery监听程序收到任务后,进行消费。当消费 完成,反馈RabbitMQ并清除队列中该消息 存储 存储 存储 结果存储 CeleryWorker3 CeleryWorker2 CeleryWorker1 Celery client RabbitMQ 异步任务 (AsyncTask) 专业版 基础版 包月定价 队列数上限个 最大连接数个 TPS峰值次/秒 子产品版本 更多规格,更优价格 新的产品形态也重新设计了价格体系,除了更丰富的特性和规格选择,综合对比之前的形态大约有30~50%的下降。 目前已经处于邀测阶段,预计下半年会正式商业化。 1000 1000 100 758 1500 1000 100 1068 2000 1000 100 1378 2500 1000 100 1688 3000 1500 200 2340 4000 1500 200 3090 5000 1500 200 3840 3000 2000 200 2820 5000 2000 200 4420 8000 2000 200 6820 10000 3000 300 8420 15000 3000 300 12420 20000 3000 300 4800 30000 3000 300 6800 40000 4000 300 8800 50000 4000 300 10800 80000 5000 500 16800 100000 5000 500 20800 THANKS