微服务架构中的 Trace 原理
一、背景
在单体架构时代,一个请求的所有逻辑都在同一个进程中执行,调试和排查问题相对简单:查看日志、打断点、分析堆栈,基本能定位到问题所在。
但在微服务架构下,一个用户请求可能会经过网关、认证服务、订单服务、支付服务、库存服务等多个服务。当请求失败或响应缓慢时,问题可能出现在链路中的任何一个环节:
在单体架构时代,一个请求的所有逻辑都在同一个进程中执行,调试和排查问题相对简单:查看日志、打断点、分析堆栈,基本能定位到问题所在。
但在微服务架构下,一个用户请求可能会经过网关、认证服务、订单服务、支付服务、库存服务等多个服务。当请求失败或响应缓慢时,问题可能出现在链路中的任何一个环节:
工作中接触了微服务架构,大多基于 Java 或 Go。作为 Rust 爱好者,想尝试用 Rust 写一套适合实际业务的微服务框架。另外我自己写了一个记账App一直在运行中,自己也一直在用,于是刚好用Rust和微服务架构来重构一下。Rust上并没有已有的成熟微服务框架,于是我刚好自己去实现(或者说接入)微服务通信、上下文处理、trace等功能,来加深对微服务系统的理解。
在比对两张图片的相似度时,有很多相似度指标例如aHash、pHash、dHash、SSIM等,SSIM比较常用。而我在想能不能用一个深度学习模型来解决这件事,让它能忽略一些能接受的小差异,但是向数字有变化这种差异即使在像素上很小,也能检测到。我发现孪生网络比较合适。
在调研精准测试方案时,我们发现测试用例、代码函数、依赖关系等本质上都是图结构:测试用例调用类中的函数,函数之间存在调用依赖。Neo4j 作为最流行的原生图数据库,非常适合用来存储这些调用和依赖关系。
Finetest 是一个基于 Python + Selenium + pytest 的 Web 自动化测试框架,框架集成了智能元素定位、可视化回归测试、用例录制回放、文件对比等功能,旨在降低 UI 自动化测试的门槛,降低维护成本,提高测试效率。
发现了一个有意思的库:rrweb(record and replay the web)。
rrweb 是一个开源的 js 库,可以记录用户在网页上的所有操作,然后完整地回放出来。
就像给用户在网页上的操作录了个视频,但实际上它并不是真的录屏,而是通过记录 DOM 变化、用户交互等事件,然后在回放时重新渲染出来。