Firebase RealtimeDatabase에 대량 데이터 투입 - 그 4 -

GYAO의 ts입니다.

경위



마지막 게시물 에서 한가지 기능이 갖추어졌으므로, 테스트나 감시를 설정해 본다.

이번에는 꽤 분투했다. 부하 테스트의 500만 건 등록은 몇번 했던 것 같다. 클라우드 사용료가 어디까지 갈지 걱정. . .

감시



functions의 로그는 모두 CloudLogging에 집약되기 때문에, 지표를 작성해, 거기에 걸리면 통지를 내는 설정을 실시한다.
통지처는 Slack.
  • stackdriver Logging에서 다음 필터 설정

  • 필터 설정
    resource.type="cloud_function" OR resource.type="gcs_bucket"
    severity>=WARNING
    
  • 메트릭 만들기
  • 메트릭에서 알림 만들기


  • 통지처를 Slack에


  • 완료.

    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 주위), 아래의 방침으로 진행했다.
  • 로직을 쓸 경우는 최대함수로서 낼 수 있는 것은 exports 하고 test대상.
  • 로직의 별로 들어 있지 않은 event trigger의 부분이나 DB에 가까운 부분은 무리하게 unit 테스트하지 않는다.

  • 그래서, 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

  • 정리해 단번에 upload.

  • 실행 결과

  • 각 Function이 10000건씩 심판. 끝날 때까지 20분 정도.
    CloudLogging


    Firebase에서 json을 export합니다. 247MB 있다. . .

    $ grep -c 'user-' export.json 
    5000000
    

    500만건 등록이 끝났음을 확인할 수 있었다.

    기타



    스토리지 버킷 수명 주기



    이대로라면 Storage에 파일이 무한하게 모여 가기 때문에, 라이프 사이클을 설정한다.
  • CloudStorage 대상 버킷의 수명주기를 클릭하십시오.


  • 규칙 추가 및 완료

  • 좋은 웹페이지 즐겨찾기