2016-04-08 3 views
0

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

В таком случае, если потребитель читает один элемент из очереди, другие потребители НЕ должны читать один и тот же элемент; другой я бы послал дубликаты писем.

Как это достичь?

ответ

0

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

Во-вторых, Kinesis может быть неправильной архитектурой для отправки транзакционных материалов, таких как электронные письма. Он может быть дублирован или даже не обработан. Это не надежная система очередей.

Например, каждая запись в потоке содержит электронное письмо, но, скажем, при отправке одной из них получена ошибка. Что бы вы сделали? Вы бы поместили эту запись в поток снова, для повторных попыток? Сколько раз вы будете повторять попытку? Кроме того, потребители Kinesis опросили записи из потока навалом, поэтому, если одна запись разбита на партию записей (ProcessRecordsInput.getRecords), контрольная точка для этой партии (ProcessRecordsInput.getCheckpointer) может содержать более одного элемента, включая эту сломанную запись. Таким образом, перезапуск приложений будет рисковать для двойной обработки.

Я предлагаю использовать систему на основе очередей (HornetQ, ActiveMQ и т. Д.), Будет лучше в вашем случае использования.

Смежные вопросы