edyang

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

高性能研究:减少对象分配之前先量化来源

看到垃圾回收耗时就建立对象池,可能增加共享状态和内存保留,反而让程序更复杂。

看到垃圾回收耗时就建立对象池,可能增加共享状态和内存保留,反而让程序更复杂。 本文使用有限容量的 Java 服务与固定输入的实验负载。性能问题需要同时看吞吐、排队、错误和延迟分布。示例数字用于演算与设计实验,不代表任何真实系统已经达到的性能成绩。 1. 从现象推到机制 对象分配速率、存活时间和保留链共同影响回收成本。短命小对象可能很便宜,长寿命大对象才是另一类问题。对象池延长生命周期,...

高性能框架研究:Disruptor 的序号比环形数组更关键

环形数组只是存储形式。

环形数组只是存储形式。多生产者和消费者如何知道哪些位置可以复用,才是关键协调问题。 本文使用有限容量的 Java 服务与固定输入的实验负载。性能问题需要同时看吞吐、排队、错误和延迟分布。示例数字用于演算与设计实验,不代表任何真实系统已经达到的性能成绩。 1. 从现象推到机制 Disruptor(环形队列框架)通过序号表达发布与消费进度,生产者不能覆盖仍被消费者使用的槽位。预分配减少部分...

Redis 缓存研究:热键与大值分别怎样拖慢系统

单个键访问过于集中和单个值过大,是不同的压力来源,处理方式不能混用。

单个键访问过于集中和单个值过大,是不同的压力来源,处理方式不能混用。 本文使用Redis 3.0 与 Java 应用,代码为协议命令或流程示意。缓存保存的是可重建视图还是关键状态,决定了失效和故障时的处理。本文先以数据库为权威来源,不把缓存命中等同于业务事实已经确认。 1. 从现象推到机制 热键主要聚集请求与带宽,大值则增加传输、序列化和某些操作的阻塞成本。平均键大小或总体命中率可能掩...

Redis 缓存研究:热点过期后的回源洪峰

一个热点键过期后,大量请求同时查数据库,缓存本身正常也可能让下游承受突发压力。

一个热点键过期后,大量请求同时查数据库,缓存本身正常也可能让下游承受突发压力。 本文使用Redis 3.0 与 Java 应用,代码为协议命令或流程示意。缓存保存的是可重建视图还是关键状态,决定了失效和故障时的处理。本文先以数据库为权威来源,不把缓存命中等同于业务事实已经确认。 1. 从现象推到机制 击穿来自同一热点缺失时的并发重建。单次重建合并、短期旧值与有限等待都可减少重复工作,但...

Redis 缓存研究:先更新数据库再删缓存仍有竞争

Cache Aside(旁路缓存)常用数据库更新后删除缓存,但并发读写仍可能产生短暂陈旧值。

Cache Aside(旁路缓存)常用数据库更新后删除缓存,但并发读写仍可能产生短暂陈旧值。 本文使用Redis 3.0 与 Java 应用,代码为协议命令或流程示意。缓存保存的是可重建视图还是关键状态,决定了失效和故障时的处理。本文先以数据库为权威来源,不把缓存命中等同于业务事实已经确认。 1. 从现象推到机制 读取方可能在删除前读到旧数据库值,却在删除后把它写回缓存。缓存与数据库不...

分库分表研究:全局排序和聚合会付出什么成本

每个分片取二十条后拼起来,不能直接当成全局第二页。

每个分片取二十条后拼起来,不能直接当成全局第二页。跨分片排序需要统一比较和边界。 本文使用关系数据库的逻辑分片演算与路由伪代码。分片把单点容量问题变成数据路由与跨分片协调问题。先确定业务访问模式和事务边界,再决定是否值得承担新的复杂度。 1. 从现象推到机制 全局有序结果可以从各分片候选集合归并,但深分页可能需要读取越来越多候选。聚合计数与金额也需要同口径和一致性窗口。部分分片失败时,...

分布式编号研究:时间、节点与序号的约束

分库后自增编号不再天然全局唯一。

分库后自增编号不再天然全局唯一。组合式编号方案也有节点分配和时钟边界。 本文使用关系数据库的逻辑分片演算与路由伪代码。分片把单点容量问题变成数据路由与跨分片协调问题。先确定业务访问模式和事务边界,再决定是否值得承担新的复杂度。 1. 从现象推到机制 时间字段、节点字段与局部序号可以组合成有序编号,但位宽决定容量和生命周期。节点号重复会冲突,时钟回退也可能使旧时间片重新出现。全局唯一与严...

分库分表研究:分片键要跟主要查询走

按用户分片后,按订单号查询却不知道去哪一库。

按用户分片后,按订单号查询却不知道去哪一库。分片键选择决定后续访问成本。 本文使用关系数据库的逻辑分片演算与路由伪代码。分片把单点容量问题变成数据路由与跨分片协调问题。先确定业务访问模式和事务边界,再决定是否值得承担新的复杂度。 1. 从现象推到机制 一个路由键能让高频访问落到单分片,却可能让其他查询需要广播。分片键还影响数据倾斜与跨实体事务。订单号若不含路由信息,可以维护可靠索引映射...

Netty 研究:ByteBuf 的引用计数与跨线程传递

内存增长不一定出现在 Java 堆里。

内存增长不一定出现在 Java 堆里。使用直接缓冲区时,引用计数释放责任尤其重要。 本文使用JDK 8 与 Netty 4.0,代码为处理器结构片段。TCP(传输控制协议)提供有序字节流,消息边界和处理线程仍由应用协议与框架约定。网络读到数据与业务处理完成需要分别观察。 1. 从现象推到机制 ByteBuf(字节缓冲区)的引用计数决定何时释放底层资源。部分处理器会自动释放入站消息,跨线...

Netty 研究:EventLoop 里为什么不能随便查数据库

一个通道处理器里执行慢查询,可能拖住同一事件循环负责的其他连接。

一个通道处理器里执行慢查询,可能拖住同一事件循环负责的其他连接。 本文使用JDK 8 与 Netty 4.0,代码为处理器结构片段。TCP(传输控制协议)提供有序字节流,消息边界和处理线程仍由应用协议与框架约定。网络读到数据与业务处理完成需要分别观察。 1. 从现象推到机制 EventLoop(事件循环)负责多个通道的事件处理,阻塞操作会占用这条线程。业务工作移到其他执行器后,还要处理...