从SQS检索消息慢

时间:2019-02-06 12:33:30

标签: java performance amazon-web-services amazon-sqs

给出带有以下代码的Java AWS Lambda:

private static final String QUEUE_URL = "https://sqs.us-east-1.amazonaws.com/<ACCT_NUMBER>/<QUEUE_NAME>";
private static final AmazonSQS client = AmazonSQSClientBuilder.standard().build();
private static final int MAX_SQS_MESSAGES = 10;

并且:

private List<Message> getMessages() {
    return client.receiveMessage(new ReceiveMessageRequest().withQueueUrl(QUEUE_URL)
            .withMaxNumberOfMessages(MAX_SQS_MESSAGES).withWaitTimeSeconds(1)).getMessages();
}

作为日志的示例证据,我经历了相当长的SQS检索时间(考虑到指定的1秒长轮询基础):

  • 获得了3次SQS消息:1985ms
  • 获得8个SQS消息:1887ms
  • 获得9个SQS消息:2438ms
  • 获得5个SQS消息:1748ms

是在正常操作之间的间隔时间,还是我做错了什么或有所改进?

Maven依赖项:

  <dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-sqs</artifactId>
    <version>1.11.488</version>
  </dependency>

1 个答案:

答案 0 :(得分:2)

这些延迟确实确实很长,而且出了点问题。使用非空队列,您应该能够获得5-500ms范围内的典型读数(较低,具有更多可用消息)。即使您的队列为空,根据您在请求中使用withWaitTimeSeconds的情况,请求时间也应该最多为1秒。

您可以采取许多步骤来缩小问题的范围:

  1. 确保队列和lambda在同一区域内-我首先提到这一点,因为我已经看到由AWS中的跨区域调用引起的这么多延迟问题。

  2. 确保您具有准确的请求指标。我看不到您如何在代码中衡量指标计时,但确实看到了您如何构建客户。

  3. 确保您正在重复使用客户端(而不是每次都创建一个新客户端)-请考虑在每次创建客户端时进行日志记录。在客户端的内部有很多设置,如果每次都使用一个新的客户端,那可能会浪费很多时间。