大量传输的本地堆栈未收到消息 [英] Localstack with MassTransit not getting messages

查看:18
本文介绍了大量传输的本地堆栈未收到消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用LocalStack测试MassTransport时遇到了问题,但在AWS中使用真正的SNS/SQS一切正常,所以我怀疑这是LocalStack的问题,除非MassTransport需要配置ServiceURL以外的其他东西。请参见https://github.com/MassTransit/MassTransit/issues/1476

我只使用SNS和SQS运行LocalStack,如下所示

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"

现在,我使用MassTransport创建并启动了公交车。我对MassTransport与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中正确创建了主题、订阅和队列。

我还可以通过征用者看到队列中有&qot;不可见&q;消息(不确定是什么),因此问题似乎出在接收部分。

是否需要在MassTransport中配置以使用已发布的事件?


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

推荐答案

我已确认问题出在本地堆栈的最新映像上,根据克里斯的建议,我已尝试使用较旧的映像,并且运行良好。

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

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

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

更新1:我已经创建了一个简单的资源库,其中包含复制问题的说明https://gitlab.com/sunnyatticsoftware/sandbox/issue-localstack-masstransit

注意,repo在MassTransport上有一个包装器抽象,以便与干净的体系结构一起使用。这不会影响问题,但复制粘贴所需部件比从头开始构建样本更容易。


更新2:已验证最新版本localstack/localstack:0.12.9.1 适用于上述方案(请参阅回购)


更新3(2021-01-12):我再次尝试版本localstack/localstack:0.12.9.1,但它不起作用。不确定是上一次它真的起作用了,还是码头图像被覆盖了。在任何情况下,我都会再次使用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"
    }
}

这篇关于大量传输的本地堆栈未收到消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆