programing

MongoDB Change Streams로 인한 심각한 성능 저하

mytipbox 2023. 5. 18. 23:08
반응형

MongoDB Change Streams로 인한 심각한 성능 저하

Node.js의 MongoDB 데이터베이스 변경에 대한 실시간 업데이트를 받고 싶습니다.

단일 MongoDB 변경 스트림은 거의 즉시 업데이트 알림을 보냅니다.그러나 여러 개의 (10+) 스트림을 열면 데이터베이스 쓰기와 알림 도착 사이에 엄청난 지연(최대 몇 분)이 발생합니다.

이렇게 변경 스트림을 설정했습니다.

let cursor = collection.watch([
  {$match: {"fullDocument.room": roomId}},
]);
cursor.stream().on("data", doc => {...});

스트림을 설정하기 위해 다른 방법을 시도했지만 속도가 그만큼 느립니다.

let cursor = collection.aggregate([
  {$changeStream: {}},
  {$match: {"fullDocument.room": roomId}},
]);
cursor.forEach(doc => {...});

자동화된 프로세스는 성능 데이터를 수집하는 동안 작은 문서를 컬렉션에 삽입합니다.

일부 추가 세부 정보:

  • 개방형 스트림 커서 카운트: 50
  • 쓰기 속도: 100개의 문서/초(사용 시 10개 배치)insertMany)
  • 런타임: 100초
  • 평균 지연: 7.1초
  • 최대 지연: 205초(오타가 아닌 3분 이상)
  • MongoDB 버전: 3.6.2
  • 클러스터 설정 #1: MongoDB Atlas M10 (복제본 3개 세트)
  • 클러스터 설정 #2: DigitalOcean Ubuntu box + 도커의 단일 인스턴스 mongo 클러스터
  • Node.js CPU 사용량: 1% 미만

두 설정 모두 동일한 문제가 발생합니다.여기서 무슨 일이 벌어질까요?

MongoDB에 대한 Node.js 클라이언트의 기본 연결크기는 5입니다.스트림 커서를 변경할 때마다 연결이 열리므로 연결 풀은 커서 수만큼 커야 합니다.

Node Mongo 드라이버 버전 3.x에서는 'poolSize'를 사용합니다.

const mongoConnection = await MongoClient.connect(URL, {poolSize: 100});

Node Mongo 드라이버 버전 4.x에서는 'minPoolSize' 및 'maxPoolSize'를 사용합니다.

const mongoConnection = await MongoClient.connect(URL, {minPoolSize: 100, maxPoolSize: 1000});

(MongoDB Inc.에서 이 문제를 조사해 주셔서 감사합니다.)

언급URL : https://stackoverflow.com/questions/48411897/severe-performance-drop-with-mongodb-change-streams

반응형