无需等待的 AWS SQS

AWS SQS without Await

我有一个将消息发送到 SQS 队列的 .Net Lambda 函数。

我希望能够“触发并忘记”这些消息……也就是说,我不想“等待”回复。然而,AWS 的 SQS 客户端仅提供异步方法(例如 SendMessageAsync)。如果我不“等待”这个调用,那么消息永远不会到达队列中。

关于这个主题我找不到太多。我在网上看到很多使用“SendMessage”的 SQS 示例,但我的假设是代码是使用 AWS SDK 的 2.5 版(或更早版本)编写的(有几个实际上是在等待 SendMessage)。较新的版本没有方法的非异步版本。

我确实发现了一个类似的 Whosebug 问题 (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 消息?

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

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