尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

网络故障注入实战:用Bean Network Tester模拟延迟、丢包与弱网

网络故障注入实战:用Bean Network Tester模拟延迟、丢包与弱网 1. 为什么需要一台「网络破坏机」先聊聊故障注入的价值在微服务架构和分布式系统大规模普及的今天网络已经不再是简单的一条链路而是连接服务、数据库、缓存、消息队列和第三方 API 的复杂网状结构。然而大多数开发者在本地开发时面对的都是“网络质量极佳”的 ideal 环境延迟低、带宽高、丢包率几乎为零、中间设备完全透明。这种美好环境掩盖了大量真实问题一次正常的 HTTP 调用在本地只需要 5ms但到了生产环境跨可用区调用可能就是 50ms超时时间设置不合理就会导致连锁失败。客户端没有配置重试机制网络抖动一次就导致请求直接失败。服务端连接池配置过小在高延迟场景下连接被占满新请求全部排队甚至拒绝。缓存穿透、雪崩等经典问题本质上都发生在网络和资源出现异常的时刻。移动端用户在地铁、电梯、地下室等弱网环境下App 的表现完全不同于 Wi-Fi 下的表现。这些问题在正常情况下极难复现因为你不能把生产环境的交换机拔了来测试也不方便在办公网里人为制造丢包。这正是**故障注入Fault Injection和混沌工程Chaos Engineering**要解决的问题在受控环境中主动制造网络异常提前暴露系统的脆弱点。Bean Network Tester 就是这样一个开源的“坏网络模拟器”。它允许你在一台主机上模拟各种恶劣网络条件然后让被测系统在这条链路上跑业务从而观察系统的表现。本文将围绕这个工具完整拆解它的核心原理、部署方法、实战用法和工程落地建议。阅读本文你将掌握Bean Network Tester 是什么它和 tc、Chaos Mesh 等工具有什么区别。如何在一台 Linux 主机上快速安装并运行它。如何通过配置文件模拟延迟、丢包、带宽限制、抖动等场景。如何把它接入自己的测试环境用于压测、联调和 CI。常见故障的排查思路和工程最佳实践。无论你是后端开发、测试工程师、SRE还是对混沌工程感兴趣的初学者这篇教程都能给你一条清晰的上手路径。2. Bean Network Tester 核心概念与工作原理2.1 什么是 Bean Network TesterBean Network Tester 是一个开源的网络故障注入工具通过可视化的方式模拟慢速网络、丢包、高延迟、带宽限制等不良网络条件。它的目标用户是需要在本地或测试环境验证系统鲁棒性的开发者。简单理解它就像一个“网络破坏开关”。在正常网络状态下你的软件跑得很快打开 Bean Network Tester 后你可以在指定网卡上施加各种“破坏动作”让经过这条链路的流量变慢、丢失或拥塞从而观察依赖方是否能够正确处理异常。这类工具在行业里有一个专门的分类叫Network Fault Injection Tool属于故障注入工具链中的一种。与之类似的商业产品有 Toxiproxy、 clumsian 等而传统 Linux 管理员更熟悉的是内核自带的tcTraffic Control命令。2.2 它解决什么问题Bean Network Tester 主要解决以下几类问题弱网环境模拟移动端开发中模拟 3G、4G 网络下 App 的表现验证超时、重试、降级策略是否合理。分布式系统韧性验证在微服务调用链路中注入延迟和丢包观察熔断器、限流器、超时控制是否按预期工作。数据库连接池压测模拟数据库网络延迟验证连接池参数是否需要调整。第三方 API 集成测试模拟外部 API 响应缓慢验证调用方是否设置了合理的超时时间。CI/CD 流水线回归测试在自动化测试中故意注入网络故障确保每次发布不会引入新的网络相关问题。这些场景的共同点在于你不希望等到生产环境出了事故才去被动排查而是希望在开发测试阶段就主动暴露问题。2.3 核心工作原理Bean Network Tester 底层依赖 Linux 内核的流量控制子系统tc。tc是一个非常强大的工具它允许管理员在网卡上配置队列规则qdisc从而控制数据包的发送、延迟、丢弃和重排。当我们使用 Bean Network Tester 时本质上是做了这样一件事指定要影响的网卡设备比如eth0。确定目标 IP 或目标端口限定影响范围。添加一个netemNetwork Emulator队列规则。按配置参数模拟延迟、抖动、丢包、带宽限制等。业务流量经过该网卡时被相应规则处理。下图用 ASCII 简图展示流量路径变化正常情况 应用进程 -- 内核网络栈 -- 网卡 -- 对端 开启 Bean Network Tester 后 应用进程 -- 内核网络栈 -- netem 队列规则 -- 网卡 -- 对端 | |-- 增加延迟 |-- 随机丢包 |-- 限速注意netem 只会影响“经过该网卡”的流量。如果你只希望影响某个服务的流量就需要通过目标 IP 和端口做精确匹配。2.4 与常见工具的对比为了帮助你更好地理解 Bean Network Tester 的定位我把常见网络故障注入工具做一个对比工具实现方式优点局限Bean Network Tester封装 tc/netem提供可视化界面上手快适合开发自测需要 Linux 主机能力受限于内核tc 命令Linux 内核自带灵活无额外依赖命令复杂容易误操作Toxiproxy本地代理跨平台支持 HTTP/TCP需要应用程序修改连接指向Chaos MeshKubernetes CRD云原生集成好能力强依赖 Kubernetes 集群网络损伤仪硬件物理设备精度高支持大型测试价格昂贵部署复杂Bean Network Tester 的最大优势在于**“低门槛 可视化”**它把tc的复杂参数封装成结构化的配置文件和简单的操作界面让没有网络背景的开发者也能够快速使用。3. 环境准备与安装部署3.1 环境要求Bean Network Tester 需要在 Linux 环境下运行因为它依赖tc和内核的 netem 模块。建议使用以下环境操作系统Ubuntu 20.04 / 22.04、CentOS 7 / 8 / Stream 9 或其他主流 Linux 发行版。内核版本建议 4.19 以上新内核对于 netem 的支持更完善。权限需要 root 权限或具有sudo权限的用户因为修改网卡队列规则需要管理员权限。硬件普通虚拟机或物理机即可无需特殊硬件。如果你使用的是 Windows 或 macOS 作为日常开发机建议通过虚拟机、Docker 或云主机创建一个 Linux 环境来运行 Bean Network Tester。需要注意的是Docker 容器内修改宿主机网卡配置受限更推荐直接在虚拟机里操作。3.2 检查内核模块在安装之前先确认内核是否加载了sch_netem模块。执行以下命令lsmod | grep sch_netem如果没有输出需要手动加载sudo modprobe sch_netem同时确认tc命令可用tc -V如果tc不存在需要安装iproute2# Ubuntu / Debian sudo apt update sudo apt install -y iproute2 # CentOS / RHEL sudo yum install -y iproute3.3 获取 Bean Network Tester由于 Bean Network Tester 是开源项目建议直接从项目仓库获取源码。官方仓库地址需要在 GitHub 上搜索Bean Network Tester找到。克隆项目git clone https://github.com/your-fork/bean-network-tester.git cd bean-network-tester注意上面 URL 中的your-fork是示例你需要替换成实际的仓库地址。如果你只是查看源码可以直接访问 GitHub 页面。3.4 安装系统依赖根据项目的技术栈不同依赖可能有所不同。以常见的 Python 实现为例安装依赖pip install -r requirements.txt如果项目基于 Node.js则使用npm install由于不同版本的项目依赖不同这里不写死具体的包名。最稳妥的方式是查看项目 README 中的安装说明。3.5 快速启动一般情况下Bean Network Tester 会提供一个启动入口。假设它是一个 Python 项目python main.py或者基于 Node.jsnode server.js启动后它会监听一个本地端口。默认情况下打开浏览器访问http://localhost:port即可看到管理界面。如果你更习惯通过命令行使用可以查看项目是否提供了 CLI 模式。通常 CLI 模式适合写进自动化脚本。4. 配置项拆解如何模拟各种网络故障Bean Network Tester 的核心能力就在于配置网络扰动参数。下面我们把最常见的场景逐一拆解。4.1 模拟网络延迟网络延迟是最常见的故障注入方式。它会让每一个数据包在发送前被额外延迟一段时间。在tc netem中对应的配置是tc qdisc add dev eth0 root netem delay 100ms这条命令表示在eth0网卡上添加根队列规则模拟 100ms 的固定延迟。在 Bean Network Tester 中你通常只需要在配置文件中写network: interface: eth0 delay: enabled: true time: 100ms应用场景模拟用户访问跨地域机房的场景。验证数据库查询超时是否合理。验证 API 调用的兜底策略。4.2 模拟延迟抖动Jitter真实网络环境的延迟并不是固定的而是有波动的。延迟抖动会让请求的响应时间忽快忽慢对依赖超时判断的程序影响很大。tc qdisc add dev eth0 root netem delay 100ms 20ms这条命令表示延迟在 100ms 基础上随机波动 20ms即实际延迟在 80ms 到 120ms 之间。在 Bean Network Tester 配置文件中network: interface: eth0 delay: enabled: true time: 100ms jitter: 20ms注意抖动值不宜超过延迟值否则可能出现延迟为 0 甚至负数的异常情况导致内核行为不符合预期。4.3 模拟丢包丢包是网络故障中最严重的一种。它会导致 TCP 重传、请求超时、连接断开等一系列问题。tc qdisc add dev eth0 root netem loss 10%这条命令表示随机丢弃 10% 的数据包。配置文件写法network: interface: eth0 loss: enabled: true percentage: 10在真实场景中丢包不是完全均匀的而是存在突发性。如果有需要可以使用loss 10% 25%表示丢包率在 10% 基础上随机浮动。4.4 模拟带宽限制带宽限制用于模拟弱网环境比如 3G 网络下只有几百 KB/s 的带宽。tc实现带宽限制需要配合 TBFToken Bucket Filter或 HTB 队列规则。Bean Network Tester 封装了这部分逻辑你只需要指定速率network: interface: eth0 bandwidth: enabled: true rate: 100kbps这个配置会让经过eth0的流量速率被限制在 100kbps。对于视频播放、文件下载、大对象传输等场景这个配置可以很好地模拟弱网。4.5 组合场景真实网络故障往往是多种异常同时发生的。比如弱网环境不仅带宽低而且延迟高、有丢包。Bean Network Tester 支持组合配置network: interface: eth0 delay: enabled: true time: 200ms jitter: 30ms loss: enabled: true percentage: 5 bandwidth: enabled: true rate: 512kbps这个配置模拟了一个“200ms 延迟 30ms 抖动 5% 丢包 512kbps 带宽”的恶劣网络环境非常适合测试移动端 App 在弱网下的表现。4.6 指定目标 IP / 端口实际上你通常不希望影响所有流量否则 SSH 连接都可能断开。更好的做法是指定目标范围。在 Bean Network Tester 中可以配置只影响某个 IP 或端口network: interface: eth0 target: ip: 192.168.1.100 port: 8080 delay: enabled: true time: 100ms这样做的好处是测试流量被干扰但管理流量比如 SSH不受影响降低操作风险。4.7 清除规则测试结束后必须清理队列规则恢复网络正常tc qdisc del dev eth0 root在 Bean Network Tester 中界面上通常会提供“停止”或“重置”按钮。如果是命令行模式也一定有对应的reset或clear子命令。特别提醒多个tc规则叠加时容易冲突。如果之前已经添加过根规则再添加新规则会报错RTNETLINK answers: File exists。此时需要先删除旧的根规则再添加新的。5. 完整实战用 Bean Network Tester 验证一个 HTTP 服务的超时和重试机制理论讲得再多不如一次完整实战。这里我们设计一个典型场景一个订单服务调用库存服务库存服务偶发延迟。我们希望用 Bean Network Tester 模拟库存服务的网络延迟验证订单服务的超时和重试机制是否合理。5.1 测试架构整个测试环境由三部分组成被测系统一个简单的订单服务通过 HTTP 调用库存服务。目标系统一个库存服务提供一个查询库存接口。故障注入工具Bean Network Tester部署在同一台 Linux 主机上影响订单服务到库存服务的网络链路。订单服务 -- 网络 -- Bean Network Tester -- 库存服务 10.0.0.1 10.0.0.2这里的关键点Bean Network Tester 必须部署在流量路径上。如果两个服务都在本机可以通过修改路由表实现流量经过指定的网卡。5.2 准备库存服务我们用 Python Flask 写一个极简库存服务# 文件路径inventory_service/app.py from flask import Flask, jsonify import time import os app Flask(__name__) INVENTORY { sku_1001: 20, sku_1002: 35, sku_1003: 10, } app.route(/api/inventory/sku_id, methods[GET]) def get_inventory(sku_id): # 模拟数据库查询耗时 time.sleep(0.01) if sku_id not in INVENTORY: return jsonify({code: 404, message: sku not found}), 404 return jsonify({code: 0, data: {sku_id: sku_id, stock: INVENTORY[sku_id]}}) if __name__ __main__: app.run(host0.0.0.0, port9001)启动库存服务cd inventory_service pip install flask python app.py5.3 准备订单服务订单服务通过requests调用库存服务并设置了超时和重试逻辑# 文件路径order_service/app.py from flask import Flask, jsonify import requests from requests.adapters import HTTPAdapter app Flask(__name__) def create_session_with_retries(): session requests.Session() adapter HTTPAdapter(max_retries2) session.mount(http://, adapter) return session session create_session_with_retries() app.route(/api/order/check/sku_id, methods[GET]) def check_stock(sku_id): try: resp session.get( fhttp://10.0.0.2:9001/api/inventory/{sku_id}, timeout(1, 2) # 连接超时 1s读取超时 2s ) data resp.json() if data[code] 0: return jsonify({result: success, stock: data[data][stock]}) return jsonify({result: sku_not_found}), 404 except requests.Timeout: return jsonify({result: timeout}), 504 except requests.RequestException: return jsonify({result: unavailable}), 503 if __name__ __main__: app.run(host0.0.0.0, port9002)启动订单服务cd order_service pip install flask requests python app.py5.4 部署 Bean Network Tester假设 Bean Network Tester 已经安装在一台 Linux 主机上且该主机的eth0网卡 IP 为10.0.0.1。库存服务 IP 为10.0.0.2。我们通过 Bean Network Tester 添加一个延迟规则只影响去往库存服务的流量network: interface: eth0 target: ip: 10.0.0.2 port: 9001 delay: enabled: true time: 3000ms这里故意把延迟设置为 3 秒远远超过订单服务设置的 2 秒读取超时用来验证超时逻辑。5.5 执行测试步骤 1正常情况确认接口可用。curl http://10.0.0.1:9002/api/order/check/sku_1001预期返回{result:success,stock:20}步骤 2启动 Bean Network Tester 的延迟规则。步骤 3再次调用订单接口。curl http://10.0.0.1:9002/api/order/check/sku_1001预期返回{result:timeout}因为 3 秒延迟已经超过了订单服务设置的 2 秒读取超时。步骤 4观察库存服务的日志可以看到收到了请求但没有足够快的响应再观察订单服务日志可以看到发生了超时。5.6 测试结论与调优方向这个实验暴露了一个问题订单服务的 2 秒超时时间在本地网络环境是合理的但如果库存服务部署在跨地域机房2 秒可能远远不够。通过 Bean Network Tester 的模拟你可以在测试阶段就发现超时阈值不合理、重试次数不足、或者重试触发后仍然失败等问题。调优方向将超时时间调整为更符合生产的阈值比如 5 秒。在超时后增加降级逻辑返回缓存中的库存数据。对下游依赖做熔断避免线程池被长时间占用。将同步调用改成异步消息降低对实时性的要求。5.7 断开网络场景除了延迟还可以尝试完全断开网络network: interface: eth0 target: ip: 10.0.0.2 port: 9001 loss: enabled: true percentage: 100100% 丢包等于网络完全不可达。此时订单服务的表现取决于连接超时的设置。如果连接超时设置为 1 秒那么每次请求会快速失败并触发重试。重试两次后最终返回unavailable。这个场景可以检验当下游完全不可用时你的服务是否能快速失败避免线程资源耗尽。6. 在 CI/CD 流水线中集成 Bean Network Tester手动测试环境已经跑通下一步就是把网络故障注入纳入自动化流程。这样每次代码变更后都能自动执行一轮“网络韧性测试”。6.1 集成方式的两种选择方式一独立测试 Job在 CI 流水线中专门创建一个 job 来执行故障注入测试。这个 job 与主测试流程并行或串行执行但拥有独立的测试环境。优点环境隔离不影响其他测试。 缺点需要额外的资源且耗时长。伪代码示例以 GitLab CI 为例stages: - test - fault-injection fault-injection: stage: fault-injection script: - ssh usernetwork-tester-host cd /opt/bean-network-tester ./bean reset ./bean apply --config weak-network.yaml - pytest tests/test_order_service.py --timeout120 - ssh usernetwork-tester-host cd /opt/bean-network-tester ./bean reset after_script: - ssh usernetwork-tester-host cd /opt/bean-network-tester ./bean reset rules: - if: $CI_COMMIT_BRANCH main注意这里的after_script非常重要。它确保即使测试失败也会执行规则清理命令防止网络故障残留影响后续任务。方式二测试脚本内动态控制如果 Bean Network Tester 提供了 HTTP API测试脚本可以直接调用该 API 动态修改网络规则。这样可以将故障注入时间点精确嵌入到测试用例中。import requests def enable_latency(): requests.post( http://network-tester-host:9090/api/apply, json{interface: eth0, delay: {time: 200ms}} ) def disable_all(): requests.post(http://network-tester-host:9090/api/reset)在测试用例中def test_order_service_timeout(): enable_latency() try: resp requests.get(http://order-service:9002/api/order/check/sku_1001) assert resp.json()[result] timeout finally: disable_all()这种方式可控性更强但要求 Bean Network Tester 开放了 HTTP 控制接口。如果没有也可以通过 SSH 远程执行命令来达到同样效果。6.2 集成时的注意事项测试环境必须干净故障注入会修改系统网络配置因此 CI 用的网络故障注入主机不建议与其他测试共用。规则清理必须兜底无论测试成功还是失败都要清理规则。设置超时保护如果网络故障导致测试进程挂起CI 的整体超时时间要合理设置防止 job 卡住数小时。日志留痕记录每次故障注入的参数、时间、测试结果方便追溯。只影响目标流量一定通过 IP、端口做限定避免把 CI 基础设施的网络也搞挂。7. 常见问题与排查思路Bean Network Tester 使用过程中很多问题并不是工具本身的 bug而是 Linux 网络栈或tc使用方式的问题。下面整理常见问题。问题现象常见原因解决思路启动时报错RTNETLINK answers: File exists网卡上已存在根 qdisc 规则先执行tc qdisc del dev eth0 root清理再重新添加配置了延迟但测试无效果目标 IP/端口匹配范围不对或流量未经过指定网卡用tc -s qdisc show dev eth0确认规则生效情况用tcpdump检查流量路径SSH 连接断开延迟/丢包配置影响了管理流量限制目标 IP 范围不要把规则应用到所有流量模拟带宽不准确netem 的 bandwidth 参数是附加到 TBF 的可能存在误差通过 iperf3 实际测量验证效果删除规则后网络仍异常存在多条 qdisc 规则或规则删除顺序不对用tc qdisc show查看所有规则逐一清理Docker 容器内无法添加规则容器缺少 NET_ADMIN 权限或宿主机不允许修改在宿主机上运行 Bean Network Tester或给容器加--cap-addNET_ADMIN高丢包率导致 CPU 占用高大量重传和队列处理消耗 CPU使用更精确的丢包配置避免长时间使用极端参数内核版本过旧某些参数不支持netem 功能随内核版本演进升级内核或使用旧版功能替代7.1 如何确认规则真的生效了一个很常见的问题是配置了规则但业务表现没有变化。这时需要用下面命令确认tc -s qdisc show dev eth0输出示例qdisc netem 8001: root refcnt 2 limit 1000 Sent 123456 bytes 789 pkt (dropped 12, overlimits 0 requeues 0) backlog 0b 0p requeues 0看到qdisc netem且丢包计数在增长说明规则生效了。如果Sent和dropped一直不变说明流量没有经过这个网卡需要检查路由或目标 IP 配置。7.2 排查步骤清单如果你按教程操作但效果不符预期可以按下面顺序排查确认tc -V命令可用内核模块已加载。确认网卡名称正确。可以用ip addr查看网卡列表。确认目标 IP 与你测试的服务地址一致。确认规则没有与其他规则冲突。先tc qdisc del dev eth0 root再添加新规则。用一个简单工具如ping或iperf3单独验证网络是否受影响。如果 ping 延迟正常但 HTTP 请求超时检查应用的连接超时和读取超时配置。查看系统日志/var/log/syslog或dmesg确认有没有内核报错。7.3 避免故障残留测试结束时无论测试成功还是失败都建议执行重置命令。可以在 Bean Network Tester 的配置目录下添加一个自动清理脚本#!/bin/bash # 文件路径reset-network.sh INTERFACE${1:-eth0} tc qdisc del dev $INTERFACE root 2/dev/null tc qdisc show dev $INTERFACE echo Network rules cleared.给脚本加执行权限chmod x reset-network.sh在 CI 中使用时after_script调用它after_script: - ./reset-network.sh eth08. 最佳实践与工程建议8.1 从最小配置开始逐步增加复杂度网络故障注入不是“越狠越好”。第一次使用 Bean Network Tester 时建议先只添加一个低延迟规则比如 50ms观察系统的变化。然后再逐步增加丢包、抖动、带宽限制。这样出现问题的时候你能清楚知道是哪一个参数导致的。8.2 故障注入要限定爆炸半径无论多么有经验的工程师都有可能误操作导致网络恢复困难。因此永远指定目标 IP 和端口不要全局应用规则。在操作前记录当前tc规则方便恢复。对于生产环境如果实在需要必须走变更审批流程并设置自动回滚脚本。# 备份当前规则操作前执行 tc qdisc show dev eth0 /tmp/tc-rules-backup.txt8.3 超时、重试、熔断三者缺一不可Bean Network Tester 可以帮助你验证超时和重试机制但不要止步于此。一个健壮的分布式系统必须具备超时控制为每个下游调用设置合理的连接超时和读取超时。有限重试最多重试 2-3 次且重试之间加入退避时间防止雪崩。熔断器当下游持续失败时快速失败并进入半开状态探测恢复。建议用 Bean Network Tester 分别验证这三种机制的组合效果。8.4 网络测试数据要留痕每次故障注入测试都应该记录注入参数延迟、丢包率、抖动等。注入时间窗口。被测系统的版本、配置。观察到的现象和监控指标。最终结论和调整动作。这些数据沉淀下来就是你团队的“系统韧性档案”。8.5 安全边界在测试环境中使用 Bean Network Tester 是安全的但要清楚地意识到它修改的是 Linux 内核的网络行为如果误用可能导致主机无法远程访问。生产环境变更必须遵守最小权限原则并且要有回滚备案。8.6 结合监控体系一起用单纯注入故障而不观察指标就像一个医生只开药不检查病人。建议在测试时同时观察服务的 P99、P95 延迟。错误率、超时率。线程池活跃线程数。连接池使用率。CPU 和内存占用。通过对比故障注入前后的监控数据才能真正量化系统韧性的变化。9. 总结与下一步学习建议通过本文你已经掌握了 Bean Network Tester 的完整使用路径从理解它的核心原理到安装部署再到配置各种网络故障场景最后把它接入测试环境和 CI 流水线。关键知识点回顾Bean Network Tester 的本质是对 Linuxtc netem的封装用更友好的方式模拟坏网络。常见的故障注入场景包括延迟、抖动、丢包、带宽限制和组合场景。使用故障注入时一定要通过目标 IP 和端口限定影响范围避免把管理网络也搞挂。测试结束后务必清理规则防止故障残留。故障注入的价值不仅在于“找到问题”更在于验证超时、重试、熔断等降级策略是否有效。下一步你可以继续探索的方向混沌工程学习 Chaos Mesh、Litmus 等云原生混沌工程平台把故障注入扩展到 Pod、节点、磁盘等更多维度。性能测试结合 JMeter、Gatling 等压测工具在注入网络故障的同时观察系统吞吐量和延迟的变化。链路追踪接入 SkyWalking、Zipkin 等分布式追踪系统观察故障注入下请求链路的每一跳耗时。容灾演练把 Bean Network Tester 的规则纳入季度容灾演练脚本提高团队处理网络故障的熟练度。动手实践是最好的学习方式。你不需要一开始就搭建复杂的微服务系统只需要准备两台 Linux 虚拟机或者一台虚拟机加一个 Docker 容器在它们之间跑一个简单的 HTTP 服务然后用 Bean Network Tester 模拟一次延迟观察超时现象。当你亲眼看到“一个 3000ms 的延迟就让系统崩溃”的那一刻对分布式系统复杂性的理解会上升一个台阶。如果本文对你有帮助欢迎收藏备用。后续遇到网络模拟相关的问题也可以对照本文的排查清单逐步定位。
返回列表