Улучшение производительности Graphql (graphene-django) для 4 уровней вложенных списков
Я использую Django 4 с graphene-Django 3 и мне нужно структурировать ответ, который должен состоять из 4 уровней списков и нижнего уровня - словаря. Вот реализация
Вот запрос graphql:
inspectSensorFailureBySystem(){
failureSensors{
anomalyType
failureSensors{
spectra{
name
spectraZ {
Id
collectionName
rpmDetected
anomaly
values
valuesNames
sidebands
}
}
}
}
Результатом этого запроса является:
{
"data": {
"inspectSensorFailureBySystem": [
{
"failureSensors": [
{
"anomalyType": "spectra",
"failureSensors": [
{
"spectra": {
"name": [
"15339-envelope_spectra",
"15339-envelope_spectra_timedomain",
"15339-spectra_timedomain",
"15339-spectra"
],
"spectraZ": [
[
[
{
"Id": "628bd17db4aff3060810a726",
"collectionName": "spectrum",
"rpmDetected": -1,
"anomaly": -1,
"values": [],
"valuesNames": [],
"sidebands": []
},
...
{
"Id": "62e8d3119aa606584e88b228",
"collectionName": "timedomain",
"rpmDetected": 1256,
"anomaly": 1,
"values": [
261.1224,
522.2448,
783.3672,
1044.4896,
1305.612,
1566.7344,
1827.8568,
2088.9792,
2872.3464,
3133.4688
],
"valuesNames": [
1,
2,
3,
4,
5,
6,
7,
8,
11,
12
],
"sidebands": []
}
]
]
]
}
}
]
}
]
}
]
}
}
Данные поступают непосредственно из построчного списка словарей (spectra_z), который разбирается в предыдущем резольвере, и он работает довольно быстро (менее 0.2s). Таким образом, получение данных из базы данных, а затем разбор из строки в нужные вложенные списки и конечные словари происходит очень быстро.
Но после того, как резольвер завершает работу и я передаю результат движку GraphGL, GraphGL требуется более 30 секунд, чтобы разобрать данный результат и отправить окончательный ответ.
С другой стороны, если я просто получаю строгированные значения из базы данных (spectra_z) и просто передаю их как строку (без вложенных списков), очевидно, что GraphGL отвечает очень быстро.
Я не эксперт в GraphGL и хотел бы знать, как я могу ускорить graphene-Django, чтобы разобрать этот ответ быстрее (так как 30 секунд для получения ответа неприемлемо). Существуют ли какие-нибудь параметры для ускорения или какие-нибудь хитрости?
Я бы предложил следующее:
- Определите резольвер для spectra, который просто возвращает массив имен
- Определите резольвер для spectraZ, который просто возвращает список spectraZ .
- Определите отдельные резольверы для всех полей объекта spectraZ. Это позволит избежать длинной серии операторов
if
, в которых вы, по сути, разрешаете одно поле за каждый проход по ключам .
- Пусть GraphQL соберет все результаты в возвращаемый объект
В этом есть дополнительное преимущество - не нужно вычислять все вложенные поля, если клиент запрашивает не все из них. В данном случае, даже если вам нужны только имена, все остальное также будет вычислено.