GZIP 与 Snappy:给 2.5MB 消息做一场减肥实验
同一批 ReportMessage,分别过 GZIP 与 Snappy 的磅秤,记录压缩比、耗时与 CPU 代价。实验数据表明:贪吃是原罪,而压缩是赎罪券——但买哪张券,要看你的 CPU 是否宽裕。
独立之思想 · 自由之技术 · 每周一更
——当单条消息足有 2.5MB,一台 8G 堆的机器该如何抉择
六月的某个深夜,生产环境的报警声响了。队列积压、内存告急,而罪魁祸首竟是我亲手引入的那套消息中间件——每条 ReportMessage 序列化后接近 2.5MB 的体量,将 Broker 的吞吐按在地上反复摩擦。那晚之后我下定决心:与其继续与外部中间件缠斗,不如自建一座轻量的本地邮局。
于是有了 ReportQueueService:一条 LinkedBlockingQueue 作信箱,一个 ThreadPoolExecutor 当邮差。入队只做引用传递,出队即投递,中间不再经过任何网络往返。核心思想极朴素——队列与线程池分离,生产者只管投信,消费者只问回报,二者通过队列解耦,互不拖欠。
内存账本同样值得细算。2.5MB 的消息乘以上千条积压,堆内便是天文数字。于是我把目光投向压缩:GZIP 以 CPU 换空间,胜率稳定在 85% 上下;Snappy 则快得惊人,解压近乎零开销,代价是压缩比略逊三分。最终我选择按消息类型分流:大报文走 Snappy,普通文本走 GZIP——这已经是后话。
任何架构决策都不是单选题。放弃 RabbitMQ 并非因为它不好,而是因为它太重:重依赖、重运维、重心智。在一个消息量可控、单机即可承载的场景里,一个精心设计的本地队列,往往比一套完整的 MQ 体系更配得上"恰当"二字。全文六千字,尽在 技术版 首栏。
同一批 ReportMessage,分别过 GZIP 与 Snappy 的磅秤,记录压缩比、耗时与 CPU 代价。实验数据表明:贪吃是原罪,而压缩是赎罪券——但买哪张券,要看你的 CPU 是否宽裕。
一个链表、一个数组;一个锁内分摊、一个单锁到底。吞吐、竞争、内存碎片……两把尺子量完,结论是:它们差的从来不是性能,而是你对"容量"与"公平"的态度。
从 RestTemplate 到 RestClient,从配置类到自动装配。4.1 带来的不只是版本号,还有一整套更现代的 HTTP 客户端心智模型。本文记录升级路上踩过的三个坑与两处惊喜。
国密并非高不可攀。用 BouncyCastle 把 SM2 非对称与 SM4 对称拼成一套混合加密方案,并解答那个经典之问:为什么我们不用一把 SM2 直接怼到底?
OLTP 的账本、OLAP 的仓库,各司其职才不越位。本文聊聊我如何用 MyBatis-Plus 的 QueryWrapper 守住 MySQL 的阵地,又把聚合分析的大旗交到 Doris 手中。
代码会过期,但方法论不会。调优的本质是理解取舍,写代码的本质是理解人。今夜不聊技术,只聊三个小道理。
工具越少越好,用得越深越好。我把备忘录删了又装、装了又删,最终留下的只有三个:命令行、编辑器,和一张纸。
红色波浪线退散,绿色对勾亮起。那一刻的满足感,约等于小时候撕开干脆面包装、发现里面是金卡。以此纪念第 40 篇随笔。