Сократите количество SQL-запросов с помощью ссылок на falcor-router

Предположим, у меня есть два маршрута прохождения

route: 'users[{ranges}]'

а также

route: 'UserById[{integers:ids}]["name","email"]'

в то время как users возвращает ссылки на UserById-route. Если я тогда сгенерирую запрос

get('users[0..10]["name","email"]')

против этого, маршрутизатор сначала оценит users[0..10] часть, которая будет выполнять SELECT id FROM users LIMIT 10 в базе данных и вернуть соответствующие идентификаторы. Затем маршрутизатор будет использовать эти идентификаторы вместе с конкретным маршрутом для заполнения фактических значений. Без аккуратного кэширования в реализации UserService (которую необходимо повторить для любого подобного случая, например, адресов, типов затрат и т. П.), Это произведет по крайней мере два запроса к моему постоянному бэкэнду, если более традиционный подход использует один RESTful конечная точка

GET /users/?offset=0&limit=10

скорее всего, будет доволен одним.

Существует ли общий передовой опыт, как оптимизировать запросы к базе данных в этом сценарии, например, с помощью некоторого умного кеша между маршрутизатором и внутренними службами? Возврат полной информации уже в users Маршрут модели запрещен, поскольку у наших пользователей могут быть графические ссылки на друзей, которые сами являются пользователями.

2 ответа

Не будет ли иметь общий маршрут пользователей по индексу и маршрут имени пользователя и электронной почты по индексу, что позволит вам обрабатывать get('users[0..10]["name","email"]') запрос с одним запросом БД?

Например

route: 'users[{ranges}]'

а также

route: 'users[{ranges}]["name", "email"]'

Второй маршрут, поскольку он более конкретный, вернет все, что вам нужно для get('users[0..10]["name","email"]') запрос только с одним запросом БД, в то время как пользовательские запросы по любым дополнительным полям (помимо имени и адреса электронной почты) будут переходить к первому маршруту.

На этот вопрос здесь отвечает Джафар Хуссейн со ссылкой на документацию:

Маршрутизатор подходит в качестве абстракции над уровнем сервиса или REST API. Использование Маршрутизатора через API этих типов обеспечивает достаточно гибкости, чтобы избежать обходов клиента без введения тяжелых абстракций. Сервисно-ориентированные архитектуры распространены в системах, которые предназначены для масштабируемости. Эти системы обычно хранят данные в разных источниках данных и предоставляют их через различные сервисы. Например, Netflix использует маршрутизатор перед своей микросервисной архитектурой.

Редко идеально использовать маршрутизатор для прямого доступа к одной базе данных SQL. Приложения, использующие одно хранилище SQL, часто пытаются создать один SQL-запрос для каждого запроса сервера. Работа маршрутизатора заключается в разделении запросов для различных разделов документа JSON Graph на отдельные обработчики и отправке отдельных запросов службам для получения запрошенных данных. Как следствие, у маршрутизатора редко бывает достаточно контекста для создания одного оптимизированного SQL-запроса. В настоящее время мы изучаем различные варианты поддержки этого типа шаблона доступа к данным в Falcor в будущем.

Сейчас я исследую себя, используя маршрутизатор для сбора частичных запросов к базе данных, затем сканируя результаты JSON Graph, чтобы объединить эти частичные запросы, выполнить их как один для базы данных, а затем снова сканируя график, чтобы разместить значения в правильных путях., Это определенно возможно при использовании ArangoDB и AQL LET заявления, хотя это немного сложно. Я не знаю о SQL.

Если вы ищете более простое решение, вы можете кэшировать сопоставление индекса с идентификатором, чтобы попытаться минимизировать доступ к базе данных. Ответ Джеймса Конклинга тоже хорош.

Другие вопросы по тегам