Ответ 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()))
". Это могут быть примеры.