From 1f29c71dba92ac3730bc40d8d0f8529cb5c48f7e Mon Sep 17 00:00:00 2001 From: hongawen <83944980@qq.com> Date: Thu, 16 Jul 2026 11:50:14 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=89=B9=E9=87=8F=E6=94=92=E6=89=B9?= =?UTF-8?q?=E4=B8=A4=E7=AB=AF=E5=AF=B9=E9=BD=90=E5=90=8E=E7=9A=84=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=E8=A1=A8=E8=BF=B0=E6=94=B6=E5=B0=BE=EF=BC=88=E4=B8=8A?= =?UTF-8?q?=E8=BD=AE=E9=81=97=E7=95=99=E5=B7=A5=E4=BD=9C=E5=8C=BA=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit README 能力表批量行 ⚠️→✅、引言补「含 idle flush」;CLAUDE.md 差异段 同步「整批失败为剩余差距、concurrency 唯一未兑现」口径。 Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 84f9136..2f92e8a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -37,7 +37,7 @@ mq-starter-rocketmq RocketMQ driver(收发 + 原生重试/死信 + RET mq-spring-boot-starter 聚合 jar,业务方只引这一个(恒含 idempotent-redis) ``` -> ⚠️ **两个 driver 仍有差异**(README 有对照表):去重、失败落库两端已对齐(2026-07 起 rocketmq `idempotent=true` 生效,需 Redis 可达);剩余差距是死信模型(redis 只落库 / rocketmq 原生 `%DLQ%`)、批量攒批语义、`concurrency` 两端都未兑现。改跨 driver 行为前先对照 README 能力表。 +> ⚠️ **两个 driver 仍有差异**(README 有对照表):去重、失败落库两端已对齐(2026-07 起 rocketmq `idempotent=true` 生效,需 Redis 可达);剩余差距是死信模型(redis 只落库 / rocketmq 原生 `%DLQ%`)与批量**整批失败**的处理(逐条 ACK 后无法精确重投整批,故落库+吞掉);真正两端都未兑现的只有 `concurrency`。批量攒批本身(含 idle flush 超时/停机强刷,2026-07 已落地)两端已对齐。改跨 driver 行为前先对照 README 能力表。 > > **单独只引 `mq-starter-rocketmq`(不走聚合坐标)时去重需自行加 `mq-starter-idempotent-redis` 依赖**——rocketmq 模块本身不依赖它(刻意零耦合)。 diff --git a/README.md b/README.md index e4faac2..602fa35 100644 --- a/README.md +++ b/README.md @@ -172,7 +172,7 @@ public class MyErrorHandler implements MqConsumeErrorHandler { ## 两个 driver 不太一样 -两套实现的能力大头已经对齐:去重、失败落库两端都接上了。剩下的差异主要在死信模型和批量语义: +两套实现的能力大头已经对齐:去重、失败落库、批量攒批(含 idle flush)两端都接上了。剩下的差异主要在死信模型,以及批量的**整批失败处理**(攒批本身两端已对齐,糙点在整批失败被吞、无法精确重投): | 能力 | Redis Stream | RocketMQ | |---|:---:|:---:| @@ -181,7 +181,7 @@ public class MyErrorHandler implements MqConsumeErrorHandler { | 去重 `idempotent`(默认开启) | ✅(需 Redis) | ✅(需 Redis) | | 失败落库 `RETRY_EXHAUSTED`(需配 `errorHandler`,否则仅 ACK 丢弃) | ✅ | ✅ 落库+ACK | | 失败落库 `SINGLE` | ⚠️ 单条:落库+重投;批量:失败被吞(两端一致) | ⚠️ 单条:落库+重投;批量:失败被吞(两端一致) | -| 批量 `batchSize` | ⚠️ core 内存攒批(driver 逐条喂);超时/停机强制刷出,仅 kill -9 丢未满批(两端一致) | ⚠️ core 内存攒批(driver 逐条喂);超时/停机强制刷出,仅 kill -9 丢未满批(两端一致) | +| 批量 `batchSize` | ✅ core 内存攒批(driver 逐条喂);超时/停机强制刷出,仅 kill -9 丢未满批(两端一致) | ✅ core 内存攒批(driver 逐条喂);超时/停机强制刷出,仅 kill -9 丢未满批(两端一致) | | 重试 | ✅ PEL reclaim | ✅ 原生重投 | | 死信队列 | ❌ 只落库 | ⚠️ 原生 `%DLQ%` 通常被耗尽 ACK 旁路(InProgress 白跑烧光计数时仍会进) | | 顺序消息 | ❌ | ❌ 用的 Concurrently |