Совместное использование задачи pg-обещание между частями HTTP-запроса - PullRequest
0 голосов
/ 13 февраля 2019

Я использую pg-обещание в приложении GraphQL, и из-за вложенной / итеративной природы распознавателей каждый HTTP-запрос составляет лот запросов к базе данных.

Итак, мне интересно, существует ли более эффективный способ совместного использования соединения из пула соединений, когда средства сбора данных собирают данные?

Я понимаю, что задача pg-promise существует только для обратного вызоваи я не вижу другого способа связать запросы (как задокументировано здесь ).

Пример

Запрос GraphQL:

{
  users {
    files {
      name
      date
    }
  }
}

Пример решателей при использовании Apollo Server

Query: {
    users: (obj, args, context, info) => {
      return context.db.manyOrNone('select id from users')
    }
 }

и

Users: {
  files: (obj, args, context, info) => {
    const userId = obj.id;
    return context.db.manyOrNone('select * from files where user_id = $1', userId);
  }
}

Это сгенерирует множество SQL-запросов, если, например, много пользователей.

ПРИМЕЧАНИЕ

Мне известны такие методы, как dataloader, для решения таких проблем, как N + 1 Select, но я не могу позволить себе сейчас перестроить это приложение и простоболее эффективная работа с соединениями с базой данных будет огромным выигрышем в производительности.

Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2019

Каждая конечная точка HTTP и каждое соединение с базой данных из пула должны быть асинхронными.

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

И если количество подключений в пуле меньше, чем количество конечных точек HTTP, которые обращаются к базе данных, вы получаете плохо масштабируемую службу HTTP.Вам нужно количество соединений, по крайней мере, совпадающее с количеством конечных точек HTTP.

Итак, что вы ищете - совместное использование соединения с базой данных между несколькими конечными точками HTTP - плохая идея для начала.

И если вы хотите сгруппировать несколько обработчиков данных в одном HTTP-запросе, вы можете объединить логику обработки в одной задаче (см. Задачи ).

Существует также ручное подключение черезметод connect , но я бы не рекомендовал его для общего повторного использования соединения, так как он есть для особых случаев, в противном случае может быть подвержен ошибкам и лишает законной силы идею автоматических соединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...