Firebase RealtimeDatabase에 대량 데이터 투입--그 3--
경위
마지막 게시물 로 데이터의 투입, 갱신은 할 수 있게 되었으므로, 청소 job인 cleanExpiredMessage를 만들어 보자. GAE의 크론 사용해도 좋지만, 재미있을 것 같아서 Azure LogicApps와 제휴해 본다. GUI로 직관적이고. 왠지 엔지니어가 아니어도 기동 시간이라든지 바꿀 수 있을 것 같고.
하고 싶은 일
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;
}
}
'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 를 사용한다.
job의 기동 인증은 Runtime Config 를 사용한다. 여기 에서 상세하게 설명되어 있다.
$ 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로 시작해 봅니다.
Slack, Cloud logging에서 확인
문제 없음.
Reference
이 문제에 관하여(Firebase RealtimeDatabase에 대량 데이터 투입--그 3--), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tstakano-yj/items/121abb3a21da7c961ae7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)