使用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)
]);
答案 0 :(得分:2)
SQS在我们的使用过程中表现出非常低的延迟。但是,我们的逻辑运行在EC2实例上。
最有可能的是,服务器和SQS之间存在显着的延迟。在物理上更靠近服务器的区域中使用SQS,或将应用程序的逻辑移到EC2或Lambda上。
我建议您在迁移之前编写一个简单的测试应用程序,以排除业务逻辑中的问题。
答案 1 :(得分:1)
帮助我减少SQS延迟的一个技巧是直接使用队列URL而不是从API构建它。使用http而不是https也会显着降低延迟。对我而言,这是近20毫秒的影响。
当然,您可能会在安全性和可移植性之间进行权衡,但如果性能受到关注,则可能会有所帮助。
答案 2 :(得分:0)
通过引入用于SQS服务的VPC端点,您可以减少延迟问题以及与连接有关的任何事情,因为AWS内部使用AWS PrivateLink,或者只是说说AWS内部网络主干在您的VPC中的实例之间建立连接和数据传输SQS比使用传统互联网更重要。设置也很容易,并且不会造成破坏性的更改,因为它只将SQS终结点的DNS名称(如sqs.eu-central-1.amazonaws.com
解析为私有IP)。如果由于配置更改或其他原因导致专用链接出现问题,则AWS会自动解析为常用的公共IP(使用Internet)
您可以在此处找到更多详细信息:AWS SQS service endpoint