当前位置: 首页 > 知识库问答 >
问题:

Azure Service Bus-当应用程序位于Docker容器中时,MessageLockLostException正常工作

谈桐
2023-03-14

我们有一个。NET核心控制台应用程序,充当传奇/流程管理器的角色。

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

该应用程序包含一个处理事件的状态机(MassTransit/Automatnamous)-由Service Bus消息触发。

在当前场景中,通过MassTransit发布消息,Azure Function应用程序会触发初始Saga事件:

busControl.Publish(createSearchPageLinkEvent);

现在,当:

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

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

接收方收到异常:sb://***。服务总线。窗户。net/link\U provider\U RenewLock期间的传奇故事,Microsoft。蔚蓝色的服务总线。MessageLockLostException:提供的锁无效。锁已过期,或者消息已从队列中删除

以下是状态机(Automatonymous)中的消息处理代码,在停靠时永远不会到达:

            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 docker compose通过“开始调试”从VS2017本地启动docker Saga应用程序

PS2在Dockerfile中使用EXPOSE for port 80无法解决此问题

共有2个答案

邓威
2023-03-14

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

我们只是使用了错误的基本图像。需要asp net core运行时映像。与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

你活着,你学习。

终洛华
2023-03-14

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

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

续订锁是客户端启动的操作,不能保证成功。因此,更新消息锁失败应由重试机制处理。您需要与MassTransit确认是否已实施。如果没有,您的代码将继续处理消息,假设锁没有扩展。并且当尝试完成传入消息时,您将得到MessageLockLostException异常。

 类似资料:
  • 问题内容: 我尝试在具有/tmp/.X11-unix装载的容器docker中运行一些Qt应用程序。我在这里看到 这可能很困难。 因此,当我在容器docker中运行kdevelop时,它不起作用(我有一个空窗口)。但是如果我运行qtcreator很好。 我认为差异来自Qt版本(kdevelop在Qt4和qtcreator在Qt5中开发)。我所有其他的qt5应用程序都可以正常工作,但在qt4中却没有一

  • 我正在尝试将ftp服务器NodeJS应用程序打包。当我使用npm运行它时,它工作得很好,但当我在容器中运行它时它没有响应。 这是节点应用程序:src/index.js文件 我的包.json 文件 我的docker文件 我正在使用FileZilla测试FTP服务器。当我使用npm运行服务器时,启动并使用FileZilla连接 我正在使用此命令构建docker映像 我用这个来运行码头 这是FileZi

  • 我正在尝试将.war、.aar、.xml和.properties文件部署到tomcat docker容器。我使用了下面的Dockerfile和基本的tomcat docker映像。 到目前为止一切正常。它提取war文件并启动容器内的应用程序。 但是现在我需要像这样添加/编辑“/usr/local/tomcat/webapps/root/web-inf//”和“/usr/local/tomcat/w

  • 我创建了一个Spring Boot应用程序,它通过HTTP POST将一些经过分析的Twitter-stuff作为JSON对象。JSON对象如下所示: 当我从IntelliJ运行代码并将此JSON发布到我的服务时,AnalyzedKeyWordList中填充了关键字对象“VW”和“Tesla”。所以起作用了。 类“AnalyzedKeywordList”如下所示: 导入java.util.List