Firebase RealtimeDatabase에 대량 데이터 투입 - 그 4 -
경위
마지막 게시물 에서 한가지 기능이 갖추어졌으므로, 테스트나 감시를 설정해 본다.
이번에는 꽤 분투했다. 부하 테스트의 500만 건 등록은 몇번 했던 것 같다. 클라우드 사용료가 어디까지 갈지 걱정. . .
감시
functions의 로그는 모두 CloudLogging에 집약되기 때문에, 지표를 작성해, 거기에 걸리면 통지를 내는 설정을 실시한다.
통지처는 Slack.
functions의 로그는 모두 CloudLogging에 집약되기 때문에, 지표를 작성해, 거기에 걸리면 통지를 내는 설정을 실시한다.
통지처는 Slack.
필터 설정
resource.type="cloud_function" OR resource.type="gcs_bucket"
severity>=WARNING
완료.
Unit test
unit.box.aggregator.test.js
const test = require('ava');
const sinon = require('sinon');
const authenticate = require('../index').authenticate;
const StateContext = require('../state-context');
const userState = require('../user-state');
const messageState = require('../message-state');
test.cb('StateContext.getState: should get the correct state messages.', t => {
t.plan(1);
const stateContext = new StateContext('messages/test.json');
t.is(typeof stateContext.getState(), typeof messageState);
t.end();
});
test.cb('StateContext.getState: should get the correct state users.', t => {
t.plan(1);
const stateContext = new StateContext('users/test.json');
t.is(typeof stateContext.getState(), typeof userState);
t.end();
});
test.cb('StateContext.getState: should throw the exception because of invalid directory.', t => {
t.plan(1);
try {
new StateContext('hoge/test.json');
}
catch (e) {
t.pass();
t.end();
return;
}
t.fail();
t.end();
});
and so on...
$ npm t
> functions@ test /Users/tstakano/IdeaProjects/BoxAggregatorFunctions/functions
> ava
10 tests passed
sinon을 사용하여 객체의 모의를 사용한 테스트 (오브젝트의 동작 위장으로 테스트)를 실시하려고 생각했지만, 큰 일은하고 있지 않은 것과 그것을하면 위장 투성이가되어 너무 맛이 좋다 그렇게 보였으므로 (특히 DB 주위), 아래의 방침으로 진행했다.
그래서, cron 기동의 인증 주위와 상기의 state 패턴 돌아가는 오브젝트 전환 로직을 테스트 대상으로 했다.
Stress Test
고부하 시의 거동을 보기 위해 스트레스 테스트를 실시한다.
시나리오는 10000 라인의 json lines이 1 파일 기술되어 있으며, 그것은 연속으로 500 파일 cloud storage에 업로드됩니다.
결과 500functions 기동되어, firebase에 대해서 각각의 function이 10000건의 update를 시도하게 된다.
dummy-json 를 사용하여 5백만 줄의 json lines 창조한다.
$ npm install -g dummy-json
$ vim user.hbs
user.hbs
{{#repeat 5000000 comma=false}}
{"userId" : "user-{{@index}}", "messageId": "941"}
{{/repeat}}
$ dummyjson user.hbs > user.csv
$ split -l 10000 user.csv test_
for f in test_??;do mv $f $f.csv;done
정리해 단번에 upload.
각 Function이 10000건씩 심판. 끝날 때까지 20분 정도.
CloudLogging
Firebase에서 json을 export합니다. 247MB 있다. . .
$ grep -c 'user-' export.json
5000000
500만건 등록이 끝났음을 확인할 수 있었다.
기타
스토리지 버킷 수명 주기
이대로라면 Storage에 파일이 무한하게 모여 가기 때문에, 라이프 사이클을 설정한다.
Reference
이 문제에 관하여(Firebase RealtimeDatabase에 대량 데이터 투입 - 그 4 -), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tstakano-yj/items/993abf861774fc6bd339텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)