Извините, мне нужно немного объяснить, прежде чем перейти к проблеме.
Я использую Kafka Client 0.9.0.0 для отправки сообщений в кластер Kafka. Система представляет собой своего рода конвейер, который принимает сообщения от JMS и отправляет их в Kafka. Чтобы обеспечить надежность сообщения, для режима подтверждения JMS задано значение CLIENT_ACKNOWLEDGE, так что, когда сообщение получено и успешно обработано, приложение подтверждает получение сообщения.
Как только сообщение потребляется, оно отправляется в Kafka, и здесь возникает проблема.
Асинхронный:
Я могу использовать асинхронную отправку производителя Kafka с обратным вызовом, и если при отправке сообщения в Kafka произойдет ошибка, будет слишком поздно сообщить потребителю JMS, чтобы он не подтверждал потребление сообщения. Чтобы преодолеть это, единственное, что я придумал, это сохранить сообщения в обратном вызове, если есть исключение, и попытаться отправить сообщения позже. Но я думаю, что это будет слишком много накладных расходов.
Есть ли другой способ справиться с этой ситуацией с помощью асинхронного вызова?
Синхронно:
Используя синхронный вызов, вызывая get() для будущего, возвращаемого Producer.send(), будет выдано исключение, если возникнет какая-либо проблема при отправке сообщения в Kafka, и об этом можно будет сообщить потребителю JMS, чтобы он не подтвердил сообщение и повторите попытку позже.
Очевидно, что это повлияет на производительность, так как это будет блокирующий вызов, а плохая часть заключается в том, что не будет пакетной обработки сообщений, поскольку Kafka будет подтверждать каждое сообщение.
Я склоняюсь к синхронному вызову, потому что не хочу дополнительной настойчивости.
Есть ли способ или конфигурация, где я могу использовать синхронный вызов, а также минимизировать влияние синхронных вызовов? Одна конфигурация, которую я сделал, состоит в том, чтобы иметь пул потребителей JMS.