#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, это действительно плохая идея по ряду причин.
Предлагаемые решения:
- Используйте конфигурацию параллелизма JmsListener, чтобы ограничить количество рабочих потоков, запущенных для каждого прослушивателя. @JmsListener
- Ну и что. Позвольте стороннему api выйти из строя и создать исключение. SQS автоматически повторит попытку. Вы захотите настроить окно тайм-аута видимости вашей очереди SQS и ограничения на повторные попытки с учетом ограничений вашего стороннего API. Тайм-аут видимости SQS
- Работайте с третьей стороной, чтобы увеличить свои лимиты.