如何使用AWS SQS减少连接延迟



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

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

但是,在发布消息时,这是一个大问题。例如,由于与AWS的连接正在等待发布消息,用户web请求需要多花几秒钟才能完成。这违背了发送消息以延迟后台作业的等待时间的目的。

这个问题是否修复了DNS?网络吗?还是AWS SQS设置?我的web应用程序不是在AWS网络不确定如果这是一个问题。

简单发布消息代码:

$aws = AwsCommonAws::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延迟的一个技巧是直接使用Queue URL,而不是从API构建它。此外,使用http而不是https将显著降低延迟。对我来说,这几乎是20毫秒的影响。

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

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

您可以在这里找到更多详细信息:AWS SQS服务端点

最新更新