Azure服务总线-当应用程序位于Docker容器中时,MessageLockLostException否则工作正常

时间:2019-03-07 12:55:38

标签: docker azureservicebus servicebus masstransit automatonymous

我们有一个.NET Core控制台应用程序,可充当Saga /流程管理器的角色。

此Saga应用通过 Azure服务总线与其他微服务通信(使用 MassTransit 进行消息传递抽象-MassTransit.Azure.ServiceBus)

该应用程序包含一个状态机(MassTransit /自动机),用于处理事件-由服务总线消息触发。

在当前方案中,通过通过MassTransit发布消息,从Azure Function App触发了初始Saga事件:

busControl.Publish(createSearchPageLinkEvent);

现在,何时:

a)Saga应用按原样运行(无容器化)-一切正常,事件得到正确处理。

b)将Saga应用放入本地(在VS2017中使用docker-compose)的Docker容器中-发生异常。从本质上讲,似乎在发布消息时确实到达了Saga应用,但是以下异常立即发生(摘录):

  

接收方收到异常:   sb://***.servicebus.windows.net/link_provider_saga在RenewLock期间,   Microsoft.Azure.ServiceBus.MessageLockLostException:提供的锁   是无效的。锁已过期,或者消息已被删除   从队列中删除

这是状态机中的消息处理代码(自动命名),在进行泊坞窗处理时永远不会到达:

            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 Service Bus使用)未正确设置(这不是一件容易的事)

PS dockerized Saga应用是通过docker-compose的“开始调试”从VS2017在本地启动的

在Dockerfile中的端口80上使用EXPOSE的PS2无法解决问题

2 个答案:

答案 0 :(得分:0)

  

为什么Docker会导致通讯问题?

我怀疑网络问题。间歇性错误会发生,作为用户,您必须重试。不仅仅是Docker,您可能会遇到这个问题。

RenewLock是客户端发起的操作,不能保证成功。这样,应该通过重试机制来处理未能更新消息锁的问题。您需要通过MassTransit确认是否已实现。如果没有,假设未扩展锁,您的代码将继续处理消息。并且当尝试完成传入消息时,您将获得MessageLockLostException异常。

答案 1 :(得分:0)

好,所以这是一个简单的问题:

我们只是使用了错误的基本图像。需要ASP网络核心运行时映像。与我们的dockerfile的差异如下:

-FROM microsoft/dotnet:2.1-runtime-nanoserver-1803 AS base
+FROM microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016 AS base

-FROM microsoft/dotnet:2.1-sdk-nanoserver-1803 AS build
+FROM microsoft/dotnet:2.1-sdk-nanoserver-sac2016 AS build

你活着,学习。