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

GYAO의 ts입니다.

경위



마지막 게시물 로 데이터의 투입, 갱신은 할 수 있게 되었으므로, 청소 job인 cleanExpiredMessage를 만들어 보자. GAE의 크론 사용해도 좋지만, 재미있을 것 같아서 Azure LogicApps와 제휴해 본다. GUI로 직관적이고. 왠지 엔지니어가 아니어도 기동 시간이라든지 바꿀 수 있을 것 같고.

하고 싶은 일


  • https 요청으로 시작
  • messages 안의 expiredDate (unix timestamp)가 과거의 것을 검색해, 모두 delete 한다.

  • Cloud Functions



    index.js
    'use strict';
    
    const rcloadenv = require('@google-cloud/rcloadenv');
    rcloadenv.getAndApply('functionConfig');
    
    /**
     * job that cleans expired messages.
     *
     * @param {!Object} req Cloud Function request context.
     * @param {!Object} res Cloud Function response context.
     */
    exports.cleanExpiredMessage = (req, res) => {
        const key = req.query.key;
        if (!module.exports.authenticate(key)) {
            res.status(403).send('Security key does not match.');
        }
        else {
            console.log('invoke clean-expired-message Job.');
            const now = Math.floor( new Date().getTime() / 1000 );
            const messageRef = db.ref("messages");
            const updates = {};
            messageRef.orderByChild("expireDate").endAt(now).once('value', function(snapshot) {
                snapshot.forEach(function(child) {
                    console.log(child.key);
                    if (child.val().expireDate === undefined) {
                        console.log('expireDate is undefined.');
                        //do nothing.
                    }
                    else {
                        console.log(child.key + ' added to the delete list.');
                        updates[child.key] = null;
                    }
                });
            }).then(() => {
                console.log('clean-expired-message ended.');
                return messageRef.update(updates);
            }).catch((e) => {
                console.error(e);
                throw e;
            });
            res.status(200).send('Success');
        }
    };
    
    /**
     * authentication method.
     *
     * @param key CRON_KEY
     * @returns {boolean} authenticated or not.
     */
    exports.authenticate = function(key) {
        const secureCompare = require('secure-compare');
        if (!secureCompare(key, process.env.CRON_KEY)) {
            console.log('The key provided in the request does not match ' +
                'the key set in the environment. Check that', key,
                'matches the CRON_KEY');
            return false;
        }
        else {
            console.log('authenticated.');
            return true;
        }
    }
    

  • upsert 할 때 과 같이, multi-location updates 를 사용한다.
  • Realtime database는 null로 update 하면 remove가 되기 때문에 그것을 이용.

  • expireDate가 없는 메시지도 끌어오기 때문에, undefined의 경우는 remove 대상에는 넣지 않는다.

  • job의 기동 인증은 Runtime Config 를 사용한다. 여기 에서 상세하게 설명되어 있다.
  • config 'functionConfig'에 아래 명령으로 CRON_KEY를 설정하십시오.
  • $ gcloud beta runtime-config configs create functionConfig
    
    $ gcloud beta runtime-config configs variables set \
    CRON_KEY hogehoge \
    --is-text --config-name functionConfig
    
    

    이제 uri?key=hogehoge로 시작할 수 있습니다.

    Azure Logic Apps



    Azure LogicApps로 시작해 봅니다.
  • Azure 포털에서 로직 앱 만들기
  • 아래와 같이 구축. 이번은 기동 결과(status 코드 등을 slack에 송신하도록 설정)
  • 또한 slack 액션의 설정으로 실패시에도 결과가 slack에 보내도록(듯이) 설정

  • Slack, Cloud logging에서 확인


  • Slack

  • Cloud logging

  • 문제 없음.

    좋은 웹페이지 즐겨찾기