2015-06-23 2 views
2

Я использую модуль python для записи записей на AWS Kinesis. Максимальная достигнутая пропускная способность составляет около 40 штук в секунду. Однако согласно Kinesis FAQ:Низкая пропускная способность AWS Kinesis

Каждый осколок может поддерживать до 1000 записей PUT в секунду.

Так что мой нынешний подход достигает лишь 4% то, что теоретически возможно, что кажется очень низким.

Есть ли у кого-нибудь представление о том, как можно улучшить пропускную способность?

Настройка: поток Кинезиса - это экземпляр с одним осколком. Производитель находится в специальном экземпляре AWS EC2 (t3.medium) в том же регионе, что и Kinesis Stream. Он создает строки длиной около 20 символов и отправляет их в поток Kinesis через boto.kinesis.Connection.put_record("my_stream", my_message).

упрощенный код:

from boto import kinesis 
import time 

connection = kinesis.connect_to_region(REGION) 
stream = connection.create_stream("my_stream", shard_count=1) 
time.sleep(60) # wait a minute until stream is created 

for i in range(NUM_MESSAGES): 
    my_message = "This is message %d" % i 
    connection.put_record(my_message, "my_stream", "partition_key") 
+1

Вы пробовали использовать метод насыпной, '' put_records''? Каждый HTTP-запрос на услугу включает в себя множество накладных расходов, поэтому максимальное количество данных для каждого звонка поможет повысить пропускную способность. Кроме того, выполняете ли вы загрузку с экземпляра EC2 в том же регионе? Это также поможет. – garnaat

+0

@garnaat: Да, я объединил их вместе для отправки 100 сообщений одновременно через 'connection.put_records (message_list," my_stream ")', с 'message_list.append ({'Data': my_message, 'PartitionKey': str (я)}) '. Тем не менее, пропускная способность даже ** падает ** до 30 puts/sec. – ThS

+0

Вы имеете в виду 30 баллов 100 записей в секунду? – garnaat

ответ

2

http://docs.aws.amazon.com/kinesis/latest/dev/service-sizes-and-limits.html

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

также
взглянуть на: https://github.com/awslabs/kinesis-poster-worker

+0

Я пробовал это, но пропускная способность снизилась. (См. Комментарий в OP). – ThS

+0

Я исправил ошибку в моем коде, и пропускная способность теперь достигает 1700 msg/sec. Ваше предложение было абсолютно правильным. Благодарю. (См. Мой комментарий в OP) – ThS

+0

awesome. Рад, что смог помочь – Mircea