带有 MassTransit 的 Localstack 未收到消息

问题描述

我在使用 LocalStack 测试 Masstransit 时遇到问题,但使用 AWS 中的真正 SNS/SQS 一切正常,所以我怀疑这是 LocalStack 的问题,除非 Masstransit 需要配置 ServiceURL 以外的其他内容。见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 一起使用所做的唯一更改是在 SNS 和 SQS 中设置 ServiceURL。其余的应该以相同的方式工作(我认为)

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 将消息从“不可见”移动到“消息”。但无法查看消息。

enter image description here

解决方法

我已经确认问题出在 localstack 最新图像上,因为我已经按照 Chris 的建议尝试使用较旧的图像,并且效果很好。

使用 public class HomeController : Controller { private IHostingEnvironment Environment; public HomeController(IHostingEnvironment _environment) { Environment = _environment; } public IActionResult Index() { string wwwPath = this.Environment.WebRootPath; string contentPath = this.Environment.ContentRootPath; return View(); } } 效果很好

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" (我认为是 latest,但不是 100% 确定)它不起作用。

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

  • bdfbe53666a4dd13a09dd9e4b155e2fb750b8041daf7efc69783cb4208b6cacc
  • localstack/localstack:0.12.8

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

请注意,该 repo 对 MassTransit 进行了包装抽象,以便与干净的架构一起使用。这不会影响问题,但复制粘贴所需的部分比从头开始构建样本更容易。


UPDATE 2:验证最新版本 localstack/localstack:0.11.6 适用于上述场景(见 repo)