【发布时间】:2019-03-07 12:55:38
【问题描述】:
我们有一个 .NET Core 控制台应用程序,它充当 Saga/流程管理器的角色。
这个 Saga 应用通过 Azure Service Bus 与其他微服务通信(使用 MassTransit 进行消息传递抽象 - MassTransit.Azure.ServiceBus)
该应用包含一个状态机(MassTransit/Automatonymous),用于处理由服务总线消息触发的事件。
在当前场景中,初始 Saga 事件是通过通过 MassTransit 发布消息从 Azure Function App 触发的:
busControl.Publish(createSearchPageLinkEvent);
现在,何时:
a) Saga 应用按原样运行,(无容器化)- 一切正常,事件得到正确处理。
b) Saga 应用程序被放入 Docker 容器中,本地(在 VS2017 中使用 docker-compose) - 发生 Exception。从本质上讲 - 似乎在发布消息时确实到达了 Saga 应用程序,但是会立即发生以下异常(摘录):
接收器收到异常: sb://***.servicebus.windows.net/link_provider_saga 在 RenewLock 期间, Microsoft.Azure.ServiceBus.MessageLockLostException:提供的锁 是无效的。要么锁过期,要么消息已经被 从队列中删除
这是状态机(Automatonymous)中的消息处理代码,在 dockerized 时永远不会到达:
Initially(
When(CreateSearchPageLinkEvent)
.Then(context =>
{
//Exception occurs before we get here
_log.Information($"{context.Instance.CorrelationId} CreateSearchPageLinkEvent for ");
context.Instance.PropertyType = context.Data.PropertyType;
context.Instance.SideName = context.Data.SideName;
context.Instance.TransactionType = context.Data.TransactionType;
context.Instance.Url = context.Data.Url;
})
这里是 docker-compose 配置:
version: '3.4'
services:
saga.azure:
image: ${DOCKER_REGISTRY-}sagaazure
build:
context: .
dockerfile: AcquireLinkTaskTracking.Azure\Dockerfile
ports:
- "443:443"
- "5671:5671"
- "5672:5672"
- "9350-9354:9350-9354"
这是应用程序的 DockerFile:
FROM microsoft/dotnet:2.1-runtime-nanoserver-1803 AS base
WORKDIR /app
FROM microsoft/dotnet:2.1-sdk-nanoserver-1803 AS build
WORKDIR /src
RUN dotnet restore AcquireLinkTaskTracking.Azure/Saga.Azure.csproj
//(...) Lots of dependendcy copying here
COPY . .
WORKDIR /src/AcquireLinkTaskTracking.Azure
RUN dotnet build Saga.Azure.csproj -c Debug -o /app
FROM build AS publish
RUN dotnet publish Saga.Azure.csproj -c Debug -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Saga.Azure.dll"]
为什么 Docker 会导致通信问题? 我的预感是:
a) 不正确的端口映射/发布 - 但是触发微服务显然以某种方式到达容器
b) TLS 协议/证书(由 Azure 服务总线使用)未正确设置(不是一件小事)
PS dockerized Saga 应用是通过 docker-compose “开始调试”从 VS2017 本地启动的
PS2 在 Dockerfile 中使用 EXPOSE 端口 80 没有解决问题
【问题讨论】:
标签: docker azureservicebus servicebus masstransit automatonymous