当前位置: 首页 > news >正文

流量回放-The Big Picture

一、大背景是什么

微服务架构的同时,服务自身依赖的第三方服务、数据越来越多。

传统的自测/测试方式面临困难

  1. 被依赖的线下服务不稳定;
  2. 服务无法提供期望的响应数据;
  3. 缺少场景构造标准;

传统的解决方式

  1. 提高环境稳定性:服务不稳定的情况仍无法避免;
  2. 自己构造数据、改代码注入object:繁杂;
  3. 想当然的构造场景:场景构造不充分、心里没底;

上述问题导致了代码质量下降、自测/测试困难,在业务越来越复杂,依赖服务越来越多的大环境下,这些问题变得越加严重,已经到了必须要升级解决方案的地步。

二、The big picture

托管被测服务,利用线上流量来测试。

  • 服务托管:

服务被托管,其外部依赖被mock,程序的运行环境不再依赖第三方服务,解决环境的不稳定问题;

被托管的服务被提前录制的线上流量测试,第三方依赖也由线上流量mock,解决第三方响应数据难构造、缺少场景构造标准的问题;

  • 线上流量:

线上流量被提前录制,请求和对应的第三方交互数据也被正确group起来。

三、技术方案

1、服务托管

  • 利用iptables进行托管

利用iptables在系统层面对服务进行托管,服务所有的第三方交互被iptables拦截后mock;好处是通用,对服务的语言无要求,坏处是只能托管网络流量。

  • 利用libc、程序网络库等托管

通过hook掉libc中的connect\send\rcv等函数对服务进行托管。好处是可托管网络流量外的如文件读取类流量,坏处是不同的语言hook的方式需要定制,如php用libc方式,go需要修改语言库。

同时,我们会hook掉系统时间调用,让被托管服务回到线上流量的时间。

2、线上流量录制

线上流量,包含服务的请求流量及第三方交互流量。仅有服务的请求流量是不够的,同时,其第三方交互需要被正确的和请求关联,这里要解决的难题是如何在网络层缺少关联id(traceid在应用层,且redis/mysql数据缺少traceid)的情况下,正确的关联请求及其第三方交互。

  • 利用时间gap来关联

将一台线上机器服务的请求串行化,请求之间加上一个时间gap,则两个请求之间的第三方交互可以和这个请求正确关联。

好处是通用,不区分程序语言,代码侵入性小;坏处是会增加一些运维成本和机器资源;对于不同协议的服务需要定制不同的串行方案,如http采用nginx+lua,thrift采用服务内转发。

  • 利用threadid 来关联

通过hook掉libc中的connect\send\rcv等函数,将相同threadid的流量进行关联。

好处是可以做到并行,录制速度快,case丰富,无资源浪费,对部署架构无影响;坏处是对服务的处理模型有要求,适用于请求、第三方交互都处于同一线程的处理模型,目前在php-fpm处理模型中应用得较好。

相关文章:

  • 【Git总结大全】git操作从入门到实战(总结篇)
  • 【ansible第三次作业】
  • postgres源码解析 缓冲池管理器--1
  • 干货| 算法工程师常见问题(基础算法篇)
  • 机器学习笔记之高斯混合模型(四)EM算法求解高斯混合模型(M步操作)
  • Jupyter 介绍
  • Code For Better 谷歌开发者之声——Google Play
  • 【好书推荐】程序是怎样跑起来的
  • 关于技术分享及内卷
  • 源码解析Java数组如何选择排序的算法
  • java计算机毕业设计基于安卓Android微信小程序的共享单车租赁系统uniApp
  • TCP 的自然律
  • Cobalt Strike 注入msf会话
  • C语言字符串函数简单介绍
  • MySQL高级篇——日志
  • 「译」Node.js Streams 基础
  • 2017-09-12 前端日报
  • 2017年终总结、随想
  • Android单元测试 - 几个重要问题
  • Facebook AccountKit 接入的坑点
  • fetch 从初识到应用
  • golang 发送GET和POST示例
  • JavaScript HTML DOM
  • JS 面试题总结
  • npx命令介绍
  • Python中eval与exec的使用及区别
  • React-生命周期杂记
  • vue中实现单选
  • webpack+react项目初体验——记录我的webpack环境配置
  • WebSocket使用
  • 爬虫模拟登陆 SegmentFault
  • 前端路由实现-history
  • 使用Gradle第一次构建Java程序
  • 使用putty远程连接linux
  • 小程序开发之路(一)
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $$$$GB2312-80区位编码表$$$$
  • $.ajax()
  • (+4)2.2UML建模图
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (区间dp) (经典例题) 石子合并
  • (三)mysql_MYSQL(三)
  • (三分钟)速览传统边缘检测算子
  • ***检测工具之RKHunter AIDE
  • .“空心村”成因分析及解决对策122344
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 服务 ServiceController