Операция синхронизации Spring boot AWS SqsListener

#java #spring-boot #amazon-sqs

Вопрос:

У меня есть несколько слушателей sqs, потребляющих из какой-то стандартной очереди sqs.

Эти слушатели несут ответственность за обращение к какому-либо методу обслуживания, который, в свою очередь, обращается к стороннему поставщику данных.

Когда в течение короткого промежутка времени потребляется несколько сообщений, нагрузка на вызов службы третьей стороне достигает своего предела(предел скорости пересечения).

1-й слушатель
     @SqsListener(value = "${cloud.aws.queue-1}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    public void handleQueue1(final String message, @Header RequestType type, @Header("MessageId") String messageId, Acknowledgment acknowledgment) throws JsonProcessingException {
        ..
        ...
        
        synchronized (this) {
            // call to some common service method
        }
        
        ...
        ..
    }

 
2-й слушатель
     @SqsListener(value = "${cloud.aws.queue-2}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    public void handleQueue2(final String message, @Header RequestType type, @Header("MessageId") String messageId, Acknowledgment acknowledgment) throws JsonProcessingException {
        ..
        ...
        
        synchronized (this) {
            // call to some common service method
        }
        
        ...
        ..
    }
 

Мой вопрос заключается в том, как я могу убедиться, что каждый прослушиватель sqs обращается к вызову службы один за другим, предполагая, что каждому требуются данные от стороннего вызова.

Я пытался добавить синхронизированный блок, но я не могу понять, нормально ли это иметь.

Ответ №1:

Хотя можно сделать то, что вы пытаетесь сделать с синхронизацией Java, это действительно плохая идея по ряду причин.

Предлагаемые решения:

  1. Используйте конфигурацию параллелизма JmsListener, чтобы ограничить количество рабочих потоков, запущенных для каждого прослушивателя. @JmsListener
  2. Ну и что. Позвольте стороннему api выйти из строя и создать исключение. SQS автоматически повторит попытку. Вы захотите настроить окно тайм-аута видимости вашей очереди SQS и ограничения на повторные попытки с учетом ограничений вашего стороннего API. Тайм-аут видимости SQS
  3. Работайте с третьей стороной, чтобы увеличить свои лимиты.