如何减少 AWS SQS 的连接延迟?

How to reduce connection latency with AWS SQS?

使用 AWS SDK 连接到 AWS SQS 时,似乎有明显的延迟。

在启动服务时使用消息并不那么重要,因为在第一个连接延迟 3-7 秒后,消息开始以良好的速度流动 -

但是,在发布消息时,这是一个大问题。例如,用户 Web 请求需要额外几秒钟才能完成,因为与 AWS 的连接正在等待发布消息。这违背了发送消息以将等待时间推迟到后台作业的目的。

这是 DNS 解决的问题吗?联网?还是 AWS SQS 设置?我的网络应用程序不在 AWS 网络中,不确定这是否是一个问题。

简单发布消息代码:

$aws = \Aws\Common\Aws::factory(/* array with connection settings */);
$client = $aws->get('Sqs');
$queue = $client->getQueueUrl(['QueueName' => $queue]);

// This takes 3 - 5 seconds every time its called.
$res = $this->client->sendMessage([
    'QueueUrl' => $queue['QueueUrl'],
    'MessageBody' => json_encode($request)
 ]);

SQS 在我们的使用过程中表现出非常低的延迟。但是,我们的逻辑在 EC2 实例上运行。

您的服务器和 SQS 之间很可能存在明显的延迟。在物理上更靠近您的服务器的区域中使用 SQS,或者将您的应用程序的逻辑移动到 EC2 或 Lambda。

我建议您在执行迁移之前编写一个简单的测试应用程序以排除业务逻辑中的问题。

帮助我减少 SQS 延迟的一个技巧是直接使用队列 URL 而不是从 API 构建它。使用 http 而不是 https 也会显着降低延迟。对我来说,这是将近 20 毫秒的影响。

当然,您可能会在安全性和可移植性之间进行权衡,但如果性能是一个问题,那么这可能会有所帮助。

通过为 SQS 服务引入 VPC 端点,您可以减少延迟问题以及与连接相关的任何事情,因为 AWS 在内部使用 AWS PrivateLink 或简单地说 AWS 内部网络 backbone 来建立连接和数据传输在您的 VPC 和 SQS 中的实例之间,而不是使用传统的互联网。它也很容易设置,而不是破坏性的改变,因为它只是将 SQS 端点的 DNS 名称(如 sqs.eu-central-1.amazonaws.com)解析为私有 IP。如果由于配置更改或任何其他原因导致私有 link 出现问题,则 AWS 会自动解析为通常的 public IP(使用互联网)

您可以在此处找到更多详细信息:AWS SQS service endpoint