使用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服务端点