我们有一个.NET Core控制台应用程序,可充当Saga / Process Manager的角色。
此Saga应用通过 Azure服务总线与其他微服务通信(使用 MassTransit 进行消息传递抽象-MassTransit.Azure.ServiceBus)
该应用程序包含一个状态机(MassTransit / Automatonymous),用于处理事件-由服务总线消息触发。
在当前情况下,通过通过MassTransit发布消息,从Azure功能应用触发初始Saga事件:
busControl.Publish(createSearchPageLinkEvent);
现在,当:
a)Saga应用程序按原样运行(无容器化)-一切正常,事件得到正确处理。
b)将Saga应用放入Docker容器本地 (在VS2017中使用docker-compose)-发生异常。从本质上讲-似乎消息在发布时确实到达了Saga应用,但是以下异常立即发生(摘录):
这是状态机中的消息处理代码( Automatonymous ),在进行docker化时永远不会到达:
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协议(protocol)/证书(由Azure Service Bus使用)未正确设置(这不是一件容易的事)
PS dockerized Saga应用是通过docker-compose的“开始调试”从VS2017在本地启动的
PS2在Dockerfile中的端口80上使用EXPOSE不能解决问题
最佳答案
我怀疑是网络问题。间歇性错误会发生,作为用户,您必须重试。不仅仅是Docker,您可能会遇到此问题。RenewLock
是客户端发起的操作,不能保证成功。这样,应该通过重试机制来处理未能更新消息锁的问题。您需要通过MassTransit确认是否已实现。如果没有,假设没有扩展锁,您的代码将继续处理消息。当尝试完成传入消息时,您将获得MessageLockLostException
异常。