Подтвердить что ты не робот

Как определить общее количество ключей раздела в потоке AWS kinesis?

В веб-приложении производителя-потребителя должен быть продуманный процесс создания ключа раздела для осколка потока кинезий. Предположим, у меня поток кинезий с 16 осколками, сколько ключей ключей я должен создать? Действительно ли это зависит от количества осколков?

4b9b3361

Ответ 1

Клавиша раздела (или хэша): начинается с 1 до 340282366920938463463374607431768211455. Позволяет сказать ~ 34020 * 10 ^ 34, я буду опускать 10 ^ 34 для удобства...

Если у вас есть 30 осколков, равномерно разделенных, каждый должен покрыть 1134 * 10 ^ 34 хеш-ключей. Покрытие должно быть таким.

Shard-00: 0 - 1134 Shard-01: 1135 - 2268 Shard-03: 2269 - 3402 Shard-04: 3403 - 4536 ... Shard-28: 30619 - 31752 Shard-29: 31753 - 32886 Shard-30: 32887 - 34020

И если у вас есть 3 пользовательских приложения (прослушивание этих 30 осколков), каждый должен прослушивать 10 осколков (оптимально сбалансированный).

Это также объясняет операции слияния и разделения по потоку.

  • Чтобы объединить 2 осколка, они должны закрывать соседние хеш-ключи. Вы не можете объединить Shard-03 и Shard-29.
  • Вы можете разделить любой осколок. Если вы разделите осколок-00 посередине, распределение понравится:

Shard-31: 0 - 567 Shard-32: 568 - 1134 Shard-01: 1135 - 2268 Shard-03: 2269 - 3402 Shard-04: 3403 - 4536 ... Shard-28: 30619 - 31752 Shard-29: 31753 - 32886 Shard-30: 32887 - 34020

Смотрите, Shard-00 больше не будет принимать новые данные. Новые записи, которые помещаются в поток Kinesis с тем же диапазоном ключей раздела (как Shard-00), будут помещены под Shard-31 или Shard-32.

При отправке данных в Kinesis (т.е. сторону производителя) вам не следует беспокоиться о том, "какими данными обследуются данные". Отправка случайного числа (или uuid или текущей метки времени в миллисекундах) было бы лучше всего для масштабирования и распределения данных эффективно на осколках. Если вы не беспокоитесь о заказе записей в одном осколке, лучше выбрать случайное число/постоянно меняющийся ключ раздела для запроса put_record.

В Java вы можете использовать "putRecordsRequestEntry.setPartitionKey(Long.toString(System.currentTimeMillis()))" или "putRecordRequest.setPartitionKey(Long.toString(System.currentTimeMillis()))". Это могут быть примеры.

Ответ 2

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

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