반응형
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
반응형
'programing' 카테고리의 다른 글
| Swift를 사용하여 소리를 재생하는 방법은 무엇입니까? (0) | 2023.05.18 |
|---|---|
| UI 이미지 크기를 조정하는 가장 간단한 방법은 무엇입니까? (0) | 2023.05.18 |
| fe_sendauth: 암호가 제공되지 않았습니다. (0) | 2023.05.18 |
| IIS 7, Windows 7에서 ASP.NET 4.0을 응용 프로그램 풀로 추가하는 방법 (0) | 2023.05.18 |
| Eclipse에서 'querystring' 텍스트가 포함된 프로젝트의 모든 파일 검색 (0) | 2023.05.18 |