Java 从SQS检索消息速度慢

Java 从SQS检索消息速度慢,java,performance,amazon-web-services,amazon-sqs,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 i

给定一个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静态最终字符串队列\u URL=”https://sqs.us-east-1.amazonaws.com//";
私有静态最终AmazonSQS客户端=AmazonSQSClientBuilder.standard().build();
专用静态最终int MAX_SQS_消息=10;
以及:

private List getMessages(){
返回client.receiveMessage(new ReceiveMessageRequest().withQueueUrl(QUEUE\u URL)
.withMaxNumberOfMessages(MAX_SQS_MESSAGES)。withWaitTimeSeconds(1)).getMessages();
}
我经历过相当长的SQS检索时间(考虑到长轮询的指定1秒基数),作为日志的样本证据:

  • 获得3平方米MSG:1985ms
  • 获得8平方米MSG:1887平方米
  • 获得9平方米的MSG:2438平方米
  • 获得5平方米的MSG:1748平方米
是正常运行之间的时间,还是我做错了什么或改进了什么

Maven依赖项:

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

亚马逊网站
aws java sdk sqs
1.11.488
这些确实是很长的延迟,有些地方出了问题。对于非空队列,您应该能够获得5-500毫秒范围内的典型读取(越低,可用消息越多)。即使您的队列是空的,根据您在请求中使用的
withWaitTimeSeconds
,请求时间最多也应该达到1s左右

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

  • 确保队列和lambda位于同一个区域-我首先提到这一点,因为我在AWS中看到了许多由跨区域调用引起的延迟问题

  • 确保您有准确的请求度量。我看不出您是如何在代码中度量度量度量时间的,但我确实看到了您是如何构建客户机的

    • 创建实现
      afterError
      afterResponse
      的实现,并检查
    • 通过将该请求处理程序添加到客户端
    • 这将为您提供请求如何花费时间的准确细节,并可能揭示一些明显的问题,还可能指向SQS调用之外的问题
  • >P>确保你正在重用你的客户(而不是每次创建一个新客户)——考虑每次创建客户机时都要进行日志记录。在客户端的后台有很多设置,如果每次都使用新的客户端,可能会浪费很多时间

    这些确实是很长的延迟,有些地方不对劲。对于非空队列,您应该能够获得5-500毫秒范围内的典型读取(越低,可用消息越多)。即使您的队列是空的,根据您在请求中使用的
    withWaitTimeSeconds
    ,请求时间最多也应该达到1s左右

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

  • 确保队列和lambda位于同一个区域-我首先提到这一点,因为我在AWS中看到了许多由跨区域调用引起的延迟问题

  • 确保您有准确的请求度量。我看不出您是如何在代码中度量度量度量时间的,但我确实看到了您是如何构建客户机的

    • 创建实现
      afterError
      afterResponse
      的实现,并检查
    • 通过将该请求处理程序添加到客户端
    • 这将为您提供请求如何花费时间的准确细节,并可能揭示一些明显的问题,还可能指向SQS调用之外的问题
  • >P>确保你正在重用你的客户(而不是每次创建一个新客户)——考虑每次创建客户机时都要进行日志记录。在客户端的后台有很多设置,如果每次都使用新的客户端,可能会浪费很多时间


    关于#3:客户端是静态的final,lambda每2分钟运行一次,所以我想它会被重用,但我会设置日志记录。我测量的只是getMessages上面的一个包装器,而不是每次seLogging的客户机实例化表明客户机正在被重用,因此排除了该选项。删除了与1秒等待相关联的“长轮询”,总体性能要好得多。可能与我们的用例有关,队列中每个循环只有大约5-10个MSG。我将以这种方式保持它的工作和监视,并查看它在较长时间框架内的行为。关于#3:客户端是静态最终版,lambda每2分钟运行一次,所以我想它会被重用,但我会设置日志记录。我测量的只是getMessages上面的一个包装器,而不是每次seLogging的客户机实例化表明客户机正在被重用,因此排除了该选项。删除了与1秒等待相关联的“长轮询”,总体性能要好得多。可能与我们的用例有关,队列中每个循环只有大约5-10个MSG。我将以这种方式保持它的工作和监视,并查看它在更长时间内的行为
      <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-sqs</artifactId>
        <version>1.11.488</version>
      </dependency>