Redis Streams × 消费组:在 ABP 中实现轻量事件流



0) 摘要(TL;DR)

Redis Streams + Consumer GroupABP vNext(.NET 8) 中实现一条轻量事件流通道

  • ✅ 单依赖、低时延;支持回溯重放XAUTOCLAIM 自动接管DLQ 侧写幂等去重多租户隔离
  • ️ 在 ABP 中以IStreamBus + BackgroundService 集成,配套 docker-compose健康检查Testcontainers 集成测试
  • Kafka/RabbitMQ的边界:Streams 献出有序追加日志 + 消费组位点修剪;需要长期留存/生态/审计选 Kafka,复杂路由/协议/延迟队列选 RabbitMQ
  • 关键命令:XADD / XREADGROUP / XACK / XAUTOCLAIM / XGROUP / XINFO

1) 为什么选 Redis Streams(与 RabbitMQ/Kafka 的边界)

  • 轻运维/单依赖:已有 Redis 的团队可直接获得持久队列语义消费组位点回溯能力
  • 顺序与保留:流内有序 + 位点;配合 MAXLEN/~ 近似修剪控制容量;极长留存/跨域汇聚倾向 Kafka
  • 路由复杂度:复杂路由/延迟/优先级/多协议 → RabbitMQ;本文聚焦同域解耦 + 低时延 + 轻运维

2) 架构与最小可运行骨架 ️

2.1 总体架构图

Consumer App(ABP 应用)
Redis
Producer App(ABP 应用)
XADD [MAXLEN ~N]
XREADGROUP ( > )
Handle()
XACK
超时 Pending → XAUTOCLAIM
侧写失败
BackgroundService / Consumer
Handlers\n(Scoped + ICurrentTenant)
Streams: stream:order
DLQ: dlq:order
IStreamBus.PublishAsync

2.2 端到端时序图

ProducerRedis StreamConsumer GroupConsumerHandler DLQ XADD stream fields [MAXLEN ~N] 1 XREADGROUP GROUP g c ID > (取新消息) 2 entries (batch) 3 Handle(entry) + 幂等去重 4 XACK stream g ids... 5 留在 PEL,等待 XAUTOCLAIM 接管
posted on 2025-10-13 14:49  ycfenxi  阅读(4)  评论(0)    收藏  举报