Cronã®æ©ã¿ãé¿ããããã¯ã°ã©ãŠã³ããžã§ãã®ã¹ã±ãžã¥ãŒãªã³ã°ãã¿ãŒã³
ã¯ãŒã¯ãããŒãšãžã§ãããŒãã«ã䜿ãããªãã€ã³ããŒãæ¥æ¬¡ãµããªãŒãã¯ãªãŒã³ã¢ãããä¿¡é Œæ§é«ãã¹ã±ãžã¥ãŒã«ããããã®ãã¿ãŒã³ãåŠã³ãŸãã

Cronã¯äžèŠã·ã³ãã«ã ããåé¡ã¯åŸããæ¥ã
Cronã¯åæ¥ã¯çŽ æŽãããïŒ1è¡æžããŠæéãéžã¹ã°å¿ããŠããããµãŒããäžå°ã§ã¿ã¹ã¯ãäžã€ãªããå€ãã®å Žåããã§ååã ã
æ¬åœã®è£œåæåïŒãªãã€ã³ããŒãæ¥æ¬¡ãµããªãŒãã¯ãªãŒã³ã¢ãããåæãžã§ãïŒãã¹ã±ãžã¥ãŒãªã³ã°ã«é Œããšåé¡ãèŠããŠãããå€ãã®ãå®è¡ãæŒããã話ã¯Cronèªäœã®å€±æã§ã¯ãªãããµãŒãåèµ·åããããã€ã§crontabãäžæžããããããžã§ããæ³å®ããé·ãå®è¡ããããæå»ãã¿ã€ã ãŸãŒã³ã®äžäžèŽââãããªåšèŸºã®åé¡ã ãè€æ°ã®ã¢ããªã€ã³ã¹ã¿ã³ã¹ãåãããšéã®å€±æãã€ãŸãéè€å®è¡ïŒ2å°ãåãã¿ã¹ã¯ãå®è¡ããŠããŸãïŒãèµ·ããã
ãã¹ãã匱ç¹ã ãCronã®1è¡ã¯ãææ¥9:00ã«äœãèµ·ãããããåçŸå¯èœã«å®è¡ããææ®µãäžããŠãããªããçµæãšããŠã¹ã±ãžã¥ãŒãªã³ã°ã¯æåãã§ãã¯ãæ¬çªã§ã®é©ãããã°è¿œè·¡ã«å€ããã
ã¢ãããŒããéžã¶åã«ãäœãã¹ã±ãžã¥ãŒã«ããã®ããæç¢ºã«ããããèæ¯åŠçã®å€§åã¯æ¬¡ã®ã«ããŽãªã«åãŸãïŒ
- ãªãã€ã³ããŒïŒç¹å®ã®æå»ã«1åã ãéãïŒ
- æ¥æ¬¡ãµããªãŒïŒããŒã¿ãéçŽããŠéãïŒ
- ã¯ãªãŒã³ã¢ããïŒåé€ãã¢ãŒã«ã€ããæéåãåŠçïŒ
- 宿åæïŒæŽæ°ããã«ïŒããã·ã¥ïŒ
ã€ãã³ãçºçæã«å³åº§ã«åŠçã§ãããã®ã¯ãæéé§åããã€ãã³ãé§åã®ã»ããåçŽã§ä¿¡é Œæ§ãé«ãå Žåãå€ãã
æéããŒã¹ãå¿ èŠãªãšããä¿¡é Œæ§ã¯å¯èŠæ§ãšå¶åŸ¡ã«å°œãããäœãå®è¡ãããã¹ãããäœãå®è¡ãããããäœã倱æããããèšé²ããå Žæã欲ãããå ããŠãéè€ãäœããå®å šã«ãªãã©ã€ã§ããä»çµã¿ãå¿ èŠã ã
åºæ¬ãã¿ãŒã³ïŒã¹ã±ãžã¥ãŒã©ããžã§ãããŒãã«ãã¯ãŒã«ãŒ
Cronã®æ©ã¿ãé¿ããç°¡åãªæ¹æ³ã¯è²¬åãåããããšã ã
- ã¹ã±ãžã¥ãŒã©ã¯äœããã€å®è¡ããããæ±ºããã
- ã¯ãŒã«ãŒã¯ä»äºãå®è¡ããã
圹å²ãåé¢ãããš2ã€ã®å©ç¹ããããã¿ã€ãã³ã°ãããžãã¹ããžãã¯ã«è§Šããã«å€ããããããžãã¹ããžãã¯ãå€ããŠãã¹ã±ãžã¥ãŒã«ãå£ããªãã
ãžã§ãããŒãã«ã¯çå®ã®ãœãŒã¹ã«ãªããç¶æ ããµãŒãããã»ã¹ãcrontabã®äžã«é ã代ããã«ãä»äºã®åäœãè¡ãšããŠæã€ïŒäœããããã誰ã®ãããããã€å®è¡ããããååäœãèµ·ããããåé¡ãèµ·ããã調ã¹ãŠåå®è¡ããããã£ã³ã»ã«ãããã§ããã
å žåçãªãããŒã¯æ¬¡ã®éãïŒ
- ã¹ã±ãžã¥ãŒã©ãå®è¡å¯Ÿè±¡ã®ãžã§ããã¹ãã£ã³ããïŒäŸ:
run_at <= nowãšstatus = queuedïŒã - ãžã§ããã¯ã¬ãŒã ããŠ1ã€ã®ã¯ãŒã«ãŒã ããåãã
- ã¯ãŒã«ãŒããžã§ãã®è©³çްãèªã¿ãåŠçãè¡ãã
- ã¯ãŒã«ãŒãçµæãåãè¡ã«èšé²ããã
éèŠãªã®ã¯ä»äºãéæ³ã«ããªãããšãåéå¯èœã«ããããšã ãã¯ãŒã«ãŒãéäžã§èœã¡ãŠãããžã§ãè¡ã¯äœãèµ·ããããšæ¬¡ã«äœããã¹ããã瀺ããŠããã¹ãã ã
圹ã«ç«ã¡ç¶ãããžã§ãããŒãã«ã®èšèš
ãžã§ãããŒãã«ã¯çŽ æ©ã2ã€ã®è³ªåã«çããããã¹ãã ïŒæ¬¡ã«äœãå®è¡ããå¿ èŠãããããååã¯äœãèµ·ãããã
ãŸãã¯èå¥ãã¿ã€ãã³ã°ã鲿ãã«ããŒããæå°éã®ãã£ãŒã«ãããå§ããïŒ
- id, type: äžæã®IDãš
send_reminderãdaily_summaryã®ãããªçãã¿ã€ãã - payload: ã¯ãŒã«ãŒãå¿
èŠãšããã ããæ€èšŒæžã¿JSONã§ïŒäŸ:
user_idããŠãŒã¶ãŒå šäœãªããžã§ã¯ãã§ã¯ãªãIDã®ã¿ïŒã - run_at: ãžã§ããå®è¡å¯èœã«ãªãæå»ã
- status:
queued,running,succeeded,failed,canceledã - attempts: å詊è¡ã§ã€ã³ã¯ãªã¡ã³ãããã
次ã«éçšäžåœ¹ç«ã€ã«ã©ã ãããã€ã远å ãããlocked_atãlocked_byãlocked_untilã¯ã¯ãŒã«ãŒããžã§ããã¯ã¬ãŒã ããŠäºéå®è¡ãé²ãã®ã«äœ¿ããlast_errorã¯è¡ãèšããŸããªãçãã¡ãã»ãŒãžïŒå¿
èŠãªããšã©ãŒã³ãŒãïŒã«ããŠããã«ã¹ã¿ãã¯ãã¬ãŒã¹ã§è¡ãè¥å€§åãããªãã
æåŸã«ãµããŒããšã¬ããŒãã«åœ¹ç«ã€ã¿ã€ã ã¹ã¿ã³ããæ®ãïŒcreated_at, updated_at, finished_atãããã§ã仿¥äœä»¶ã®ãªãã€ã³ããŒã倱æãããïŒãã®ãããªåãã«ãã°ãæããã«çããããã
ã€ã³ããã¯ã¹ã¯ã次ã¯äœïŒããšããåãã«é »ç¹ã«çããããéèŠã ãè²»çšå¯Ÿå¹æãé«ã2ã€ïŒ
(status, run_at)ïŒæéå°æ¥ãžã§ããçŽ æ©ãååŸããããã(type, status)ïŒãããžã§ããã¡ããªã調æ»ã»äžæåæ¢ããããã
payloadã¯å°ããçŠç¹ãçµã£ãJSONã奜ã¿ãæ¿å ¥åã«æ€èšŒãããèå¥åããã©ã¡ãŒã¿ãä¿åããæ¥åããŒã¿ã®ã¹ãããã·ã§ããã¯ä¿åããªãããã€ããŒãã®åœ¢ç¶ãAPIå¥çŽã®ããã«æ±ããå€ããã¥ãŒã€ã³ã°æžã¿ãžã§ããã¢ããªã®å€æŽåŸãåãããã«ããã
ãžã§ãã®ã©ã€ããµã€ã¯ã«ïŒã¹ããŒã¿ã¹ãããã¯ãåªçæ§
ãžã§ãã©ã³ããŒãä¿¡é Œã§ããã®ã¯ãå šãŠã®ãžã§ããå°ããäºæž¬å¯èœãªã©ã€ããµã€ã¯ã«ã«åŸããšãã ãäºéã§ã¯ãŒã«ãŒãèµ·åãããšãããµãŒããéäžã§åèµ·åãããšãããªãã©ã€ãå¿ èŠãªãšãããã®ã©ã€ããµã€ã¯ã«ãå®å šç¶²ã«ãªãã
åçŽãªç¶æ æ©æ¢°ã§ååãªããšãå€ãïŒ
- queued:
run_at以éã«å®è¡å¯èœ - running: ã¯ãŒã«ãŒãã¯ã¬ãŒã ãã
- succeeded: å®äºãåå®è¡äžèŠ
- failed: ãšã©ãŒã§çµäºã察åŠãå¿ èŠ
- canceled: æå³çã«åæ¢ïŒäŸ: ãŠãŒã¶ãŒããªããã¢ãŠãïŒ
äºéå®è¡ãé²ãã¯ã¬ãŒã æ¹æ³
éè€ãé²ãã«ã¯ãžã§ãã®ã¯ã¬ãŒã ãååçã«è¡ãå¿
èŠããããäžè¬çãªã¢ãããŒãã¯ã¿ã€ã ã¢ãŠãä»ãããã¯ïŒãªãŒã¹ïŒã ïŒã¯ãŒã«ãŒã¯status=runningãèšå®ããlocked_byãšlocked_untilãæžã蟌ãã§ãžã§ããã¯ã¬ãŒã ãããã¯ãŒã«ãŒãèœã¡ããããã¯ã¯æéåãã«ãªããå¥ã®ã¯ãŒã«ãŒãåã¯ã¬ãŒã ã§ããã
å®çšçãªã¯ã¬ãŒã ã«ãŒã«ã®äŸïŒ
run_at <= nowã®queuedãžã§ãã®ã¿ã¯ã¬ãŒã ããstatusãlocked_byãlocked_untilãåãæŽæ°ã§æžãlocked_until < nowã®ãšãã ãrunningãžã§ããåã¯ã¬ãŒã ãã- ãªãŒã¹ã¯çãã«ããŠãé·æéã®ãžã§ããªãå»¶é·ãã
åªçæ§ïŒèº«ã«ã€ããã¹ãç¿æ £ïŒ
åªçæ§ãšã¯åããžã§ãã2åå®è¡ãããŠãçµæãæ£ããããšãæå³ããã
æãç°¡åãªããŒã«ã¯äžæããŒã ãæ¥æ¬¡ãµããªãŒãªã summary:user123:2026-01-25 ã®ãããªããŒã§ãŠãŒã¶ãŒããšæ¥ããšã«1ã€ã«å¶çŽããŠãããšãéè€æ¿å
¥ãèµ·ããŠãå¥ã®ãžã§ãã§ã¯ãªãåããžã§ããæãã
å¯äœçšãæ¬åœã«å®äºãããšãã ãæåãããŒã¯ããïŒã¡ãŒã«éä¿¡ãã¬ã³ãŒãæŽæ°ãªã©ïŒããªãã©ã€æã«äºéã¡ãŒã«ãéè€æžã蟌ã¿ãèµ·ããªãããã«ãªãã©ã€çµè·¯ãäœãã
ãã©ããé¿ãããªãã©ã€ãšå€±æåŠç
ãªãã©ã€ã¯ãžã§ãã·ã¹ãã ãé Œããããã€ãºã®å±±ã«ãªãããæ±ºãããç®æšã¯åçŽïŒäžæçãªå€±æãªãå詊è¡ããæä¹ çãªå€±æãªãæ¢ããã
ããã©ã«ãã®ãªãã©ã€æ¹éã«å«ããã¹ãèŠçŽ ã¯ïŒ
- æå€§è©Šè¡åæ°ïŒäŸ: åèš5åïŒ
- é å»¶æŠç¥ïŒåºå®é å»¶ãææ°ããã¯ãªãïŒ
- 忢æ¡ä»¶ïŒãç¡å¹ãªå ¥åãã®ãããªãšã©ãŒã¯å詊è¡ããªãïŒ
- ãžãã¿ãŒïŒçãã©ã³ãã ãªãã»ããã§ãªãã©ã€ã¹ãã€ã¯ãé¿ããïŒ
ãªãã©ã€çšã«æ°ããã¹ããŒã¿ã¹ãäœã代ããã«ãqueuedãåå©çšããããšãå€ãïŒrun_atãæ¬¡ã®è©Šè¡æéã«èšå®ããŠãžã§ããå床ãã¥ãŒã«æ»ããç¶æ
æ©æ¢°ãå°ãããŸãŸã§æžãã
ãžã§ããéšåçã«é²ãå¯èœæ§ããããšãã¯ããããæ®éã®ããšãšããŠæ±ãããã§ãã¯ãã€ã³ããä¿åããŠãªãã©ã€ãå®å
šã«ç¶è¡ã§ããããã«ããïŒãžã§ããã€ããŒãã«last_processed_idãå
¥ãããé¢é£ããŒãã«ã«ä¿åããïŒã
äŸïŒæ¥æ¬¡ãµããªãŒãžã§ãã500ãŠãŒã¶ãŒåã®ã¡ãã»ãŒãžãçæããããŠãŒã¶ãŒ320ã§å€±æããããæåŸã«æåããIDãä¿åããŠ321ããåéããããŠãŒã¶ãŒããšæ¥ããšã®summary_sentã¬ã³ãŒããä¿åããŠããã°ãåå®è¡ã§æ¢ã«æžãã ãŠãŒã¶ãŒã¯ã¹ãããã§ããã
ãããã°ã«åœ¹ç«ã€ãã°
æ°åã§åå ã远ããããã«ãã°ãæ®ãïŒ
- job idãtypeãattemptçªå·
- äž»èŠå ¥åïŒuser/team idãæ¥ä»ç¯å²ïŒ
- æéïŒstarted_atãfinished_atãæ¬¡åå®è¡æå»ïŒ
- çããšã©ãŒæŠèŠïŒå©çšã§ããã°ã¹ã¿ãã¯ãã¬ãŒã¹ãïŒ
- å¯äœçšã®æ°ïŒéä¿¡ããã¡ãŒã«æ°ãæŽæ°ããè¡æ°ïŒ
ã¹ããããã€ã¹ãããïŒã·ã³ãã«ãªã¹ã±ãžã¥ãŒã©ã«ãŒããäœã
ã¹ã±ãžã¥ãŒã©ã«ãŒãã¯åºå®ãªãºã ã§èµ·ããŠæéå°æ¥ãžã§ããæ¢ãæž¡ãå°ããªããã»ã¹ã ãç®çã¯æŽŸæãã§ã¯ãªãå¡åºžãªä¿¡é Œæ§ãå€ãã®ã¢ããªã§ã¯ã1åããšã«èµ·åºãã§ååã ã
ãžã§ãã®æéææåºŠãDBè² è·ã«å¿ããŠèµ·åºé »åºŠã決ããããªãã€ã³ããŒãã»ãŒãªã¢ã«ã¿ã€ã ã§ããå¿ èŠãããã°30ã60ç§ãæ¥æ¬¡ãµããªãŒãªã5åããšã§ååãã€å®äŸ¡ã ã
ç°¡åãªã«ãŒãïŒ
- èµ·åºããŠçŸåšæå»ãååŸïŒUTCã䜿ãïŒ
status = 'queued'ãã€run_at <= nowã®æéå°æ¥ãžã§ããéžæ- ãžã§ããå®å šã«ã¯ã¬ãŒã ããŠ1ã€ã®ã¯ãŒã«ãŒã ããåã
- ã¯ã¬ãŒã ããåãžã§ããã¯ãŒã«ãŒã«æž¡ã
- 次ã®ãã£ãã¯ãŸã§ã¹ãªãŒã
ã¯ã¬ãŒã ã¹ãããã§å€ãã®ã·ã¹ãã ãå£ããããžã§ããéžæããåããã©ã³ã¶ã¯ã·ã§ã³ã§ running ã«ããŒã¯ããŠlocked_byãšlocked_untilãä¿åããããå€ãã®ããŒã¿ããŒã¹ã¯ SKIP LOCKED ã®ãããªèªã¿åãããµããŒãããè€æ°ã®ã¹ã±ãžã¥ãŒã©ãå¹²æžããã«åããã
-- concept example
BEGIN;
SELECT id FROM jobs
WHERE status='queued' AND run_at <= NOW()
ORDER BY run_at
LIMIT 100
FOR UPDATE SKIP LOCKED;
UPDATE jobs
SET status='running', locked_until=NOW() + INTERVAL '5 minutes'
WHERE id IN (...);
COMMIT;
ããããµã€ãºã¯å°ããïŒ50ã200çšåºŠïŒãä¿ãŠã倧ãããããšDBãé ããªããã¯ã©ãã·ã¥æã®åœ±é¿ã倧ãããªãã
ã¹ã±ãžã¥ãŒã©ããããéäžã§èœã¡ãŠããªãŒã¹ãå©ãã«ãªããrunningã«æ®ã£ããžã§ãã¯locked_untilåŸã«åã³å®è¡å¯èœã«ãªããã¯ãŒã«ãŒã¯åªçã§ããã¹ããªã®ã§ãåã¯ã¬ãŒã ããããžã§ããäºéã¡ãŒã«ãäºé課éãçãŸãªãããã«ããã
ãªãã€ã³ããŒãæ¥æ¬¡ãµããªãŒãã¯ãªãŒã³ã¢ããã®ãã¿ãŒã³
ã»ãšãã©ã®ããŒã ã¯åã3çš®é¡ã®èæ¯åŠçã«èœã¡çãïŒæå®æå»ã«éãã¡ãã»ãŒãžã宿çã«èµ°ãã¬ããŒããã¹ãã¬ãŒãžãšæ§èœãä¿ã€ã¯ãªãŒã³ã¢ãããåããžã§ãããŒãã«ãšã¯ãŒã«ãŒã«ãŒãã§å šãŠæ±ããã
ãªãã€ã³ããŒ
ãªãã€ã³ããŒã«ã¯ã¡ãã»ãŒãžéä¿¡ã«å¿ èŠãªãã®ããã¹ãŠãžã§ãè¡ã«ä¿åããïŒèª°ã«ãã©ã®ãã£ãã«ïŒemailãSMSãTelegramãã¢ããªå ïŒãã©ã®ãã³ãã¬ãŒããæ£ç¢ºãªéä¿¡æå»ãã¯ãŒã«ãŒã¯è¿œå ã®ã³ã³ããã¹ããæ¢ããã«ãžã§ããå®è¡ã§ããã¹ãã ã
å€ãã®ãªãã€ã³ããŒãåæã«å°æ¥ãããªãã¬ãŒãå¶éãå ¥ããããã£ãã«ããšã®åïŒç§ãããã®äžéãæ±ºããäœåãªãžã§ãã¯æ¬¡åã«åãã
æ¥æ¬¡ãµããªãŒ
æ¥æ¬¡ãµããªãŒã¯æéçªããããŸãã ãšå€±æãããå®å®ããã«ãããªãæå»ïŒäŸ: ãŠãŒã¶ãŒã®ããŒã«ã«æéã§08:00ïŒãéžã³ããŠã£ã³ããŠãæç¢ºã«å®çŸ©ããïŒäŸ: âæšæ¥08:00ãã仿¥08:00âïŒããªãã©ã€ã§ãåãçµæãåºãããã«ã«ãããªããšãŠãŒã¶ãŒã®ã¿ã€ã ãŸãŒã³ããžã§ãã«ä¿åããã
åãµããªãŒã¯å°ããä¿ãŠãäœåä»¶ãåŠçããå¿ èŠãããã°ãã£ã³ã¯ã«åå²ïŒããŒã ããšãã¢ã«ãŠã³ãããšãIDã¬ã³ãžããšïŒããŠãã©ããŒã¢ãããžã§ãããã¥ãŒã«å ¥ããã
ã¯ãªãŒã³ã¢ãã
ã¯ãªãŒã³ã¢ããã¯ãåé€ããšãã¢ãŒã«ã€ãããåãããšå®å šã ãå®å šã«åé€ããŠãããã®ïŒããŒã¯ã³ãæéåãã»ãã·ã§ã³ïŒãšã¢ãŒã«ã€ããã¹ããã®ïŒç£æ»ãã°ãè«æ±æžïŒã決ãããé·ãããã¯ãæ¥æ¿ãªè² è·ã¹ãã€ã¯ãé¿ãããããäºæž¬å¯èœãªãããã§å®è¡ããã
æå»ãšã¿ã€ã ãŸãŒã³ïŒãã°ã®é ãå®¶
å€ãã®å€±æã¯æéã«é¢ãããã°ã ïŒãªãã€ã³ããŒã1æéæ©ãéããããæ¥æ¬¡ãµããªãŒãææãé£ã°ããã¯ãªãŒã³ã¢ããã2åèµ°ãã
è¯ãããã©ã«ãã¯ã¹ã±ãžã¥ãŒã«æå»ãUTCã§ä¿åãããŠãŒã¶ãŒã®ã¿ã€ã ãŸãŒã³ãå¥ã«ä¿åããããšãrun_atã¯1ã€ã®UTCæå»ã§ããã¹ãã ããŠãŒã¶ãŒããèªåã®æéã§9:00ããšèšã£ãããã¹ã±ãžã¥ãŒãªã³ã°æã«UTCã«å€æããŠä¿åããã
ãµããŒã¿ã€ã ïŒDSTïŒã¯çŽ æŽãªå®è£ ãå£ããã€ã³ãã ããæ¯æ¥9:00ãã¯ã24æéããšããšå矩ã§ã¯ãªããDSTã®åãæ¿ãã§9:00ã®UTCãããã³ã°ãå€ãããååšããªãããŒã«ã«æå»ïŒæ¥ïŒã2åèµ·ããæå»ïŒç§ïŒãåºããããå®å šãªæ¹æ³ã¯ã次ã®ããŒã«ã«çºçæå»ãéœåºŠèšç®ãããããUTCã«å€æããŠã¹ã±ãžã¥ãŒã«ããããšã ã
æ¥æ¬¡ãµããªãŒã«ã€ããŠã¯ãæ¥ããäœãæå³ããããå ã«æ±ºãããã«ã¬ã³ããŒãã€ïŒãŠãŒã¶ãŒã®ã¿ã€ã ãŸãŒã³ã®çå€äžããçå€äžïŒã¯äººéã®æåŸ ã«åãã24æéããšã¯åçŽã ããããŠããã
é å»¶ããŒã¿ã¯é¿ããããªãïŒã€ãã³ããé ããŠå±ããã¡ã¢ãæ·±å€æ°ååŸã«è¿œå ããããé å»¶ã€ãã³ãããæšæ¥ãã«å«ãããïŒç¶äºæéãèšããïŒããããšãã仿¥ãã«å«ããããæ±ºããŠäžè²«ãããã
å®çšçãªäœè£çïŒ
- æéå°æ¥ãã2ã5åé¡ã£ãŠãžã§ããã¹ãã£ã³ãã
- ãžã§ããåªçã«ããŠåå®è¡ãå®å šã«ãªãããã«ãã
- ã«ãã¬ããžããæéç¯å²ããã€ããŒãã«èšé²ããŠãµããªãŒã®äžè²«æ§ãä¿ã€
èŠèœãšãããã¡ãªãã¹ïŒå®è¡æŒããéè€ã®åå ïŒ
å€ãã®åé¡ã¯äºæž¬å¯èœãªåæããçããã
æå€§ã®èª€ãã¯ãã¡ããã©äžåºŠã ãå®è¡ãããããšä»®å®ããããšãå®éã«ã¯ã¯ãŒã«ãŒã¯åèµ·åãããããã¯ãŒã¯åŒã³åºãã¯ã¿ã€ã ã¢ãŠãããããã¯ã¯å€±ããããçŸå®ã«ã¯ãå°ãªããšãäžåºŠïŒat least onceïŒãã®é éã«ãªããã¡ã§ãéè€ã¯æ®éã ãšèããŠã³ãŒããèæ§åããå¿ èŠãããã
å¥ã®èª€ãã¯å¯äœçšãå
ã«è¡ã£ãŠããã¥ãŒããã§ãã¯ãããªãããšãç°¡åãªã¬ãŒãã§è§£æ±ºã§ããïŒsent_atã¿ã€ã ã¹ã¿ã³ãã(user_id, reminder_type, date) ã®ãããªäžæããŒããŸãã¯ä¿åãããããã¥ãŒãããŒã¯ã³ã
å¯èŠæ§ã®æ¬ åŠãèŽåœçã ããäœãè©°ãŸã£ãŠãããããã€ããããªãããçããããªããšæšæž¬ã«é Œãããšã«ãªããæå°éã«ä¿æãã¹ãããŒã¿ã¯ã¹ããŒã¿ã¹ã詊è¡åæ°ã次åäºå®æå»ãæåŸã®ãšã©ãŒãã¯ãŒã«ãŒIDã ã
ãããããã¹ïŒ
- ãžã§ããã¡ããã©äžåå®è¡ãããåæã§èšèšããéè€ã«é©ã
- å¯äœçšãæžãåºãåã«ããã¥ãŒããã§ãã¯ãããªã
- å šéšãããããšãã巚倧ãªãžã§ããæžããŠéäžã§ã¿ã€ã ã¢ãŠããã
- ç¡å¶éã«ãªãã©ã€ãã
- ãã¥ãŒã®å¯èŠæ§ãé£ã°ãïŒããã¯ãã°ã倱æãé·æéå®è¡ã®æç¢ºãªãã¥ãŒããªãïŒ
å ·äœäŸïŒæ¥æ¬¡ãµããªãŒãžã§ãã50,000ãŠãŒã¶ãŒãã«ãŒããã20,000ãŠãŒã¶ãŒã§ã¿ã€ã ã¢ãŠããããšããããªãã©ã€æã«æåããããçŽããšãæåã®20,000ãŠãŒã¶ãŒã«å床ãµããªãŒãéã£ãŠããŸãããŠãŒã¶ãŒåäœã§ã®å®äºèšé²ã䜿ããããŠãŒã¶ãŒããšã®ãžã§ãã«åå²ããŠãããé²ãã
ä¿¡é Œã§ãããžã§ãã·ã¹ãã ã®ã¯ã€ãã¯ãã§ãã¯ãªã¹ã
ãžã§ãã©ã³ããŒã¯ãæ·±å€2æã«ä¿¡é Œã§ããããšèšããããã«ãªã£ãŠåããŠå®æã ã
çšæãã¹ããã®ïŒ
- ãã¥ãŒã®å¯èŠæ§ïŒqueuedãrunningãfailedã®æ°ãšãæå€ã®queuedãžã§ããèŠããããšã
- ããã©ã«ãã§ã®åªçæ§ïŒãã¹ãŠã®ãžã§ãã¯2åå®è¡ãããåæã§èšèšãããäžæããŒããæ¢ã«åŠçæžã¿ãããŒã«ãŒã䜿ãã
- ãžã§ãã¿ã€ãå¥ã®ãªãã©ã€æ¹éïŒãªãã©ã€åæ°ãããã¯ãªããæç¢ºãªåæ¢æ¡ä»¶ã
- äžè²«ããæå»ä¿åïŒ
run_atã¯UTCã§ä¿åããå ¥åãšè¡šç€ºæã«ã®ã¿å€æããã - å埩å¯èœãªããã¯ïŒã¯ã©ãã·ã¥ã§ãžã§ããæ°žä¹ ã«å®è¡äžã«ãªããªãããã«ãªãŒã¹ã䜿ãã
ãŸãããããµã€ãºïŒäžåºŠã«ã¯ã¬ãŒã ãããžã§ãæ°ïŒãšã¯ãŒã«ãŒã®åæå®è¡æ°ã®äžéãèšãããéçãèšããªããšãã¹ãã€ã¯ã§DBãéè² è·ã«ãªã£ããä»ã®åŠçãæ¯æžãããããã
çŸå®çãªäŸïŒå°èŠæš¡ããŒã åãã®ãªãã€ã³ããŒãšãµããªãŒ
å°ããªSaaSã¯30ã®é¡§å®¢ã¢ã«ãŠã³ããæã€ãããããã2ã€ãæ±ããŠããïŒ9:00ã«æªå®ã¿ã¹ã¯ã®ãªãã€ã³ããŒã18:00ã«ãã®æ¥å€ãã£ãããšã®ãµããªãŒãããã«é±æ¬¡ã¯ãªãŒã³ã¢ããã§å€ããã°ãæéåãããŒã¯ã³ãæºãŸããªãããã«ããã
圌ãã¯ãžã§ãããŒãã«ãšæéå°æ¥ãããŒãªã³ã°ããã¯ãŒã«ãŒã䜿ããæ°ãã顧客ããµã€ã³ã¢ãããããšããããã¯ãšã³ãã¯ãã®é¡§å®¢ã®ã¿ã€ã ãŸãŒã³ã«åºã¥ããŠæåã®ãªãã€ã³ããŒãšãµããªãŒãã¹ã±ãžã¥ãŒã«ããã
ãžã§ãã¯å ±éã®ç¬éã«äœãããïŒãµã€ã³ã¢ããæïŒç¹°ãè¿ãã¹ã±ãžã¥ãŒã«ãäœæïŒãç¹å®ã€ãã³ãæïŒåçºéç¥ããšã³ãã¥ãŒïŒãã¹ã±ãžã¥ãŒã«ãã£ãã¯æïŒæ¬¡åå®è¡åãæ¿å ¥ïŒãã¡ã³ããã³ã¹æ¥ïŒã¯ãªãŒã³ã¢ããããšã³ãã¥ãŒïŒã
ããç«æãã¡ãŒã«ãããã€ãã8:59ã«äžæçãªé害ãèµ·ããããã¯ãŒã«ãŒã¯ãªãã€ã³ããŒéä¿¡ã詊ã¿ã¿ã€ã ã¢ãŠãã«ãªããããã¯ãªãã§ run_at ãåèšå®ããŠåã¹ã±ãžã¥ãŒã«ããïŒäŸ: 2åãæ¬¡ã«10åãæ¬¡ã«30åïŒãååã§ attempts ãã€ã³ã¯ãªã¡ã³ããããåãªãã€ã³ããŒãžã§ãã« account_id + date + job_type ã®ãããªåªçããŒãããã®ã§ããããã€ããéäžã§å埩ããŠãéè€ã¯èµ·ããªãã
ã¯ãªãŒã³ã¢ããã¯å°ããªãããã§æ¯é±å®è¡ããä»ã®åŠçããããã¯ããªããçŸäžè¡ãäžåºŠã«åé€ãã代ããã«1åã®å®è¡ã§Nè¡ãã€åé€ããå®äºãããŸã§èªåèªèº«ãåã¹ã±ãžã¥ãŒã«ããã
顧客ããããµããªãŒãæ¥ãŠããªãããšèšãããããããŒã ã¯ãã®ã¢ã«ãŠã³ããšæ¥ä»ã®ãžã§ãããŒãã«ã確èªããïŒãžã§ãã®ã¹ããŒã¿ã¹ãattemptsãçŸåšã®ããã¯ãã£ãŒã«ãããããã€ããè¿ããæåŸã®ãšã©ãŒããããšãéãããã¯ãã ã£ããç¶æ³ããäœãèµ·ããããã«å€ããã
次ã®äžæïŒå®è£ ããŠèŠ³æž¬ããã¹ã±ãŒã«ãã
ãŸãã¯1ã€ã®ãžã§ãã¿ã€ããéžã³ããšã³ãããŒãšã³ãã§äœã£ãŠããå¢ãããåäžã®ãªãã€ã³ããŒãžã§ãã¯åºçºç¹ãšããŠè¯ããã¹ã±ãžã¥ãŒãªã³ã°ãã¯ã¬ãŒã ãéä¿¡ãçµæèšé²ã®å šãŠã«è§Šããããã ã
ä¿¡é Œã§ããããŒãžã§ã³ããå§ããïŒ
- ãžã§ãããŒãã«ãš1çš®é¡ã®ãžã§ããåŠçããã¯ãŒã«ãŒãäœã
- æéå°æ¥ãžã§ããã¯ã¬ãŒã ããŠå®è¡ããã¹ã±ãžã¥ãŒã©ã«ãŒãã远å ãã
- 远å ã®æšæž¬ãããªããŠæžãã ãã®ãã€ããŒããä¿åãã
- ãã¹ãŠã®è©Šè¡ãšçµæããã°ã«æ®ãããå®è¡ãããããã¯10ç§ã§åããããã«ãã
- 倱æãžã§ããæåã§åå®è¡ã§ããçµè·¯ãçšæãã埩æ§ã«ãããã€ãèŠããªãããã«ãã
åãå§ãããã人ãèŠãŠãããããã«ããããšãåºæ¬çãªç®¡çç»é¢ã§ãããã«æè³å¯Ÿå¹æãåºãïŒã¹ããŒã¿ã¹ã§æ€çŽ¢ãæéã§ãã£ã«ã¿ããã€ããŒãã®ç¢ºèªãè©°ãŸã£ããžã§ãã®ãã£ã³ã»ã«ãç¹å®ãžã§ãIDã®åå®è¡ã
ãã®çš®ã®ã¹ã±ãžã¥ãŒã©ãšã¯ãŒã«ãŒãããŒãèŠèŠçãªããã¯ãšã³ãããžãã¯ã§æ§ç¯ãããå ŽåãAppMaster (appmaster.io) ã¯PostgreSQLã§ãžã§ãããŒãã«ãã¢ããªã³ã°ããclaimâprocessâupdateã«ãŒããBusiness ProcessãšããŠå®è£ ã§ããããããããã€å¯èœãªå®éã®ãœãŒã¹ã³ãŒããçæããŸãã


