Я пытаюсь реализовать архитектуру RPC, используя Кафку в качестве посредника сообщений. Решение об использовании Kafka вместо другого решения для брокера сообщений определяется текущим контекстом.
Фактическая реализация состоит из двух различных типов услуг:
- Получатель : эта служба получает сообщения из темы Kafka, которая потребляет, обрабатывает сообщения и затем публикует сообщение ответа в теме ответа;
- вызывающий абонент : эта служба принимает HTTP-запросы, затем публикует сообщения в теме получателя, использует тему ответа службы получателя для ответного сообщения, а затем возвращает ее в виде ответа HTTP.
Сообщения о запросах / ответах, опубликованные в темах, связаны с помощью ключа сообщения.
Реализация получателя была довольно простой: при запуске она создает разделы «запрос» и «ответ», а затем начинает использовать раздел запроса с идентификатором группы услуг (многие экземпляры получателя будут разделены тот же идентификатор группы для обеспечения правильного баланса запросов). Когда приходит запрос, служба обрабатывает его и затем публикует ответ в теме ответа.
Моя проблема связана с реализацией caller , в частности при использовании ответа из очереди ответов.
Со следующими допущениями:
- Запросы HTTP должны обрабатываться одновременно;
- Может быть несколько экземпляров этой службы вызывающих абонентов.
каждый поток / служба должна получать все сообщения в теме ответа, чтобы найти сообщение с соответствующим ключом запроса.
В качестве примера представим, что две службы receive генерируют два сообщения с ключами 1 и 2 соответственно. Эти сообщения будут опубликованы в теме receive и обработаны. Ответ будет опубликован в теме приемник-ответы . Если две получателя службы используют один и тот же идентификатор группы, возможно, что ответ 1 поступит в службу, опубликовавшую сообщение 2 , и наоборот, что приведет к тайм-аут HTTP.
Чтобы избежать этой проблемы, мне удалось обдумать следующие возможные решения:
- Создание новой группы для каждого запроса (РЕДАКТИРОВАТЬ: но группа не может быть удалена с помощью кода, поэтому может потребоваться другой сервис для очистки зоопарка из этих групп);
- Создание новой темы для каждого запроса, а затем ее удаление.
Надеясь, что я прояснил себя достаточно ясно - я должен признать, что я новичок в Кафке - мой вопрос будет:
Какое решение дороже другого? Или есть другая конфигурация темы / группы, которая могла бы достичь предположения 3 ?
Спасибо.