edyang

我干了什么 究竟拿了时间换了什么
技术分享时间线软件开发、设备接入、视觉与运维实践

Netty 研究:粘包拆包其实是消息边界问题

一次 write 不对应一次 read。

一次 write 不对应一次 read。TCP 接收端看到的是字节流,需要协议自己定义消息边界。 本文使用JDK 8 与 Netty 4.0,代码为处理器结构片段。TCP(传输控制协议)提供有序字节流,消息边界和处理线程仍由应用协议与框架约定。网络读到数据与业务处理完成需要分别观察。 1. 从现象推到机制 消息可能被拆成多次读取,也可能多条一起到达。固定长度、分隔符与长度字段是不同编码...

高并发研究:平均延迟会遮住哪些问题

大多数请求很快,少部分等待数秒,平均值仍可能看起来不错。

大多数请求很快,少部分等待数秒,平均值仍可能看起来不错。用户遇到的尾部延迟不能被平均掉。 本文使用有限容量的 Java 服务与固定输入的实验负载。性能问题需要同时看吞吐、排队、错误和延迟分布。示例数字用于演算与设计实验,不代表任何真实系统已经达到的性能成绩。 1. 从现象推到机制 分位数描述分布位置,不同接口和请求规模混合后会失去解释性。排队、垃圾回收和慢依赖都可能制造尾部。多个服务的...

高并发研究:压测客户端也可能掩盖过载

固定几个线程等响应再发下一次请求,服务变慢时客户端发得也更慢,可能掩盖真实排队压力。

固定几个线程等响应再发下一次请求,服务变慢时客户端发得也更慢,可能掩盖真实排队压力。 本文使用有限容量的 Java 服务与固定输入的实验负载。性能问题需要同时看吞吐、排队、错误和延迟分布。示例数字用于演算与设计实验,不代表任何真实系统已经达到的性能成绩。 1. 从现象推到机制 闭环负载的下一次请求依赖上次完成,开放式到达模型则按计划产生流量。两种模型回答不同问题。只统计已完成请求,会忽...

高并发研究:用 Little 定律理解在途请求

吞吐没有提高,请求数却越积越多,通常意味着系统在用排队换取更长等待。

吞吐没有提高,请求数却越积越多,通常意味着系统在用排队换取更长等待。 本文使用有限容量的 Java 服务与固定输入的实验负载。性能问题需要同时看吞吐、排队、错误和延迟分布。示例数字用于演算与设计实验,不代表任何真实系统已经达到的性能成绩。 1. 从现象推到机制 稳定系统中,平均在途数量约等于到达率乘平均停留时间,单位必须一致。它描述长期平均关系,不保证突发峰值。若进入速率长期超过完成速...

Spring Cloud 隔离:慢服务不能占满全部请求容量

多个接口共享一个执行池,一个非关键依赖变慢后,也可能挤占关键业务的线程。

多个接口共享一个执行池,一个非关键依赖变慢后,也可能挤占关键业务的线程。 本文使用Spring Cloud Brixton 与匹配的 Spring Boot 1.3,示例为调用流程。服务治理需要同时考虑入口、调用链和下游容量。本文讨论 Zuul、Ribbon 与 Hystrix 这一时期的技术组合,不引入后续的网关和容错框架。 1. 从现象推到机制 舱壁式隔离把不同依赖的并发资源分开,...

Spring Cloud 调用链:每层超时要服从总预算

三层服务各自超时一秒,加上重试后,用户可能等待远超一秒。

三层服务各自超时一秒,加上重试后,用户可能等待远超一秒。调用预算必须沿链路分配。 本文使用Spring Cloud Brixton 与匹配的 Spring Boot 1.3,示例为调用流程。服务治理需要同时考虑入口、调用链和下游容量。本文讨论 Zuul、Ribbon 与 Hystrix 这一时期的技术组合,不引入后续的网关和容错框架。 1. 从现象推到机制 入口截止时间需要覆盖排队、连...

Spring Cloud Zuul:路径转发与业务权限的边界

网关能把请求转到服务,不代表被调接口就可以省略数据权限检查。

网关能把请求转到服务,不代表被调接口就可以省略数据权限检查。 本文使用Spring Cloud Brixton 与匹配的 Spring Boot 1.3,示例为调用流程。服务治理需要同时考虑入口、调用链和下游容量。本文讨论 Zuul、Ribbon 与 Hystrix 这一时期的技术组合,不引入后续的网关和容错框架。 1. 从现象推到机制 Zuul(入口路由组件)根据路径等规则选择后端,...

Spring Boot 定时任务:多实例会不会重复执行

单机时每天运行一次,部署两个实例后可能运行两次。

单机时每天运行一次,部署两个实例后可能运行两次。调度注解只描述本实例的触发。 本文使用Spring Boot 1.3、JDK 8 与关系数据库,片段需要补齐工程配置。框架提供装配和运行入口,容量、任务归属与故障恢复仍需要应用明确设计。本文采用一代 Spring Boot 配置,相关默认值只在给定版本范围内讨论。 1. 从现象推到机制 每个应用实例都可能建立自己的定时器。需要全局只执行一...

Spring Boot 异步方法:线程边界会带走哪些上下文

把慢操作标为异步后,请求很快返回,但任务仍可能失败,而且原事务不会自动随线程移动。

把慢操作标为异步后,请求很快返回,但任务仍可能失败,而且原事务不会自动随线程移动。 本文使用Spring Boot 1.3、JDK 8 与关系数据库,片段需要补齐工程配置。框架提供装配和运行入口,容量、任务归属与故障恢复仍需要应用明确设计。本文采用一代 Spring Boot 配置,相关默认值只在给定版本范围内讨论。 1. 从现象推到机制 @Async 依赖代理调用与执行器,异步线程有...

Spring Boot 性能:连接池大不等于数据库更快

请求排队时把连接池翻倍,可能把等待从应用移到数据库,并增加锁竞争。

请求排队时把连接池翻倍,可能把等待从应用移到数据库,并增加锁竞争。 本文使用Spring Boot 1.3、JDK 8 与关系数据库,片段需要补齐工程配置。框架提供装配和运行入口,容量、任务归属与故障恢复仍需要应用明确设计。本文采用一代 Spring Boot 配置,相关默认值只在给定版本范围内讨论。 1. 从现象推到机制 数据库能有效处理的并发取决于查询成本、锁和资源。连接池是有限许...