Как использовать 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 будет оценивать по:

  1. Вычислить сумму MD5 ключа раздела.
  2. Интерпретируйте сумму MD5 как шестнадцатеричное число и преобразуйте ее в основание 10. Это будет ключ хеш-функции для этого ключа раздела. Затем вы можете посмотреть, в какой осколок попадает этот хэш-ключ.
Другие вопросы по тегам