Localstack 与 MassTransit 未收到消息

2023-12-28

我在使用 LocalStack 测试 MassTransit 时遇到问题,但在 AWS 中使用真正的 SNS/SQS 一切正常,因此我怀疑这是 LocalStack 的问题,除非 MassTransit 需要配置 ServiceURL 以外的其他内容。看https://github.com/MassTransit/MassTransit/issues/1476 https://github.com/MassTransit/MassTransit/issues/1476

我按如下方式运行 LocalStack,仅使用 SNS 和 SQS

docker run -it -e SERVICES=sns,sqs -e TEST_AWS_ACCOUNT_ID="000000000000" -e DEFAULT_REGION="us-east-1" -e LOCALSTACK_HOSTNAME="localhost" -e -rm --privileged --name localstack_main -p 4566:4566 -p 4571:4571 -p 8080-8081:8080-8081  -v "/tmp/localstack:/tmp/localstack" -v "/var/run/docker.sock:/var/run/docker.sock" -e DOCKER_HOST="unix:///var/run/docker.sock" -e HOST_TMP_FOLDER="/tmp/localstack" "localstack/localstack"

现在,我使用 MassTransit 创建公交车并启动它。我为 MassTransit 与 LocalStack 配合使用所做的唯一更改是设置ServiceURL在 SNS 和 SQS 中。其余的应该以同样的方式工作(我认为)

var region = "localhost:4566";
var accessKey = "test";
var secretKey = "test";
var busControl = Bus.Factory.CreateUsingAmazonSqs(c =>
{
    var hostAddress = new Uri($"amazonsqs://{region}")
    var hostConfigurator = new AmazonSqsHostConfigurator(hostAddress);
    hostConfigurator.AccessKey(accessKey);
    hostConfigurator.SecretKey(secretKey);
    hostConfigurator.Config(new AmazonSimpleNotificationServiceConfig {ServiceURL = $"http://{region}"});
    hostConfigurator.Config(new AmazonSQSConfig {ServiceURL = $"http://{region}"});
    c.Host(hostConfigurator.Settings);
});

运行我的项目时,我可以连接并发布事件,没有错误。我订阅了事件,没有错误。我可以看到主题、订阅和队列已在 LocalStack 中正确创建。

我还可以通过 Commandeer 看到队列中有“不可见”消息(不确定那是什么),所以问题似乎出在接收部分。

在 MassTransit 中是否需要配置任何其他要求才能使用已发布的事件?


更新 1:一件有趣的事情是我可以让订阅者长时间监听,在此期间 Commandeer 显示队列中有不可见的消息。 一旦我停止订阅者(和我的应用程序),我就可以看到 Commandeer 将消息从“不可见”移动到“消息”。但无法查看消息。


我已经确认问题出在 localstack 最新映像上,因为我按照克里斯的建议尝试了旧映像,并且效果很好。

With localstack/localstack:0.11.2 效果很好

docker run -it -e SERVICES=sns,sqs -e TEST_AWS_ACCOUNT_ID="000000000000" -e DEFAULT_REGION="us-east-1" -e LOCALSTACK_HOSTNAME="localhost" -e -rm --privileged --name localstack_main -p 4566:4566 -p 4571:4571 -p 8080-8081:8080-8081  -v "/tmp/localstack:/tmp/localstack" -v "/var/run/docker.sock:/var/run/docker.sock" -e DOCKER_HOST="unix:///var/run/docker.sock" -e HOST_TMP_FOLDER="/tmp/localstack" "localstack/localstack:0.11.2"

With latest(我认为这是bdfbe53666a4dd13a09dd9e4b155e2fb750b8041daf7efc69783cb4208b6cacc但不是100%确定)它不起作用。

以下图像版本也不起作用:

  • localstack/localstack:0.12.8
  • localstack/localstack:0.11.6

UPDATE 1:我创建了一个简单的存储库,其中包含重现问题的说明https://gitlab.com/sunnyatticsoftware/sandbox/issue-localstack-masstransit https://gitlab.com/sunnyatticsoftware/sandbox/issue-localstack-masstransit

请注意,该存储库对 MassTransit 有一个包装抽象,可以与干净的架构一起使用。这不会影响问题,但复制粘贴所需的部分比从头开始构建示例更容易。


UPDATE 2: 已确认是最新版本localstack/localstack:0.12.9.1适用于上述场景(请参阅存储库)


更新3 (2021-01-12): 我尝试过这个版本localstack/localstack:0.12.9.1再次,它不起作用。不确定上次是否真的有效或者 docker 镜像被覆盖。无论如何,我又回到了使用该版本localstack/localstack:0.11.2再次,因为latest不幸的是,它也坏了。

我可以看到队列中的消息处于隐藏状态。

awslocal sqs get-queue-attributes --queue-url http://localhost:4566/000000000000/sample-queue --attribute-names All
{
    "Attributes": {
        "ApproximateNumberOfMessages": "0",
        "ApproximateNumberOfMessagesDelayed": "0",
        "ApproximateNumberOfMessagesNotVisible": "4",
        "CreatedTimestamp": "1626087449.988218",
        "DelaySeconds": "0",
        "LastModifiedTimestamp": "1626087450.113652",
        "MaximumMessageSize": "262144",
        "MessageRetentionPeriod": "345600",
        "QueueArn": "arn:aws:sqs:us-east-1:000000000000:sample-queue",
        "Policy": "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Sid\": \"0d948ac2a9ea4ed7b2c0609642107f0f\", \"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"*\"}, \"Action\": \"sqs:SendMessage\", \"Resource\": \"arn:aws:sqs:us-east-1:000000000000:sample-queue\", \"Condition\": {\"ArnLike\": {\"aws:SourceArn\": \"arn:aws:sns:us-east-1:000000000000:*\"}}}]}",
        "ReceiveMessageWaitTimeSeconds": "0",
        "VisibilityTimeout": "30"
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Localstack 与 MassTransit 未收到消息 的相关文章

  • 获取 RTI DDS 上 DataWriter/Publisher 的 IP 地址?

    我在用RTI DDS 5 2 3 17并想获取该设备的 IP 地址DataWriter Publisher添加到一些日志消息 我该如何去做呢 我在形成做什么的逻辑时遇到了一些困难 无法以标准化方式访问 DataWriter 的 IP 地址
  • 使用微服务运行 Google App Engine 应用程序

    我有一个大型整体应用程序 现在是时候将一些模块分离到微服务了 我在 Google 文档中阅读了很多有关 pub sub 和微服务的内容 但找不到我的问题的答案 我的模块 微服务 的 app yaml 文件是什么样的 我的应用程序的 app
  • 发布/订阅同一服务器集合的多个子集

    编辑 这个问题 一些答案和一些评论包含很多错误信息 看Meteor 收藏 出版物和订阅如何运作 https stackoverflow com a 21853298 1269037为了准确理解发布和订阅同一服务器集合的多个子集 如何将服务器
  • JMSTemplate 检查主题是否存在并获取订阅者数量

    我一直在寻找一些文档 示例来检查动态创建的主题是否存在 如果存在 如何获取该主题的订阅者计数 我使用以下代码向主题发送消息 jmsTemplate send destination new MessageCreator Override p
  • SignalR 是否支持发布/订阅消息传递范例?

    我想在网络场中的多个服务器之间使用发布 订阅消息传递来保持其本地 ASP NET 缓存同步 使用 SignalR 可以轻松完成此操作吗 如果可以的话我该怎么做 None
  • 结合到自动状态机中的 Whens

    我正在向 MassTransit 状态机传奇发出请求并等待回复 但我可能会遇到两个错误 MyRequest TimeoutExpired 已过期 我的请求 故障 我不关心在哪些条件下未满足请求 我希望这两种情况都会导致发布错误消息 但是 我
  • MassTransit 与非 .NET 服务的互操作性

    我一直在使用 MassTransit 并且非常喜欢它 但是 默认情况下 它使用 MassTransit 特有的一些 JSON 包装所有 RabbitMQ 有效负载 消息 这使得与非 NET 服务交换消息变得困难 我知道 JSON 可以用任何
  • WCF - 如何编写仅向特定客户端发布的发布者\订阅者服务?

    我正在以发布 订阅模式编写 WCF 服务 当有人发布活动时 我不想立即将其发送给所有客户 我希望能够为每个客户检查是否需要通知该客户该发布 基本上 这将通过访问数据库并检查该客户端是否已使用这些参数订阅该特定事件来完成 无法提前完成 只需要
  • 将值添加到 MassTransit.RabbitMq 中的标头

    我正在使用 MassTransit 3 0 0 0 我很难理解如何在请求 响应场景中拦截消息 并将一些信息添加到我可以在接收器端读取的标头字段 我正在看中间件 http masstransit project com MassTransit
  • Docker-compose:如何使用相同的网络地址从容器和主机访问 Localstack 资源

    我使用 docker compose 在 2 个独立的容器中运行 python API 和 Localstack 实例 以进行本地开发 该 API 有一个端点 可生成预签名的 AWS S3 URL 并重定向用户 以便直接从 S3 加载图像
  • 如何通过 InMemoryTestHarness 成功驱动 MassTransitStateMachine?

    跟进 如何编写 MassTransitStateMachine 单元测试 https stackoverflow com questions 49763600 how to write masstransitstatemachine uni
  • MassTransit 2.6.1 请求/响应模式 - 响应超时

    我正在将 MassTransit 作为 ServiceBus 实现来在 Web 项目中使用 我正在玩请求 响应 http docs masstransit project com en latest overview request htm
  • 如何在Python中使用socket创建通道

    我之前已经启动过Python几次 现在我正在创建一个套接字服务器 我已经让服务器与多个客户端一起使用多个线程 万岁 但我正在寻找我无法调用的功能 我什至不知道它是否存在 我想创建一种客户端通道可以发送不同类型的消息 一个例子 我创建一个通道
  • ActionController::Live 是否可以检查连接是否仍然有效?

    我正在尝试使用 Rails 4 的实时流媒体来实现文本 事件流 它工作得很好 我遇到的唯一麻烦是我无法在不发送任何消息的情况下检查连接是否有效 我想到的唯一解决方案是使用循环刻度生成器创建支持通道 以便某些后台任务会定期向那里发送消息 但看
  • PubSubHubbub 中 hub.lease_seconds 的最大值

    我一直在使用 PubSubHubbub 版本 0 4 来检索 YouTube 实时数据 我正在经历PubSubHubbub 文档 https pubsubhubbub github io PubSubHubbub pubsubhubbub
  • 如何将扩展 PUB-SUB 模式中的发布者和订阅者与 C++ 中 ZeroMQ 中的中介同步?

    Extended PUB SUB topology https i stack imgur com GEgpx png 我在一个有 1 个中介的用例中有多个发布者和多个订阅者 在 ZeroMQ 指南中 我了解了如何使用额外的方法来同步 1
  • 公共交通所有故障消息由一名故障消费者处理

    如何拥有一个通用消费者来处理所有故障消息 我是否需要为每条故障消息注册故障消费者 为何不消费Fault public class WantAllFaultsGimmeThem IConsumer
  • 如何将 inproc 传输与 pyzmq 一起使用?

    我已经设置了两个小脚本来模仿 pyzmq 的发布和订阅过程 但是 我无法使用inproc运输 我能够使用tcp 127 0 0 1 8080好吧 只是不是 inproc pub server py import zmq import ran
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • pubnub 和 head.js

    有没有人成功整合过pubnub http www pubnub com 和 head js 正确吗 Pubnub http www pubnub com 希望我将他们的脚本放在页面底部并带有 div 就在它前面的标签 这可以确保在最后调用

随机推荐