Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

쿼리 복잡도 분석 #13

Merged
merged 21 commits into from
Aug 22, 2024
Merged

쿼리 복잡도 분석 #13

merged 21 commits into from
Aug 22, 2024

Conversation

1e16miin
Copy link

기존 팜모닝 코드 내에 존재하던 resource_limitation을 라시니아 내부로 이동시킵니다.

다른 언어로 작성된 라이브러리나 프레임워크들을 참고하였는데 (elixir - absinthe, ruby - graphql_ruby, haskell - hasura),
query validation -> (쿼리 복잡도 분석) -> execute 의 형태를 따라가고 있어 저희도 그와 같은 방식을 채택하여 작업하였습니다.

기존 팜모닝에서 작업했던 PR 에서는 단순히 request로 받은 쿼리를 분석하였다면, 이번에는 저희 schema와 쿼리를 먼저 합친 후 분석을 하도록 수정하였습니다.
그에 따라 schema에서 default로 정의된 값들을 쿼리 복잡도 분석에 사용하여 조금 더 정확한 분석결과를 얻을 수 있게되었습니다.

@1e16miin 1e16miin requested a review from namenu July 15, 2024 09:50
@@ -76,7 +84,7 @@
{:keys [timeout-ms timeout-error]
:or {timeout-ms 0
timeout-error {:message "Query execution timed out."}}} options
execution-result (execute-parsed-query-async parsed-query variables context)
execution-result (execute-parsed-query-async parsed-query variables context options)
Copy link
Author

@1e16miin 1e16miin Jul 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재는 여기서 options에 :max-complexity 라는 key에 value를 넣어서 최대 리소스를 제한하는 것을 고려하였는데요.
system.edn 의 config 에 max-complexity를 하나 정의하여 context로 부터 가져와도 될 것 같다고 생각하는데 고민이긴 합니다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저희 백엔드 코드에서 build-lacinia-options할 때 현재 환경이 dev / staging인 경우에만 :max-complexity 값을 하드코딩해서 넘겨도 충분할 것 같습니다(ex: :max-complexity 1000000)
굳이 system.edn에는 추가 안 해도 될 것 같슴다
https://github.com/green-labs/farmmorning-backend/blob/68978493665d1027f45c4a64100a0855d5cb7781/bases/core-api/src/farmmorning/core_api/graphql/handler.clj#L97

다른 lacinia 옵션값들도 그냥 하드코딩하고 있음

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

근데 지금 바로 반영된다면, 앱 코드들에 first: 9999 이런 잔재 때문에 프론트 개발자분들이 무조건 에러 응답들을 받아보실 텐데요..
우리 백엔드 미들웨어에서 라시니아 내부에서 뱉는 max-complexity 관련 에러는 로깅이나 슬랙만 보내고 by pass 한다던지의 의사결정만 될 듯 합니다!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

한 10만 정도로 설정해두고,
error에 code 하나 심어서 해당 code가 에러에 잡히면 근재님께서 제안해준 것 처럼 로깅이나 슬랙만 보내고 by pass하는게 좋을거같네요!

src/com/walmartlabs/lacinia/complexity_analysis.clj Outdated Show resolved Hide resolved
src/com/walmartlabs/lacinia/complexity_analysis.clj Outdated Show resolved Hide resolved
Comment on lines 62 to 66
:let [complexity-error (complexity-analysis/complexity-analysis prepared options)]

(some? complexity-error)
(resolve/resolve-as {:errors complexity-error})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

complexity-analysis 도 validator 중 하나로 설정할 수 있다면 좋겠는데...
이건 나중에 메인테이너가 어떻게 생각하는지 들어봅시다 ㅎㅎ

@namenu
Copy link
Member

namenu commented Jul 15, 2024

  1. green-labs/lacinia 별도로 클론 받으셔서 clojure -X:test 하시면 테스트를 실행하실 수 있습니다.
  2. farmmorning-backend 와 통합을 하시려거든 deps.edn 에 :local/root 로 1번에 대한 상대경로를 지정하시면 편리합니다.

@namenu
Copy link
Member

namenu commented Aug 2, 2024

master 가 꼬여있어서 이 브랜치도 리베이스 했습니다.

@1e16miin
Copy link
Author

@namenu 미루고 미루다 드디어 테스트 케이스 하나 추가해두었습니당...

@1e16miin 1e16miin merged commit c360d04 into master Aug 22, 2024
3 checks passed
:n-nodes n-nodes}]))))

(defn ^:private calculate-complexity
[{:keys [selections list-args? n-nodes]}]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 여기서 (seq selections) 체크가 필요한 것은 아닐지요...

Copy link
Member

@sookcha sookcha Aug 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

재귀 돌면서 leaf 가 selection이 없을 때의 동작이 정의되어 있지 않아 보여서요
수정: 꼭 leaf일 필요는 없겠네요

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants