Как использовать ExplicitHashKey для назначения кругового потока в AWS Kinesis
Я пытаюсь прокачать много данных через Amazon Kinesis (порядка 10000 точек в секунду).
Чтобы максимизировать количество записей в секунду через мои сегменты, я бы хотел округлять свои запросы над фрагментами (моей логике приложения не имеет значения, к чему переходят отдельные сообщения фрагментов).
Казалось бы, я мог бы сделать это с параметром ExplicitHashKey для сообщений в списке, которые я отправляю конечной точке PutRecords - однако документация Amazon фактически не описывает, как использовать ExplicitHashKey, кроме оракулярного выражения:
http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html
Каждая запись в массиве Records может содержать необязательный параметр ExplicitHashKey, который переопределяет ключ раздела для сопоставления сегмента. Этот параметр позволяет производителю данных явно определять шард, в котором хранится запись. Для получения дополнительной информации см. Добавление нескольких записей с помощью PutRecords в Руководстве разработчика по Amazon Kinesis Streams.
(Оператор в вышеприведенных документах содержит ссылку на другой раздел документации, в котором вообще не обсуждаются ExplicitHashKeys).
Есть ли способ использовать ExplicitHashKey для округления данных робина среди шардов?
Какие допустимые значения для параметра?
1 ответ
Каждому шарду присваивается последовательный диапазон 128-битных целых чисел от 0 до 2^128 - 1.
Вы можете найти диапазон целых чисел, назначенных данному фрагменту в потоке через CLI AWS:
aws kinesis describe-stream --stream-name name-of-your-stream
Вывод будет выглядеть так:
{
"StreamDescription": {
"RetentionPeriodHours": 24,
"StreamStatus": "ACTIVE",
"StreamName": "name-of-your-stream",
"StreamARN": "arn:aws:kinesis:us-west-2:your-stream-info",
"Shards": [
{
"ShardId": "shardId-000000000113",
"HashKeyRange": {
"EndingHashKey": "14794885518301672324494548149207313541",
"StartingHashKey": "0"
},
"ParentShardId": "shardId-000000000061",
"SequenceNumberRange": {
"StartingSequenceNumber": "49574208032121771421311268772132530603758174814974510866"
}
},
{ ... more shards ... }
...
Вы можете установить ExplicitHashKey
записи в строковое десятичное представление целочисленного значения в любом месте диапазона хэш-ключей для сегмента, чтобы заставить его быть отправленным этому конкретному фрагменту.
Обратите внимание, что из-за предыдущих операций слияния и разделения вашего шарда, может быть много осколков с перекрытием HashKeyRanges
, В настоящее время открытые осколки - это те, которые не имеют SequenceNumberRange.EndingSequenceNumber
элемент.
Вы можете округлять запросы на робин среди набора сегментов, идентифицируя 128-битное целое число в диапазоне каждого из сегментов, представляющих интерес, и циклически назначая строковое представление этого числа для каждой записи. ExplicitHashKey
,
В качестве примечания вы также можете вычислить значение хеша PartitionKey
будет оценивать по:
- Вычислить сумму MD5 ключа раздела.
- Интерпретируйте сумму MD5 как шестнадцатеричное число и преобразуйте ее в основание 10. Это будет ключ хеш-функции для этого ключа раздела. Затем вы можете посмотреть, в какой осколок попадает этот хэш-ключ.