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

标签 docker azureservicebus servicebus masstransit automatonymous

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

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

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

在当前场景中,初始 Saga 事件是通过通过 MassTransit 发布消息从 Azure Function App 触发的:

busControl.Publish(createSearchPageLinkEvent);

现在,当:

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

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

Exception received on receiver: sb://***.servicebus.windows.net/link_provider_saga during RenewLock, Microsoft.Azure.ServiceBus.MessageLockLostException: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue



这是状态机 ( 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 协议(protocol)/证书(由 Azure 服务总线使用)未正确设置(不是一件小事)

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

PS2 在 Dockerfile 中使用 EXPOSE 端口 80 没有解决问题

最佳答案

Why would Docker cause communication issue?



我怀疑是网络问题。将发生间歇性错误,作为用户,您必须重试。不只是 Docker 会遇到这个问题。
RenewLock是客户端发起的操作,不保证成功。因此,更新消息锁的失败应该由重试机制来处理。您需要与 MassTransit 确认是否已实现。如果没有,您的代码将继续处理消息,假设锁定已被扩展,而它不是。当尝试完成传入消息时,您将获得 MessageLockLostException异常(exception)。

关于docker - Azure 服务总线 - 当应用程序位于 Docker 容器中时出现 MessageLockLostException,否则工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55044327/

相关文章:

docker - Google PubSub。从AppEngine到Kubernetes容器以及从一个Kubernetes容器到另一个Kubernetes容器的通信

c# - 如何在 Azure 函数中使用带有主题/订阅的服务总线触发器

c# - Azure函数应用程序、服务总线和返回服务总线

performance - Azure Servicebus 中继性能

docker - K8S-Docker-ARM Unbutu 64位-QEMU:未捕获的目标信号11(分段故障)-内核已转储

python - 将Rasa部署到App Engine时,Google Cloud构建权限错误

java - 在Docker中将Java War部署到Tomcat,错误No Spring WebApplicationInitializer types detected on classpath

azure - 在部署期间读取 Azure ServiceBus 命名空间连接字符串

azure - 使用 .NET Core SDK 创建筛选的服务总线订阅

python - Azure Servicebus - 获取 python 中的所有可用主题