面对万人世界军人运动会票务,阿里文娱 Dpath 如何保障稳定性?

作者|  阿里文娱技术专家 司楚

责编 | 夕颜

出品 | CSDN(ID:CSDNnews)

 

背景

第七届世界军人运动会是中国第一次承办综合性国际军事赛事,有 100 多个国家、一万多现役军人参与竞技。武汉军运会票务系统建设和票务运营由大麦网承接,使用阿里集团基础技术能力,通过大麦麦座票务系统提供票务管理、售卖和现场换验服务。

大麦麦座票务系统(简称“麦座”)定位于现场娱乐的一站式行业服务平台,结合阿里的大 数据、云计算等能力,为场馆向数字化、智能化的升级提供行业解决方案。麦座基础架构经历 了从单机软件部署到阿里云的商户独立部署,再到 SaaS 化的演进过程。

目前麦座系统利用阿里巴巴的 pouch 容器,采用微服务的架构,为大量商户提供统一的服 务。多用户共享服务的架构,实现了资源利用的最大化,方便版本的统一维护和升级。当承载军运会等大型赛事,或者面对头部 KA 客户时,从安全、稳定性角度考虑,需要做独立部署和流量隔离,从而避免突发流量影响到 KA 客户。

 

目标

针对军运会的场景,我们需要满足:独立部署、流量隔离。在满足独立部署和流量隔离的 基础上,需要满足:

  1. 对开发尽量透明:尽可能少的定制和代码侵入,对开发透明,不能因为独立部署增加额 外的开发和运维成本;

  2. 独立部署的容器与普通分组的容器完全等价,且可以动态的切流:某个环境宕机的极情况下,能够快速切换,保证业务正常运行。

 

方案选型

为了实现独立部署和流程隔离的目标,同时支持动态切流,我们调研了 单元化、独立应用、 环境配置项、通过流量打标进行路由的方式。

 


单元化

独立应用

环境配置项

流量标路由

介绍

独立机房部署,通过域

单独的应用和代码库,

同一个应用和代码库,独

根据商户信息,对流量打

名等信息进行路由;可

可实现多版本的共存,

立的分组,对应独立的配

标。RPC 调用、消息队列

动态切流;实现了存储

无法代码复用

置项。通 过配 置 项维护

等根据打标信息进行路

隔离和异地容灾

RPC 版本号等信息,实现

由,形成分组的隔离

隔离

部署成本

需要独 立的单 元 化 环

独立应用需要测试、预

申请独立的分组,成本低

申请独立的分组,成本低

境,成本高

发、线上环境,成本偏

开发成本

对代码无侵入,成本低

维护多套代码,成本高

新增配置 时需 要 修改多 套配置项,成本偏高

RPC、消息队列等中间件 支持,对开发完全透明

 

通 过 对 四个方 案的 比较, 我们 最终选 择流 量打标 路由 的方式 。阿 里巴巴 中 间 件 Dpath(Dedicated path),在请求中添加流量标识,通过 Diamond(持久配置管理中间件)把 Dpath 的打标规则,推送到各个应用容器。RPC、消息队列等中间件根据流量标和 Dpath 规则,进行 路由,选择相应的应用分组。

1. Dpath 实现的需求:

1)针对特殊流量可以圈定一些特殊机器作为他的专属的服务器,以便对特殊流量进行特殊 保障或者测试;

2)普通流量不应该使用专属服务器,特殊流量可以按需使用普通服务器;

3)整个链路上的专属服务器组成了特殊流量的专属通道,类似公交专用道。

2.基于 Dpath,我们需要实现:圈定 专属 服 务 、识别特殊流量、在链路上引导流量到对应 的服务器。

 

HTTP 流量路由

我们为每个应用申请独立的应用分组,专门为军运会提供服务(下文称为军运会分组)。然后在 Dpath 创建独立的环境,选择对应的分组,组成军运会的集群环境。通过统一接入层,为军运会分组配置独立的域名。VipServer 进行配置,军运会域名的请求关联军运会的分组。当 某个分组宕机等原因导致服务不可用时。修改 VipServer,把域名的关联切换到可用分组,保证 流量的动态切换。

 

RPC 流量路由

RPC 的流量可以分为麦座内部系统的相互调用和麦座外系统的调用。针对麦座的内部流量, 当请求经过某个分组时,自动在链路的上下文中打标。常见的 RPC 中间件(如 Dubbo)支持路由 规则的配置。针对外部的流量,在 Diamond 中配置路由规则。Diamond 把 Dpath 的路由规则推 送到各个容器,包括流量标识和应用分组的映射关系。RPC 中间件根据 Dpath 规则和流量标识, 选择对应的分组。

 

 1class DPathTagRule {  boolean isOverwriteOn() {
 2// 是否使用当前规则进行覆盖,默认为 True
 3return true
 4}
 5// 接口/方法级别规则
 6String methodTagRule(String serviceName, String methodName, String[] paramTypeStrs){ return null
 7}
 8// 参数级别
 9Object argsTagRule(String servicenName, String methodName, String[] paramTypeStrs)
10{
11return {  Object[] args ->
12if (JYH_TENANT_ID.equals(args.getTenantId())) { return "jyh"
13} else { return null
14}
15}
16}
17}

MQ 消息路由

Dpath 支持消息队列的路由。Dpath 通过为消息消费者(Consumer)配置消息 Filter 方式实现。不同分组的 Consumer,注册时在用户配置的 ConsumerId(cid)基础上添加后缀。普通分组和军运 会分组都会接收到所有的消息。消息的生产者(Producer)发送消息时根据自己的机器分组,在消 息体内打标。Consumer 在消费消息之前,添加消息的过滤器。根据 Consumer 自己的机器分组, 过滤掉非同分组的 Producer 发送的消息,仅消费同分组的 Producer 发送的消息。

             

 

效果

通过 Dpath,我们用低成本的部署,实现了独立部署和流量隔离。保障业务功能快速升级,同时兼顾最低维护和运行成本,保障流量和风险隔离。整个军运会从上线到闭幕期间,整个售卖过程非常顺利,无任何问题和故障。

【END】

更多精彩推荐

斩获GitHub 2000+ Star,阿里云开源的 Alink 机器学习平台如何跑赢双11数据“博弈”?| AI 技术生态论

2020 年,AI 芯片内存哪家强?

拜托,别再问我什么是 B+ 树了

程序员为什么应该旗帜鲜明地反对“最佳实践”?

半小时训练亿级规模知识图谱,亚马逊AI开源知识图谱嵌入表示框架DGL-KE

“出道” 5 年采用率达 78%,Kubernetes 的成功秘诀是什么?

警惕!新骗术出现:这些虚假二维码生成器已成功盗取 4.6 万美元!

今日福利:评论区留言入选,可获得价值299元的「2020 AI开发者万人大会」在线直播门票一张。  快来动动手指,写下你想说的话吧。

点击阅读原文,精彩继续!

你点的每个“在看”,我都认真当成了喜欢

发布了1934 篇原创文章 · 获赞 4万+ · 访问量 1808万+

猜你喜欢

转载自blog.csdn.net/csdnnews/article/details/105401300
今日推荐