Чтобы подробнее узнать о проблеме, put_records оплачивается в зависимости от количества представленных записей (разделов) и размера записей. Любая запись, которая меньше 25 КБ, заряжается как один PU (Payload Unit). Наши индивидуальные записи составляют около 100 байт в секунду. Если мы поместим их отдельно, мы потратим на пару порядков больше денег на ПУ, чем нам нужно.
Независимо от решения, мы хотим, чтобы данный UID всегда оказывался в одном и том же осколке, чтобы упростить работу на другом конце Kinesis. Это происходит, естественно, если UID используется как ключ раздела.
Одним из способов борьбы с этим было бы продолжать делать помехи для каждого UID, но буферизировать их во времени. Но для эффективного использования PU мы закончили бы с задержкой в 250 секунд, введенной в поток.
Комбинация приведенного здесь ответа и this question дает мне стратегию для сопоставления нескольких идентификаторов пользователей статическим (предопределенным) ключам разделов для каждого осколка.
Это позволило бы объединить несколько UID в один блок полезной нагрузки (с использованием разделяемого ключа разделов для целевого осколка), чтобы они могли быть выписаны, когда они приходят каждую секунду, в то время как данный UID заканчивается в правильном осколке ,
Затем мне нужен буфер для каждого осколка, и как только будет получено достаточно записей, всего лишь до 25 КБ или 500 записей (максимум за вызов put_records), данные могут быть сдвинуты.
Это просто перестает вычисляться раньше времени, что может привести к тому, что данный UID будет отображаться, если бы он использовался в качестве ключа раздела.
AWS Kinesis documentation говорит, что это метод:
ключи Перегородки являются Unicode строки с максимальным ограничением длины 256 байт. Хеш-функция MD5 используется для сопоставления ключей разделов с 128-битными значениями и сопоставления связанных записей данных с осколками.
Если кто-то этого не сделал, прежде чем я попытаюсь посмотреть, способ ли в this question генерирует действительные сопоставления. Мне интересно, нужно ли преобразовать обычную строку Python в строку юникода, прежде чем делать MD5.
Возможно, существуют другие решения, но это должно работать, и я буду принимать существующий ответ здесь, если не появится претендента.
у вас есть два вопроса здесь или только один? не могли бы вы уточнить свой точный вопрос? –