【发布时间】:2021-03-21 09:35:59
【问题描述】:
我有一个将消息发送到 SQS 队列的 .Net Lambda 函数。
我希望能够“发送并忘记”这些消息……也就是说,我不想“等待”回复。但是,AWS 的 SQS 客户端只提供异步方法(例如 SendMessageAsync)。如果我不“等待”这个调用,那么消息永远不会到达队列。
我在这个话题上找不到太多东西。我在网上看到很多使用“SendMessage”的 SQS 示例,但我的假设是代码是使用 AWS SDK 的 2.5 版(或更早版本)编写的(实际上有几个在等待 SendMessage)。较新的版本没有方法的非异步版本。
我确实发现了一个类似的 StackOverflow 问题 (QqsClient.SendMessageAsync without await doesn't work),但它询问如何等待发送多条消息,而我希望完全避免等待。
此代码将发送一条消息:
using Amazon.SQS;
public class SQSHelper
{
private AmazonSQSClient client = new AmazonSQSClient(Amazon.RegionEndpoint.USEast2);
public async Task<string> SendMessage(string queue, string message)
{
var response = await client.SendMessageAsync(queue, message);
}
}
但是这段代码不会
using Amazon.SQS;
public class SQSHelper
{
private AmazonSQSClient client = new AmazonSQSClient(Amazon.RegionEndpoint.USEast2);
public void SendMessage(string queue, string message)
{
client.SendMessageAsync(queue, message);
}
}
是否可以在不等待响应的情况下发送 SQS 消息?
【问题讨论】:
-
我对 C# 方面不是很熟悉,但是您无法使用 this method 吗?这可能需要几毫秒,但本质上是同步的。
-
Is it possible to send SQS messages without waiting for the response?每当您执行 Web 服务调用时,您应该知道结果(成功、异常)并适当地处理该结果。为什么要忽略结果? -
stdunbar,我很惊讶地看到 SDK 的更高版本支持 SendMessages。我误解了。我发现这个页面 (docs.aws.amazon.com/sdk-for-net/v3/developer-guide/…) 指出 SDK 仅支持 .Net Core 的异步版本。如果我切换到完整的 .Net 框架,我可以获得非异步版本。如果我使用异步版本,我可以直接触发并忘记吗?
-
vasek,我同意我们通常应该等待回复。但是我正在实现一个扇出模式,并且我正在建模的过程可以接受一些丢失的结果。迄今为止,我对 SQS 的体验是它非常强大并且不会经常下降。等待响应会减慢扇出速度,从而减慢结果。我的用户宁愿获得可能不是 100% 完成的快速结果,也不愿 100% 完成结果和延迟。
标签: amazon-web-services async-await amazon-sqs