Как сбалансировать осколки кинезиса на нескольких процессорах записи?
В настоящее время я пишу простую Kinesis Client Library (KCL) в версии Golang. Одна из функций, которые мне нужны для моего простого KCL, - это балансировка нагрузки между несколькими процессорами записи и экземплярами EC2. Например, у меня есть два процессора записи (которые будут работать в отдельном экземпляре EC2) и четыре шарда Kinesis. Функция балансировки нагрузки позволит каждому процессору записи обрабатывать два фрагмента Kinesis.
Я читал, что Java KCL реализовал это, но я не могу найти реализацию в библиотеке. У меня вопрос, как я собираюсь реализовать эту функцию в Голанге? Спасибо.
2 ответа
KCL уже делает балансировку нагрузки для вас.
Вот базовое описание того, как это работает сегодня (имейте в виду, что это только основы, и они могут измениться, так как Amazon улучшает логику):
- Когда рабочий (который может обрабатывать несколько сегментов) запускается, он проверяет центральную базу данных DynamoDB, для которой сегменты принадлежат работникам (создавая эту базу данных при необходимости). Это "лизинговая" таблица.
- "Аренда" - это отношения между работником и осколком.
- Рабочие будут обрабатывать записи на осколки, для которых у него есть не истекший срок аренды
- Срок аренды истекает, если работник не отправил "сердцебиение" для аренды до истечения срока его действия (обычно каждые несколько секунд) - это сердцебиение по существу обновляет запись DDB
- Он проверяет поток Kinesis, для которого доступны осколки, и обновляет таблицу при необходимости.
- Если срок аренды истек, работник попытается взять на себя ответственность за аренду - на уровне базы данных используйте shardId в качестве ключа и запишите его там workerId.
- Если рабочий запускается и все осколки уже заняты, он проверяет, что такое "баланс" - если он обнаруживает дисбаланс (то есть: "У меня 0 осколков, а у какого-то другого работника есть 10 осколков"), он инициирует "кражу". протокол "осколок" - старый работник прекращает обработку для этого осколка, и новый работник начинает
Вы, конечно, можете свободно изучать исходный код KCL на github: https://github.com/awslabs/amazon-kinesis-client - надеюсь, это объяснение даст вам больше контекста о том, как понять KCL и адаптировать его к вашим потребностям,
Для людей, интересующихся этой темой, VMWare написала реализацию Go библиотеки Java: https://github.com/vmware/vmware-go-kcl/
Однако на момент написания он не поддерживает кражу аренды: https://github.com/vmware/vmware-go-kcl/issues/4
Прежде чем вы начнете писать свой собственный клиент... похоже, что некоторые люди уже сделали это:
Другой вариант - KCL MultiLangDaemon. Вы можете установить небольшую программу бегуна, которая выполняет всю балансировку за вас, а затем вы просто слушаете сообщения, которые демон отправляет вам, и фиксируете их обратно.