【问题标题】:AWS SQS without Await无等待的 AWS SQS
【发布时间】: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


【解决方案1】:

您不仅在等待响应,还在等待消息的发送。由于它也是一个 lambda 函数,一旦 lambda 处理程序返回您的进程结束,它会在完成发送消息之前关闭与 SQS 的 HTTP 连接。这将在本地工作,因为您的本地进程仍将执行,但在 lambda 函数上,它会在大多数情况下丢失消息而被命中或丢失。

如果响应时间有问题,您可以压缩负载,这将减少传输到 SQS 并获得响应所需的时间。

【讨论】:

  • 谢谢乔希。可悲的是,有效载荷大小不是我的问题。我正在使用 SQS 队列实现“扇出”模式。循环收集(在扇出的每一层)是瓶颈。不幸的是,鉴于您的解释,我不确定是否有解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
相关资源
最近更新 更多