U48 Spring AMQP 与 Kafka 集成实验
实验使用 Liberica JDK 21、Boot 4.0.9 BOM 管理的 Spring AMQP 4.0.6(amqp-client 5.27.1)与 Spring Kafka 4.0.8(kafka-clients 4.1.2)。两个真实进程 broker 由 runner 启停:Qpid Broker-J 10.1.1 内存 broker(AMQP 0-9-1 与 rabbit 客户端兼容的替身,非 RabbitMQ 本体)与真实 Kafka 4.1.2 KRaft 单机(Maven 构件组装 classpath,Kafka 数据写入临时目录)。
实验代码bash
python3 labs/broker-integrations-u48/run.pyrunner 离线使用 Maven 本地缓存并核对依赖版本;Qpid 以 org.apache.qpid.server.Main 子进程启动(Anonymous SASL,rabbit 客户端侧注册对应机制),Kafka 先 StorageTool 格式化 KRaft 存储、再启动 broker、等待端口就绪后运行 Spring Kafka 实验,结束统一终止进程并删除临时目录;失败运行保留现场供排查,不覆盖已有成功证据。不使用 Docker,不修改本机既有服务。
场景与观察(AMQP 6 组 + Kafka 6 组 + Pulsar 受阻):
| 场景 | 观察 |
|---|---|
| AMQP 启用配置 | RabbitAdmin 声明交换机/3 队列/2 绑定;容器 autoStartup=false 避开声明竞态 |
| AMQP 监听生命周期 | 消费 2 条;stop 期间积压 1 条;start 后恢复 |
| AMQP 异常与死信 | Qpid 不支持 DLX 扩展(542 反例);RepublishMessageRecoverer 应用侧死信,毒消息 1 次尝试入 DLQ |
| AMQP 重试 | Framework 7 RetryPolicy(maxRetries=2)3 次尝试后入 DLQ |
| Kafka 启用配置 | KafkaAdmin 建 5 主题;send 同步确认;监听消费 |
| Kafka 监听生命周期 | stop 不消费、start 恢复 |
| Kafka MANUAL ack | ack 语义提交同批之前 offset;未 ack 记录重启后重投递(at-least-once) |
| Kafka 错误处理 | DefaultErrorHandler+FixedBackOff 3 次投递后 DeadLetterPublishingRecoverer 转投 DLT |
| Kafka 事务 | executeInTransaction 提交 2 条可见;中止事务在 read_committed 下不可见 |
| Pulsar | 受阻:真实 broker 未授权下载,不伪装通过 |
资源:入口、POM、AMQP 实验、Kafka 实验、证据。
边界:Qpid 为替身(rabbit quorum 队列/DLX 等扩展不在其内);Kafka 为 KRaft 单机(未运行多 broker/机架感知);Pulsar 受阻;均未运行跨主机与生产容量。