Микросервисы: фильтрация по разным сервисам - PullRequest
0 голосов
/ 05 мая 2020

В моем текущем проекте у нас есть две микросервисы с двумя разными экземплярами БД, каждая из которых имеет таблицы, ссылающиеся на один и тот же базовый ресурс (хотя и с разными именами), то есть таблица ресурсов в сервисе A. DB называется foo, в то время как в DB службы B он называется bar.

Записи отправляются с использованием обеих служб, и каждая служба отвечает за запись в другую службу при обновлении / записи / удалении (игнорируя сеть / DB на данный момент сбои.)

Каждая служба отвечает за разную информацию о ресурсе, и поэтому каждая таблица содержит разные столбцы , содержащие разную информацию того же ресурса . Например: служба A имеет атрибут health_state, а служба B имеет атрибут [и столбец] archived.

Мы хотели бы разрешить пользователю фильтровать по обоим столбцам / атрибутам службы - т.е. GET /foo?search="health_state='unhealthy' and archived='false'". Как можно go это сделать?

Мы изначально думали, что одна микрослужба будет «интерфейсом» для другой и будет поддерживать поиск в A для полей обеих служб. А затем A отправит соответствующие поля поиска в B и присоединит результаты к базе данных A. Это один из вариантов, который может плохо масштабироваться, если набор результатов B массивный, это потому, что A требует всех ресурсов archived (в приведенном выше примере) для выполнения присоединиться. Кроме того, поисковый запрос может быть очень сложным для анализа. Если мы действительно воспользуемся этим подходом есть ли какие-либо предложения, как это сделать в масштабе ?

Помните о переносе нашего приложения на что-то вроде CQRS, как упоминалось здесь кажется огромным изменением (в настоящее время в соответствующей БД более 10К строк).

Благодарю вас за ответы!

1 Ответ

0 голосов
/ 05 мая 2020

Возможно, вы могли бы посмотреть GraphQL. Вы можете сшить результаты двух разных приложений вместе, чтобы получить результат. Это довольно известное масштабируемое решение, и вы также можете применить кеширование на сервере graphql для повышения производительности.

https://graphql.org/ - отличная отправная точка.

Я бы хотел также предлагаем вам пересмотреть дизайн сервиса, потому что фильтрация для одного и того же ресурса обычно должна выполняться в том же сервисе, если это не сервис канала. Если к данным можно получить доступ почти в реальном времени, то еще одним вариантом является индексация данных в поиске elasti c и последующее извлечение.

...