2015-05-06 3 views
1

Я пытаюсь создать клиент-клиент Kinesis. Чтобы работать над этим, я просмотрел Руководство разработчика Kinesis и AWS Document http://docs.aws.amazon.com/kinesis/latest/dev/kinesis-record-processor-implementation-app-java.html.Получение данных из двух разных потоков в кинезисе?

Мне было интересно, можно ли получать данные из двух разных потоков и обрабатывать их соответственно.

Скажем, у меня есть два разных потока stream1 и stream2.

Можно ли получать данные как из потока, так и из процесса индивидуально?

ответ

3

Почему бы и нет? Делайте get_records из обоих потоков.

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

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

  • Оба потока имеют один осколок каждый - в этом случае вы можете прочитать с помощью одного работника из боя потоков и увидеть все события из обоих потоков. Вы можете добавить временные метки или другие клавиши, чтобы позволить вам «присоединяться» к этим событиям у рабочего.

  • Один поток (Stream1) с одним осколком и второго потоков (stream2) с несколькими осколками - в этом случае вы можете прочитать из stream1 от всех рабочих, что также будет обрабатывать единственный осколок от stream2 каждый. Каждый из ваших работников увидит все события stream1 и его долю в событиях stream2. Обратите внимание, что у вас есть limit скорости, с которой вы можете читать события от stream1 с одним осколком (2 МБ/с или 5 раз в секунду), и если у вас много осколков в stream2, это может быть реальный предел.

  • Оба потока могут иметь несколько осколков - в этом случае вам будет более сложно обеспечить, чтобы вы смогли «присоединиться» к этим событиям, так как вам нужно синхронизировать записи и чтения с этими потоками. Вы также можете читать со всех осколков обоих потоков одним рабочим, но это не очень хорошая практика, так как это ограничивает вашу способность масштабировать, поскольку у вас нет распределенной системы. Другой вариант - использовать один и тот же номер partition_key в обоих потоках и иметь одинаковое количество определений осколков и разбиений для обоих потоков и убедиться, что вы читаете «правый» осколок из каждого потока у каждого из ваших работников и что вы делают это правильно каждый раз, когда один из ваших работников терпит неудачу и перезапускает, что может быть немного сложным.

Другой вариант, который вы можете рассмотреть, чтобы написать обоих типов событий в одном потоке, снова используя тот же partition_key, а затем фильтровать их на стороне читателя, если вам нужно обработать их по-разному (для например, записать их в разные файлы журналов в S3).

+0

Спасибо за подробное объяснение.После слишком много размышления я думаю, что если я могу отправить данные для обоих потоков, используя только один поток, а в шаге ProcessRecords, я отделяю их, разве это не хорошая идея? –

+0

Да. Это более простое и масштабируемое решение. – Guy

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