Skip to the content.

实验六:替换消息组件

目标:让业务代码与 Handler 保持不变,替换完整可靠消息机制。 先完成公共准备

先观察默认实现

记录以下文件和当前结果:

SelfManaged 使用业务 DbContext 中的自研 Inbox/Outbox,再通过 RabbitMQ 传输。 Wolverine 使用原生可靠存储、事务中间件和恢复机制;不是只替换 Send 方法。

停写并检查旧状态

停止发送新请求,等待旧实现的待发、处理中和待重试工作结束:

$sql = 'SELECT COUNT(*) AS pending FROM messaging."Outbox" WHERE "State" IN (0,1); SELECT COUNT(*) AS unfinished_inbox FROM messaging."Inbox" WHERE "State" IN (0,2);'
Invoke-LocalCompose exec -T postgres psql -U ms_reference -d ms_lab_messages_selfmanaged -c $sql
Invoke-LocalCompose exec -T rabbitmq rabbitmqctl list_queues -p ms-reference name messages_ready messages_unacknowledged

待发、处理中、Broker ready/unacknowledged 应分别核对。 死信不算已排空,需要单独查询、记录并处置。保留备份后结束旧宿主。

启动替换实现

./build/start-local.ps1 -Lab -Provider Wolverine

脚本使用 ms_lab_messages_wolverine 和独立队列前缀,显式初始化原生存储。 重新加载公共准备中的登录信息后,执行同一个 Invoke-LabExercise 和审计断言。 业务服务与 Handler 不需要引用 Wolverine Envelope 或自研表实体,也不需要改代码。

教学配置切换使用新库:它不会复制旧业务数据、在途消息或死信。 生产存量数据切换需要另行设计数据迁移与停写窗口,不属于这个独立库对照实验。

检查替换边界

无需容器的配置与发现回归:

dotnet test MS.Microservice.Messaging/test/MS.Microservice.Messaging.Wolverine.Tests -c Release
dotnet test test/MS.Microservice.Lab.Tests -c Release --filter FullyQualifiedName~LabMessagingConfigurationTests

具备容器环境时,再运行两种 Provider 共用的 SharedContractMatrixTests。 不能用运行时热切换、双写或复制另一套自研实现来完成这个实验。