>  기사  >  백엔드 개발  >  golang goroutine에서 ReadOnlyTransaction을 사용하는 Spanner 쿼리가 점차 느려지는 이유는 무엇인가요?

golang goroutine에서 ReadOnlyTransaction을 사용하는 Spanner 쿼리가 점차 느려지는 이유는 무엇인가요?

WBOY
WBOY앞으로
2024-02-08 21:00:121025검색

为什么在 golang goroutine 中使用 ReadOnlyTransaction 进行 Spanner 查询会逐渐变慢

질문 내용

테이블에서 약 10,000행을 쿼리하려고 합니다. 시도해 본 후 limit offset 的各种其他选项并且没有找到所需的成功之后,我尝试在每个 goroutine 中查询单行。思路是每行只需要 ~5ms 来查询和获取,但是一批 10k 会接管 20s.

아래는 코드의 단순화된 버전입니다.

으아악

결과는 다음과 같이 추적됩니다:

으아악

예상대로 잘 시작되지만 쿼리 시간이 계속 늘어납니다.

MaxSessionsMinSessions 对于 spannerClient100 따라서 100 이후에는 약간의 둔화를 볼 수 있다고 상상할 수 있지만 그렇지 않습니다.

여기를 읽어주세요:

으아악

비반복 쿼리(ReadRowetc)는 동일한 결과를 제공합니다.

for 루프 외부에서 tx := spannerClient.Single() 를 사용하면 비슷한 결과를 얻을 수 있습니다.

질문:

  1. 이것은 고루틴 내부에서 spannerClient.Single() 실행에도 불구하고 고루틴이 여전히 동일한 세션/트랜잭션을 사용하려고 한다는 것을 의미합니까?
  2. 이 문제를 해결하려면 위 내용을 어떻게 수정해야 하나요?

정답


TLDR: 기본 최대 세션 풀 크기는 400입니다. 즉, 400개가 넘는 쿼리를 병렬로 실행할 수 없다는 뜻입니다. 이 동시성을 달성하려면 세션 풀 크기를 늘려야 합니다.

우선, 각 쿼리가 한 행을 읽도록 10,000개의 쿼리를 병렬로 보내는 것이 문제에 대한 가장 효율적인 해결책이 아니라고 생각합니다. 직원 ID 외에 필터링하는 데 사용할 수 있는 다른 기준이 없고 해당 ID가 여기저기 흩어져 있는 경우 양식에서 쿼리를 만드는 것이 더 효율적입니다

으아악

전체 예를 보려면 다음 댓글을 참조하세요. https:///github.com/googleapis/google-cloud-go/issues/858#issuecomment-550982307

특정 질문으로 돌아가기:

  1. 실제로 쿼리를 실행하는 데 걸리는 시간을 측정하지 않습니다. 다소 혼란스럽기는 하지만 it := tx.Query(gCtx, stmt2) 줄은 쿼리를 실행하지 it := tx.Query(gCtx, stmt2) 行确实执行查询,它只是准备执行查询。第一次调用 row, err := it.Next()않지만
  2. 실행되도록 준비만 합니다. row, err := it.Next()가 처음 호출될 때 실행됩니다. 기록된 실행 시간에서도 이를 확인할 수 있습니다. 첫 번째 문은 30마이크로초 내에 실행되는 것으로 보이지만 이는 불가능합니다.
  3. 이것은 클라이언트의 무언가가 진행을 제한하고 있음을 의미합니다. 이 경우 세션 풀의 최대 크기라고 확신합니다. 기본 최대 세션 풀 크기는 400입니다. 즉, 최대 400개의 쿼리를 병렬로 실행할 수 있습니다. 대기 시간이 증가하는 것은 고루틴이 세션이 사용 가능해질 때까지 기다리는 대기 대기열에 배치되기 때문입니다. 대기열 끝에 있는 고루틴은 더 오래 기다립니다.
🎜

위 내용은 golang goroutine에서 ReadOnlyTransaction을 사용하는 Spanner 쿼리가 점차 느려지는 이유는 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제