При подключении к AWS SQS с использованием AWS SDK, кажется, есть заметная задержка.
При запуске службы не так важно принимать сообщения, так как после 3-7-секундной задержки на первом соединении сообщения начинают передаваться с хорошей скоростью —
НО, при публикации сообщений это большая проблема. Например, пользовательский веб-запрос занимает несколько дополнительных секунд, потому что соединение с 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 мс.
Конечно, вы можете найти компромисс между безопасностью и переносимостью, но если производительность вызывает беспокойство, это может помочь.