Прежде всего, используйте KCL для потребительских приложений Kinesis. Как вы знаете, запись, размещенная в потоке, будет находиться в определенном осколке и, используя KCL, вы гарантируете, что только один потребительский узел (в приложении) опросит этот осколок. Таким образом, не было бы риска двойного прослушивания одного и того же осколка (таким образом, обрабатывать одну и ту же запись).
Во-вторых, Kinesis может быть неправильной архитектурой для отправки транзакционных материалов, таких как электронные письма. Он может быть дублирован или даже не обработан. Это не надежная система очередей.
Например, каждая запись в потоке содержит электронное письмо, но, скажем, при отправке одной из них получена ошибка. Что бы вы сделали? Вы бы поместили эту запись в поток снова, для повторных попыток? Сколько раз вы будете повторять попытку? Кроме того, потребители Kinesis опросили записи из потока навалом, поэтому, если одна запись разбита на партию записей (ProcessRecordsInput.getRecords
), контрольная точка для этой партии (ProcessRecordsInput.getCheckpointer
) может содержать более одного элемента, включая эту сломанную запись. Таким образом, перезапуск приложений будет рисковать для двойной обработки.
Я предлагаю использовать систему на основе очередей (HornetQ, ActiveMQ и т. Д.), Будет лучше в вашем случае использования.