Как настроить RabbitMQ в API Gateway с возможностью возвращать клиенту запрошенные им данные?
Всем привет!
Я пытаюсь настроить api gateway (krakend) на асинхронное общение с сервисами через rabbitmq и у меня примерно получилось настроить очередь на такое общение...
Но я уперся в стенку, когда дошел до того момента, где мне нужно вернуть клиенту запрошенные им данные по очереди.
Не знаю как это реализовать, хотел спросить, есть ли возможность организовать такую очередь и как-то узнавать нужного клиента и передать ему именно те данные, которые он запросил?
Например, допустим, есть 3 клиента:
1 клиент просит список товаров;
2 клиент просит список категорий;
3 клиент просит список пользователей.
Все эти запросы проходят по цепочке к сервисам и сервисы отдают эти данные через одну очередь и кракен, который слушает эту очередь забирает эти данные и отдает клиенту по запросу. Тут как-то нужно определять и различать клиентов, чтобы не отдать клиенту не те данные.
Допустим, клиент запросил список товаров, а мы ему отдаем список пользователей, это будет ошибкой.
Да, тут можно разделить запросы по типу и кинуть их в разные очереди, но у меня по любому будут отличные данные в одной очереди, которых нужно будет отдавать разным клиентам(например, если это товары, то один клиент запросил определенные айфоны, а другой клиент запросил андроиды).
Может кто-нибудь подсказать как это можно правильно организовать?
Спасибо за ответ)
Да, согласен. Туториал четкий!
Прошел его несколько раз)
Так-то я думал через rpc сделать, но в кракене не реализовали rpc поверх rabbitmq(как они сами отметили в слаке и гите. Типа, что из коробки это не поддерживается). Они предлагают реализовать промежуточный сервис для этого.
Просто когда гуглил, видел инфу, что rpc это плохая идея и идиотом обозвали чувака, который хотел так сделать.
Поэтому думал, что возможно есть решение по лучше и можно это как-то по другому реализовать(я новичок в этом).
Общение с сервисами нужно сделать полностью асинхронным. Поэтому все задачи/запросы, которые идут к сервисам проходят через очередь. Если бы было тупо трансляция в одну строну, то можно было бы сделать pub/sub, но мне нужно и ответ возвращать, если клиент запросил определенные данные.
Что тут можно сделать, чтобы клиент забирал именно те данные, которые он запроси, а не другие?(Это основная проблема, чуть ли не две недели сижу над ней).
По идее, если клиент хочет определенные данные из сервиса, но делает 2 запроса.
Первым запросом он ставит в очередь, а вторым забирает.
У меня уже есть очередь, когда от клиента поступает запрос к кракену, он ставит это в очередь, определенный сервис забирает это сообщение и отдает ответ по другой очереди, и кракен забирает это, и должен отдать клиенту по запросу.
Кракен позволяет передавать имя очереди и routing_key в заголовках, по которой он будет ждать ответ, но нельзя передавать ключи для сопоставления в конце, чтобы определить чей запрос это был. Нет такой проверки и возможности. И кракен в запушенном состоянии не дает создавать нового консьюмера, иначе могли бы сразу через клиента по запросу к кракену создать нового консьюмера с рандомным именем и по нему получить ответ обращаясь к кракену https://www.krakend.io/docs/backends/amqp/
dimonchik2013, для этого нужно сделать сторонний сервис(промежуточный то, что мне уже предложили), там слишком много вазни будет, не хотел этого и я даже пока не представляю, как это делать...
ну - полагаться на пересылаемые данные через очереди нельзя, в них нужно посылать только метки данных (типа ИД из базы) и временнЫе метки (когда дергать) - так что база и данные нужны
хотя, конечно, никто не мешает пересылать и данные, если оно контролируемо извне (читай - не прошло последнюю проверку - перезапросить/добавить снова)