Firestore에 많은 수의 문서를 작성해야합니다.
Node.js에서 가장 빠른 방법은 무엇입니까?
답변
TL; DR : Firestore에서 대량 날짜 생성을 수행하는 가장 빠른 방법은 병렬 개별 쓰기 작업을 수행하는 것입니다.
Firestore에 1,000 개의 문서를 쓰려면 다음이 필요합니다.
~105.4s
순차적 인 개별 쓰기 작업을 사용하는 경우~ 2.8s
(2) 일괄 쓰기 작업을 사용하는 경우~ 1.5s
병렬 개별 쓰기 작업을 사용하는 경우
Firestore에서 많은 수의 쓰기 작업을 수행하는 일반적인 세 가지 방법이 있습니다.
- 각 개별 쓰기 작업을 순서대로 수행하십시오.
- 일괄 쓰기 작업 사용
- 개별 쓰기 작업을 병렬로 수행합니다.
무작위 문서 데이터 배열을 사용하여 아래에서 차례로 살펴 보겠습니다.
개별 순차 쓰기 작업
이것이 가장 간단한 해결책입니다.
async function testSequentialIndividualWrites(datas) {
while (datas.length) {
await collection.add(datas.shift());
}
}
모든 문서를 작성할 때까지 각 문서를 차례로 작성합니다. 다음 쓰기를 시작하기 전에 각 쓰기 작업이 완료 될 때까지 기다립니다.
이 방법을 사용하면 1,000 개의 문서를 작성하는 데 약 105 초가 걸리므로 처리량은 초당 약 10 개의 문서 쓰기입니다 .
일괄 쓰기 작업 사용
가장 복잡한 솔루션입니다.
async function testBatchedWrites(datas) {
let batch = admin.firestore().batch();
let count = 0;
while (datas.length) {
batch.set(collection.doc(Math.random().toString(36).substring(2, 15)), datas.shift());
if (++count >= 500 || !datas.length) {
await batch.commit();
batch = admin.firestore().batch();
count = 0;
}
}
}
BatchedWrite
을 호출 하여 객체를 생성 batch()
하고 최대 500 개의 문서 용량까지 채운 다음 Firestore에 씁니다. 우리는 각 문서에 상대적으로 고유 할 가능성이있는 생성 된 이름을 부여합니다 (이 테스트에는 충분합니다).
이 방법을 사용하면 1,000 개의 문서를 작성하는 데 약 2.8 초가 걸리므로 처리량은 초당 약 357 개의 문서 쓰기입니다 .
순차적 인 개별 쓰기보다 훨씬 빠릅니다. 실제로 : 많은 개발자들이이 방법을 사용하는 것이 가장 빠르다고 생각하기 때문에이 방법을 사용하지만 위의 결과에서 이미 알 수 있듯이 이것은 사실이 아닙니다. 그리고 배치에 대한 크기 제약으로 인해 코드가 훨씬 복잡합니다.
병렬 개별 쓰기 작업
Firestore 설명서에는 많은 데이터를 추가 하는 성능에 대해 다음 과 같이 나와 있습니다 .
대량 데이터 입력의 경우 병렬화 된 개별 쓰기가있는 서버 클라이언트 라이브러리를 사용하십시오. 배치 된 쓰기는 직렬화 된 쓰기보다 성능이 우수하지만 병렬 쓰기보다 성능이 좋지 않습니다.
다음 코드를 사용하여 테스트 할 수 있습니다.
async function testParallelIndividualWrites(datas) {
await Promise.all(datas.map((data) => collection.add(data)));
}
이 코드는 add
가능한 빨리 작업을 시작한 다음 작업 Promise.all()
이 끝날 때까지 기다립니다. 이 방법을 사용하면 작업을 병렬로 실행할 수 있습니다.
이 방법을 사용하면 1,000 개의 문서를 작성하는 데 약 1.5 초가 걸리므로 처리량은 초당 약 667 개의 문서 쓰기입니다 .
차이점은 처음 두 접근 방식만큼 크지는 않지만 배치 쓰기보다 1.8 배 이상 빠릅니다.
몇 가지 참고 사항 :
- 이 테스트의 전체 코드는 Github 에서 찾을 수 있습니다 .
- 테스트는 Node.js로 수행되었지만 Admin SDK가 지원하는 모든 플랫폼에서 유사한 결과를 얻을 수 있습니다.
- 그러나 결과가 매우 다르고 예측하기가 어려울 수 있으므로 클라이언트 SDK를 사용하여 대량 삽입을 수행하지 마십시오.
- 일반적으로 실제 성능은 컴퓨터, 인터넷 연결의 대역폭 및 대기 시간 및 기타 여러 요인에 따라 다릅니다. 그 순서에 따라 순서가 동일 할 것으로 예상되지만 그 차이에 따라 차이가있을 수도 있습니다.
- 자체 테스트에 특이 치가 있거나 완전히 다른 결과를 찾는 경우 아래에 의견을 남겨주십시오.
- 배치 쓰기는 원자 적입니다. 따라서 문서간에 종속성이 있고 모든 문서를 작성해야하거나 문서를 작성하지 않아야하는 경우 일괄 쓰기를 사용해야합니다.