Parse.com을 Parse Server로 옮기다보니 Background Job이 미구현되어 있는 부분이 아쉽더라구요.
그래서 검색을 해보니 누군가 간단하게 PR로 올렸으나, 코드가 Parse Server에 합치기에는 좀 미완이라 거절 당한게 있더군요.
그 코드를 바탕으로 조금 손봐서 만들어봤습니다.
역시 node base다 보니 손쉽게 활용이 무궁무진하네요.
사용법은 parse-server-example 이용해서 parse server를 배포하실 텐데요. 그 프로젝트에 약간 코드를 추가합니다.
index.js 마지막에 실행 코드를 추가하구요.
src폴더안에 파일 3개를 넣습니다.
그리고 package.json의 dependencies에 cron을 추가해줍니다.
(코드 보시면 바로 아시겠지만… production 일때만 돌도록 강제되어 있으니 그부분은 테스트할 때는 제외하고 해보세요.)
CloudCode.js
// src/CloudCode.js
"use strict"
var Cron = require('./Cron');
var Job = require('./Job');
class CloudCode {
constructor(Parse, timezone){
this.Parse = Parse;
This file has been truncated. show original
Cron.js
// src/Cron.js
"use strict"
class Cron {
constructor(timezone){
this.cronJob = require('cron').CronJob;
this.jobs = [];
this.timezone = timezone;
}
This file has been truncated. show original
Job.js
// src/Job.js
"use strict"
class Job {
constructor(Parse){
this.Parse = Parse;
this.jobs = {};
}
This file has been truncated. show original
There are more than three files. show original
1개의 좋아요
소개해 주신 방법은 단일 서버에서 실행 될 때는 좋은 예입니다만,
멀티 서버에서 운영을 해야 하는 경우라면 Background Job이 멀티 서버의 index.js수 만큼 동작을 하게 됩니다.
방법을 찾다 보니 소개 해주신 코드와 함께 마이그레이션하는 DB에서 힌트를 얻으면 될 것 같습니다.
언젠가부터 Parse.com에서 DB를 마이그레이션 하면 _JobSchedule과 _JobStatus 테이블이 생성 되고 있습니다.
내용을 확인하면 등록한 Background Job 정보와 각 job의 실행 상태 정보가 들어가 있습니다.
그래서 수정을 한다면 _JobSchedule테이블 정보를 이용해서 Cron Job의 실행 시간을 정의 하고
정해진 시간에 실행 되는 cron job에서 _JobStatus에 해당하는 job이 실행중인지 확인 후
실행 중이면 종료하고 아니면 실행 하도록 만들면 될 것 같습니다.
저도 아직 검토중인데, 조만간 만들어서 적용해야 할 것 같네요.
2개의 좋아요
완성되면 공유해주세요~
그리고 많이 건드리시려면 parse-server 프로젝트를 fork해서 하시는게 좋습니다.
저는 parse-server가 아닌 곳에서 _테이블들은 건드리기 찜찜해서 따로 background job의 check in/check out & success/fail을 컨트롤 하고 있습니다.
정확하게 스펙대로 동작하게 parse-server하에서 만들고 컨트롤까지 붙이려고 하니 일이 너무 많더라구요ㅎㅎ
1개의 좋아요
이 코드를 방금 돌려봤습니다. @DongWoo_Gim 공유 감사해요.ㅎ
단순한 방법이지만 여러 서버중에 하나만 돌게 하려고 일단 서버 ip를 기준으로 해야겠어요.^^
간단하게 jobmanager를 만들어서 쓰고 있어요.
job을 특정 클래스에 기록해놓고,
상태가 end나 fail이면, 상태를 run으로 바꾸면서 checkin id를 생성해서 박은 다음에 10초 기다렸다가 다시 불러봐서 checkin id가 유지되면 작업을 돌리도록 만들었어요.
작업 돌리면서 최소 10분에 한번은 상태 갱신해주고요.
30분 이상 갱신이 없는 작업은 fail로 처리해주고, 작업 돌리면서 발생하는 로그도 거기에 찍고요.
혹시 이 거 설정하면서 더 챙겨야할게 있을까요? 전에 테스트 할때는 잘 되었는데 지금은 잘 안되네요.
gist의 예처럼 했고 Parse function 정의하고 했는데도 function이 호출 되지 않고 있네요.
아… 죄송합니다.
env의 서버 url을 안바꿔놓고는 안된다고 그러고 있었네요.
parse-server 쓰면서 하게되는 대표적인 실수 인것 같아요. 저번에 다른 상황에서 이랬는데 또.ㅠㅠ
카페에서 개발하다보니 어쩔 수 없네요.ㅎㅎ
다들 이런 적 있으시죠?
1개의 좋아요
개발/운영이 키도 다르고, url도 다르고, mongodb도 달라서요.
titanium에서는 종은님의 ti.devapp을 잘 사용하고 있구요.
parse-server에서는 node의 better-npm-run을 써서 로컬 서버를 개발/운영 구분해서 사용하고 있어요.
요새 생각에는 한국개발자들 보게 Parse Server 포럼을 만들까봐요.
React에서도 쓰고 Titanium에서도 쓰고, 이만큼 간단하고 빠르고 효율적인 백엔드가 있을까 싶어서요.
KossLab 프로젝트도 연말에 재심사 받아서 내년에는 이걸로 바꿔볼까 하는 생각도 있구요.
1개의 좋아요
아주 좋아요!! 저도 Parse-Server로 계속 쓸 것 같아요.
DongWoo_Gim:
요새 생각에는 한국개발자들 보게 Parse Server 포럼을 만들까봐요.
React에서도 쓰고 Titanium에서도 쓰고, 이만큼 간단하고 빠르고 효율적인 백엔드가 있을까 싶어서요.
discourse 포럼 기능중에 SSO(single sign on)기능이 있습니다. 여러 포럼을 하나의 계정으로 퉁 칠 수 있어요.
각기 다른 주제로 여러 포럼이 있지만 한개의 공동체 처럼 되면 어떨까하는 상상도 해봤습니다.
cron 설정을 다른 방식으로 해봤습니다.
AWS EB에서 여러 ec2 instance가 동작할 때에도 하나의 instance에서만 동작하도록 했습니다.