Ответ 1
Клавиши разделов имеют значение только в том случае, если в потоке имеется несколько осколков (но они всегда требуются). Kinesis вычисляет хэш MD5 ключа раздела, чтобы решить, какой осколок должен хранить запись (если вы описываете поток, вы увидите хеш-диапазон как часть decription осколка).
Так почему это имеет значение?
Каждый осколок может принимать только 1000 записей и/или 1 МБ в секунду (см. Документ PutRecord). Если вы пишете на один осколок быстрее этой скорости, вы получите ProvisionedThroughputExceededException
.
С несколькими осколками вы масштабируете этот предел: 4 осколка дает вам 4000 записей и/или 4 МБ в секунду. Конечно, есть оговорки.
Самое большое, что вы должны использовать разные ключи разделов. Если все ваши записи используют один и тот же ключ раздела, вы все равно пишете один осколок, потому что все они имеют одинаковое значение хэш-функции. Как вы решаете это, это зависит от вашего приложения: если вы пишете из нескольких процессов, может быть достаточно использовать идентификатор процесса, IP-адрес сервера или имя хоста. Если вы пишете из одного процесса, вы можете либо использовать информацию, которая в записи (например, уникальный идентификатор записи), либо создать случайную строку.
Второй оговоркой является то, что ключ раздела подсчитывается против общего размера записи и сохраняется в потоке. Поэтому, хотя вы, вероятно, можете получить хорошую случайность, используя какой-либо текстовый компонент в записи, вы теряете пространство. С другой стороны, если у вас есть какой-то случайный текстовый компонент, вы можете вычислить свой собственный хэш из него, а затем укрепить это для ключа раздела.
Наконец, если вы используете PutRecords (что вам нужно, если вы пишете много данных), отдельные записи в запросе могут быть отклонены, а другие приняты. Это происходит из-за того, что эти записи попадали в осколок, который уже находился в пределах его записи, и вы должны повторно отправить их (после задержки).