Вы можете решить эту проблему как с GKTable
, так и с KTable
. Предыдущая структура данных реплицируется, поэтому вся таблица доступна на каждом узле (и занимает больше места). Последний разделен таким образом, что данные распределяются по различным узлам. Это имеет побочный эффект, что, как вы говорите, раздел, который обрабатывает userId, может также не обрабатывать соответствующего клиента. Вы решаете эту проблему, перераспределяя один из потоков, чтобы они были разделены.
Таким образом, в вашем примере вам необходимо обогатить события Заказа информацией о Клиенте в Службе доставки. Вы также можете:
a) Используйте GlobalKTable
информации о клиенте и присоединяйтесь к ней на каждом узле
б) Используйте KTable
информации о клиенте и выполните ту же операцию, но перед выполнением обогащения вы должны повторно ввести ключ, используя оператор selectKey()
, чтобы обеспечить совместное разбиение данных (то есть те же ключи будут на одном и том же узле) , Вы также должны иметь одинаковое количество разделов в темах Заказчик и Заказы.
Пример Inventory Service в примерах Confluent Microservices делает нечто подобное. Он пересылает поток заказов, чтобы они были разделены по productId, а затем присоединяется к KTable
Inventory (также с ключом productId).
Относительно ваших индивидуальных вопросов:
Является ли GlobalKTable
рекомендуемым подходом для реализации этого шаблона?
Оба работают. GKTable
имеет более длительное время перезагрузки в худшем случае, если ваша служба по какой-либо причине теряет память KTable
будет иметь немного большую задержку, так как данные должны быть перераспределены, что означает запись данных в Kafka и их повторное чтение.
Является ли проблемой копирование всего набора данных клиентов в каждом экземпляре службы доставки, когда количество клиентов очень велико?
Основным отличием является вышеупомянутое время перезагрузки в худшем случае. Хотя технически GKTable
и KTable
имеют немного различную семантику (GKTable
полностью загружается при запуске, KTable
загружается постепенно в зависимости от времени события, но это не является строго относящимся к этой проблеме)
Может ли это / должно ли этот случай быть реализован с использованием KTable
каким-либо образом?
Смотри выше.
См. Также: Примеры микросервисов , Быстрый старт , Запись блога .