当XTS服务遇到切流...

事件回顾

介绍问题前,先介绍两个概念。灰度发布和切流。

灰度发布

灰度发布也叫金丝雀发布。起源是矿井工人发现,金丝雀对瓦斯气体很敏感,矿工会在下井之前,先放一只金丝雀到井中,如果金丝雀不叫了,就代表瓦斯浓度高。

在灰度发布开始后,部分机器会部署新版本代码,那么可以将少量的用户流量导入到新版本上,然后再对新版本做运行状态观察,收集各种运行时数据,如果此时对新旧版本做各种数据对比,就是所谓的 A/B 测试。

当确认新版本运行良好后,再逐步将新版本代码部署到更多机器上,将更多的流量导入到新版本上,在此期间,还可以不断地调整新旧两个版本的运行的服务器副本数量,以使得新版本能够承受越来越大的流量压力,直到将 100% 的流量都切换到新版本上,完成发布。

如果在灰度发布过程中(灰度过程)发现了新版本有问题,就应该立即将流量切回老版本上,这样,就会将负面影响控制在最小范围内。下面是灰度发布的流量图例。
 

切流

切流可以理解为流量切换。即通过流量标识,应用系统可以决策走特定的逻辑。

流量切流又分为外部切流(依赖消费方带流量标给到下游),内部切流(应用内部通过参数配置决策走特定逻辑,上游服务消费方不感知)。

图例:应该AP判断流量是否带有切流标识,有就走A逻辑,反之走B逻辑。

问题描述

需求介绍:应用内部通过判断切流标识决策走新链路还是老链路。

  • 改动点1: 新增一个外部配置,用于存储需要切流的信息
  • 改动点2: 开发切流之后的新链路

下面是问题代码:

问题描述:

由于技术评审和测试评审阶段评估不存在兼容性问题,所以测试完成后就让开发推进灰度发布了。

灰度阶段监控发现,有部分流量出现了NPE报错。

定位研究发现是灰度发布过程,一阶段走到了非灰度机器【老代码】,二阶段走到灰度机器【新代码】。

XTS介绍

XTS(eXtended Transaction Service)是一个分布式事务开发框架,用来保障在大规模分布式环境下事务的最终一致性。

1.使用数据库持久化记录事务数据,且使用独立的事务模版,也就是单独事务

2.特别关注红线对应的 SQL,这是一句 update 主事务表的 SQL,而这句 SQL 是在发起方的本地事务中的,这样一来就和发起方的事务绑定了,如果发起方本地事务成功,则这句 update 语句必然成功,如果发起方本地事务失败,则这句 update 语句必然失败,这样我们就可以根据 activity 表的事务记录的状态来决定这笔分布式最终的状态是成功还是失败了

3.在调用参与者前,启动单独事务插入代表这个参与者的分支事务记录,以供后续恢复使用

4.二阶段是通过 spring 提供的事务同步器实现的,如果发起方的本地事务失败,则二阶段自动回滚所有参与者,如果发起方的本地事务成功,则二阶段自动提交所有参与者。二阶段结束后,删除所有事务记录

5.服务器上的框架代码自动调用二阶段失败的话,通过提前配置由兜底服务集群进行事务捞取阶段推进

6.二阶段可配置异步化应对大促等业务场景,保证最终一致性即可

7.一二阶段通过数据库存储的上下文进行数据传递

XTS服务遇到切流场景分析

针对切流过程的场景需要覆盖下面四个case:

1. 一阶段成功【老代码】,二阶段commit【新代码】(线上出现的场景)

2. 一阶段失败【老代码】,二阶段rollback【新代码】

3. 一阶段成功【新代码】,二阶段commit 【老代码】

4. 一阶段失败【新代码】,二阶段rollback 【老代码】

老链路:

5. 一阶段 成功【老代码】,二阶段 commit 【老代码】 老链路

6. 一阶段 失败【老代码】,二阶段 rollback【老代码】 老链路

新链路:

7. 一阶段 成功【新代码】,二阶段 commit 【新代码】 新链路

8. 一阶段失败【新代码】,二阶段 rollback【新代码】 新链路

问题解决

针对这种切流过程的特殊场景场景,需要做代码兼容性处理。

  1. 代码针对切流标识增加兼容处理:
    1. 针对老流量【无切流标识】,继续走老链路
    2. 针对新流量【有切流标识】,走新链路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何获取唐诗三百首中的名句列表接口

唐诗三百首,是中国文学中最为经典的诗歌选集之一,其中涵盖了大量美丽、深刻的诗句,被广泛传诵。有不少文化爱好者希望能够获取这些名句列表,以便深入理解唐诗的内涵和精华。那么,如何获取唐诗三百首中的名句列表呢&…

uniapp运行到安卓基座app/img标签不显示

img是html中的标签,他也是一个单标签 image属于服务器控件,是个双标签 问题:uniapp运行到app安卓基座后图片无法显示 原因:自己使用了img标签,而且输入路径无提示,img标签导致图片不显示 解决&#xff…

深入探索网络协议:揭开互联网运作的奥秘(建议收藏)

随着如今数字化时代的到来,互联网已经成为我们日常生活中不可或缺的一部分。然而,我们是否曾好奇过互联网是如何运作的?它是如何将我们与世界连接起来的?答案就在网络协议中,这是互联网背后的语言。 网络协议的作用和功…

重生奇迹MU再生原石

通过坎特鲁提炼之塔的NPC艾尔菲丝提炼成功就可以可获得再生宝石。 重生奇迹mu里的再生原石的用法: 1、打怪获得再生原石去提炼之塔(进入坎特鲁遗址的141188位置的传送台)。 2、找到(艾儿菲丝)把原石提炼成再生宝石。…

【vSphere 8 自签名 VMCA 证书】企业 CA 签名证书替换 vSphere VMCA CA 证书Ⅲ—— 颁发自签名与替换 VMCA 证书

目录 5. 使用 Microsoft 证书颁发机构颁发自签名 CA 证书链5.1 登录MADCS5.2 申请证书5.3 选择证书类型5.4 提交CR5.5 下载 Base 64 编码的证书5.6 将证书链传入VC 6. 使用 企业CA签发的 VMCA 证书 替换 vSphere 默认 VMCA 证书6.1 确认证书文件6.2 替换默认 vSphere 证书6.3 验…

Gateway网关--java

网关是建立于请求到服务之前的,可以用网关限制访问量,添加过滤等 创建网关模块,引入相关pome依赖 配置yml 具体相关的作用可以参考 Spring Cloud Gateway 这样就可以了 基础的网关配置,我们的实现效果 我们可以通过10010端口访问,通过转发到nacos,再找到相应的模块,实现…

CAPL通过ethernetPacket发送以太网报文

文章目录 ethernetPacketCANoe帮助文档车载以太网协议函数CAPL通过ethernetPacket发送以太网报文例子ethernetPacket CANoe中,ethernetPacket类似于CAN的message. CANoe帮助文档 CANoe的帮助文档是很好的学习资料,后面会结合CANoe帮助文档来介绍车载以太网的相关内容。 车…

2023年12月3日支付宝蚂蚁庄园小课堂今日答案是什么?

问题:雪天行车,路面会有不少前车行驶的轨迹,最好? 答案:顺着前车轨迹行驶 解析:雪天路面湿滑,而且可能有冰雪等堆积物遮盖路面,所以,最好顺着前车轨迹减速慢行&#xf…

Asp.Net Core Web Api内存泄漏问题

背景 使用Asp.Net Core Web Api框架开发网站中使用到了tcp socket通信,网站作为服务端开始tcp server,其他的客户端不断高速给它传输信息时,tcp server中读取信息每次申请的byte[]没有得到及时的释放,导致内存浪费越来越多&#…

frp实现内网穿透(多端口穿透)

frp实现内网穿透 准备一个公网服务器(腾讯、阿里、华为的云服务器) 下载frp的安装包 下载对应系统的安装包,不要下错文件。 注意amd对应x86架构的系统 arm对应 arm架构系统(macos) 点击下载 查看文档将对应的安装包放…

设计模式-结构型模式之适配器设计模式

文章目录 一、结构型设计模式二、适配器模式 一、结构型设计模式 这篇文章我们来讲解下结构型设计模式,结构型设计模式,主要处理类或对象的组合关系,为如何设计类以形成更大的结构提供指南。 结构型设计模式包括:适配器模式&…

Unity对接后台和加载图片

1、前言 在unity中与后台对接,用await在web端暂时还不支持,所以,协程成为比较好的通用方式,以下适用除post访问外的所有对接 2、对接后台 2.1、安装插件 首先我们需要用到Newtonsoft.dll,如果没有这个.dll的请跟着我…

LED屏幕信息安全如何预防?

随着科技的不断进步,LED屏幕在我们生活和工作中扮演着越来越重要的角色,然而,随之而来的是信息安全面临的挑战。为了有效预防LED屏幕信息的泄露和被盗取,我们需要采取一系列的安全措施。以下是一些建议: 物理安全措施&…

用C++和python混合编写数据采集程序?

之前看过一篇文章,主要阐述的就是多种语言混合编写爬虫程序,结合各种语言自身优势写一个爬虫代码是否行得通?觉得挺有意思的,带着这样的问题,我尝试着利用我毕生所学写了一段C和python混合爬虫程序,目前运行…

对于Windows就是找不到 环境变量 的解决

我认为将“我的电脑”从桌面上隐藏掉纯粹是傻逼行为 说下解决办法: 1. 找到文件资源管理器, 2. 右键点击“此电脑” -- 选择属性: 3. 进入属性界面,应该进入的是“关于”界面:选择“高级系统设置”: 4. 终…

ssm+vue的罪犯信息管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的罪犯信息管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

STM32---MDK工程创建

本节我们带领大家学习如何新建一个寄存器库版本MDK的详细步骤; 由于51单片机的学习时,所涉及的寄存器很少,所以往往几个头文件、驱动文件就可以完成相关的功能,但是对于STM32来讲,涉及的寄存器、头文件等都很多&#…

导入seaborn的数据集方法load_datasets的问题

sns.load_dataset使用报错解决URLError: <urlopen error [Errno 11004] getaddrinfo failed>(windows)) import seaborn as sns import matplotlib.pyplot as plt ​ # 使用Seaborn自带的数据集 tips sns.load_datas…

Filebeat使用指南

Filebeat介绍主要优势主要功能配置日志的解析Kibana中设置日志解析安装步骤安装Filebeat安装监控通过prometheus监控 Filebeat和Logstash的主要区别 Filebeat介绍 Filebeat是使用Golang实现的轻量型日志采集器,也是Elasticsearch stack的一员。它可以作为一个agent…

CSS BFC特性和应用

目录 1,介绍2,BFC布局规则3,创建BFC4,BFC应用1,浮动子元素使父级高度坍塌2,非浮动元素被浮动元素覆盖3,margin 合并1,父子 margin 合并:父级和第1个/最后1个子元素2&…