Firestore에 많은 수의 문서를 작성해야합니다.
Node.js에서 가장 빠른 방법은 무엇입니까?
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 배 이상 빠릅니다.
몇 가지 참고 사항 :
add()
은 고유 ID (순전히 클라이언트 측)를 생성 한 다음 set()
작업을 수행하는 것 이상입니다. 따라서 결과는 동일해야합니다. 그것이 당신이 관찰 한 것이 아니라면, 당신이 시도한 것을 재현하는 최소한의 사례로 새로운 질문을 게시하십시오.