带有 MassTransit 的 Localstack 没有收到消息
Localstack with MassTransit not getting messages
我在使用 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 将消息从“不可见”移动到“消息”。但是无法查看消息。
我已确认问题出在 localstack 最新映像上,因为我已根据 Chris 的建议尝试使用较旧的映像,并且效果很好。
搭配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:我创建了一个简单的 repo,其中包含重现问题的说明 https://gitlab.com/sunnyatticsoftware/sandbox/issue-localstack-masstransit
请注意,该存储库对 MassTransit 进行了包装抽象,以便与干净的体系结构一起使用。这不会影响问题,但复制粘贴所需部分比从头开始构建示例更容易。
更新 2:已验证最新版本 localstack/localstack:0.12.9.1
适用于上述情况(请参阅 repo)
更新 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"
}
}
我在使用 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 将消息从“不可见”移动到“消息”。但是无法查看消息。
我已确认问题出在 localstack 最新映像上,因为我已根据 Chris 的建议尝试使用较旧的映像,并且效果很好。
搭配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:我创建了一个简单的 repo,其中包含重现问题的说明 https://gitlab.com/sunnyatticsoftware/sandbox/issue-localstack-masstransit
请注意,该存储库对 MassTransit 进行了包装抽象,以便与干净的体系结构一起使用。这不会影响问题,但复制粘贴所需部分比从头开始构建示例更容易。
更新 2:已验证最新版本 localstack/localstack:0.12.9.1
适用于上述情况(请参阅 repo)
更新 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"
}
}