Что такое раздел в AWS Kinesis?

Я читал о AWS Kinesis. В следующей программе я записываю данные в поток с именем TestStream. Я запустил эту часть кода 10 раз, вставив 10 записей в поток.

var params = {
    Data: 'More Sample data into the test stream ...',
    PartitionKey: 'TestKey_1',
    StreamName: 'TestStream'
};

kinesis.putRecord(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
});

Все записи были успешно вставлены. Что на самом деле означает partition key? Что он делает в фоновом режиме? Я прочитал его документацию, но не понял, что это значит.

Ответ 1

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

Так почему это имеет значение?

Каждый осколок может принимать только 1000 записей и/или 1 МБ в секунду (см. Документ PutRecord). Если вы пишете на один осколок быстрее этой скорости, вы получите ProvisionedThroughputExceededException.

С несколькими осколками вы масштабируете этот предел: 4 осколка дает вам 4000 записей и/или 4 МБ в секунду. Конечно, есть оговорки.

Самое большое, что вы должны использовать разные ключи разделов. Если все ваши записи используют один и тот же ключ раздела, вы все равно пишете один осколок, потому что все они имеют одинаковое значение хэш-функции. Как вы решаете это, это зависит от вашего приложения: если вы пишете из нескольких процессов, может быть достаточно использовать идентификатор процесса, IP-адрес сервера или имя хоста. Если вы пишете из одного процесса, вы можете либо использовать информацию, которая в записи (например, уникальный идентификатор записи), либо создать случайную строку.

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

Наконец, если вы используете PutRecords (что вам нужно, если вы пишете много данных), отдельные записи в запросе могут быть отклонены, а другие приняты. Это происходит из-за того, что эти записи попадали в осколок, который уже находился в пределах его записи, и вы должны повторно отправить их (после задержки).

Ответ 2

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

Теоретически AWS может создать случайный ключ разделения для каждой записи, что приведет к почти идеальному спреду.

Настоящая причина, по которой разделы используются для "упорядочивания/потоковой передачи". Kinesis поддерживает порядок (порядковый номер) для каждого шарда.

Другими словами, посредством потоковой передачи X, а затем Y в шард Z, гарантируется, что X будет извлечен из потока до Y (при извлечении записей из всех шардов). С другой стороны, при потоковой передаче X на осколок Z1, а затем Y на осколок Z2 нет никакой гарантии на порядок (при извлечении записей из всех осколков). Y, безусловно, может быть потянут до X.

Возможность "потокового" сегмента полезна во многих случаях.

(Например, видеоуслуга, транслирующая фильм пользователю, используя имя пользователя и имя фильма в качестве ключа раздела).

(Например, работа с потоком общих событий и применение агрегации).

В тех случаях, когда упорядочение (потоковая передача) или группирование (например, агрегация) не требуется, генерации случайного ключа раздела будет достаточно.