
ããã20幎ã§ããœãããŠã§ã¢éçºã¯ãåäžã®ããŒã¿ããŒã¹ãšäžå åãããç¶æ ãåããã¢ãŒããã¯ãã£ã¢ããªã¹ããããã¹ãŠã倿°ã®ã³ã³ããããµãŒããŒãããŒã¿ã»ã³ã¿ãŒãããã«ã¯å€§éžã«åæ£ããããã€ã¯ããµãŒãã¹ã«ç§»è¡ããŸããã忣ã«ããã¹ã±ãŒãªã³ã°ã容æã«ãªããŸããããŸã£ããæ°ãã課é¡ãçºçããŸãããã®å€ãã¯ã以åã¯ã¢ããªã¹ã§è§£æ±ºãããŠããŸããã
ãããã¯ãŒã¯åãããã¢ããªã±ãŒã·ã§ã³ã®æŽå²ãç°¡åã«èŠãŠã仿¥ããã«ãã©ãçããæ¹æ³ãçè§£ããŸããããæ¬¡ã«ãTemporalã§äœ¿çšãããã¹ããŒããã«å®è¡ã¢ãã«ã«ã€ããŠèª¬æããŸãããããŠããããµãŒãã¹æåã¢ãŒããã¯ãã£ïŒSOAïŒã®åé¡ãã©ã®ããã«è§£æ±ºããããTemporalã§é£æåéšéãçµå¶ããŠããã®ã§åèŠããããããããŸãããããã®ã¢ãããŒãã¯æªæ¥ã ãšæããŸãã
çãæŽå²ã®ã¬ãã¹ã³
20幎åãéçºè
ã¯ã»ãšãã©ã®å Žåãã¢ããªã·ãã¯ã¢ããªã±ãŒã·ã§ã³ãäœæããŠããŸãããããã¯ãããŒã«ã«ç°å¢ã§ã®ããã°ã©ãã³ã°æ¹æ³ãšåæ§ã®ãã·ã³ãã«ã§äžè²«æ§ã®ããã¢ãã«ã§ããã¢ããªã¹ã¯ãã®æ§è³ªäžãåäžã®ããŒã¿ããŒã¹ã«äŸåããŠããŸããã€ãŸãããã¹ãŠã®ç¶æ
ãäžå
åãããŠããŸããåäžã®ãã©ã³ã¶ã¯ã·ã§ã³å
ã§ãã¢ããªã¹ã¯ãã®ç¶æ
ã®ããããã倿Žã§ããŸããã€ãŸããã¢ããªã¹ã¯ãæ©èœãããã©ããã«é¢ä¿ãªãããã€ããªã®çµæãè¿ããŸããççŸã®äœå°ã¯ãããŸãããã€ãŸããã¢ããªã¹ã®ãã°ãããç¹ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®å€±æã«ããäžè²«æ§ã®ãªãç¶æ
ãçºçããªãããšã§ãããããŠããã¯ãéçºè
ãã³ãŒããæžãå¿
èŠããªããåžžã«ããŸããŸãªèŠçŽ ã®ç¶æ
ãæšæž¬ããå¿
èŠããªãããšãæå³ããŸãã
é·ãéãã¢ããªã¹ã¯çã«ããªã£ãŠããŸããæ¥ç¶ãããŠãããŠãŒã¶ãŒã¯ãŸã å€ããªãããããœãããŠã§ã¢ã®ã¹ã±ãŒãªã³ã°èŠä»¶ã¯æå°éã§ãããæå€§ã®ãœãããŠã§ã¢ã®å·šäººã§ãããçŸä»£ã®åºæºã§ã¯ããããªã·ã¹ãã ãéçšããŠããŸãããã¢ããŸã³ãã°ãŒã°ã«ã®ãããªäžæ¡ãã®äŒç€Ÿã ããå€§èŠæš¡ãªãœãªã¥ãŒã·ã§ã³ã䜿çšããŸãããããããã¯èŠåã®äŸå€ã§ããã
ãœãããŠã§ã¢ãšããŠã®äººã

éå»20幎éããœãããŠã§ã¢èŠä»¶ã¯çµ¶ããå¢å€§ããŠããŸãã仿¥ãã¢ããªã±ãŒã·ã§ã³ã¯æåããã°ããŒãã«åžå Žã§æ©èœããã¯ãã§ãã TwitterãFacebookãªã©ã®äŒæ¥ã¯ã24æé幎äžç¡äŒã®ãªã³ã©ã€ã³ãåææ¡ä»¶ãšããŠããŸããã¢ããªã¯ãã¯ãäœãæäŸãããããèªäœããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ãªããŸããã仿¥ã®ãã¹ãŠã®äŒæ¥ã¯ãœãããŠã§ã¢è£œåãæã£ãŠããå¿ èŠããããŸãã ãä¿¡é Œæ§ããšãå¯çšæ§ãã¯ãã¯ãããããã£ã§ã¯ãªããèŠä»¶ã§ãã
æ®å¿µãªããããæ¡åŒµæ§ããšãå¯çšæ§ããèŠä»¶ã«è¿œå ããããšãã¢ããªã¹ã¯åŽ©å£ãå§ããŸãããéçºè ãäŒæ¥ãåæ§ã«ãççºçãªäžççæé·ãšå³ãããŠãŒã¶ãŒã®æåŸ ã«å¯Ÿå¿ããæ¹æ³ãèŠã€ããå¿ èŠããããŸãããã¹ã±ãŒãªã³ã°ã«é¢é£ããæ°ããªåé¡ã軜æžãã代æ¿ã¢ãŒããã¯ãã£ãæ¢ãå¿ èŠããããŸããã
ãã€ã¯ããµãŒãã¹ïŒãŸãããµãŒãã¹æåã®ã¢ãŒããã¯ãã£ïŒãçãã§ãããåœåã¯ãã¢ããªã±ãŒã·ã§ã³ãç¬ç«ããŠã¹ã±ãŒãªã³ã°ã§ããæ¯èŒçèªå·±å®çµåã®ã¢ãžã¥ãŒã«ã«åå²ã§ãããããåªãããœãªã¥ãŒã·ã§ã³ã®ããã«èŠããŸããããŸããåãã€ã¯ããµãŒãã¹ã¯ç¬èªã®ç¶æ ãç¶æããŠãããããã¢ããªã±ãŒã·ã§ã³ã¯åäžã®ãã·ã³ã®å®¹éã«å¶éãããªããªããŸãããéçºè ã¯ã€ãã«ãæ¥ç¶æ°ã®å¢å ã«åãããŠæ¡åŒµã§ããããã°ã©ã ãäœæã§ããããã«ãªããŸããããã€ã¯ããµãŒãã¹ã¯ãŸãã責任ã®éææ§ãšã¢ãŒããã¯ãã£ã®åé¢ã«ãããããŒã ãšäŒæ¥ã«äœæ¥ã®æè»æ§ããããããŸããã

ç¡æã®ããŒãºã¯ãããŸãã
ãã€ã¯ããµãŒãã¹ã¯ããœãããŠã§ã¢ã®æé·ã劚ããŠããã¹ã±ãŒã©ããªãã£ãšå¯çšæ§ã®åé¡ã解決ããŸããããç©äºã¯ã¯ã©ãŠãã¬ã¹ã§ã¯ãããŸããã§ãããéçºè ã¯ããã€ã¯ããµãŒãã¹ã«éå€§ãªæ¬ é¥ãããããšã«æ°ã¥ãå§ããŸããã
ã¢ããªã¹ã«ã¯éåžžã1ã€ã®ããŒã¿ããŒã¹ãš1ã€ã®ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒããããŸãããŸããã¢ããªã¹ã¯åå²ã§ããªããããã¹ã±ãŒãªã³ã°ããæ¹æ³ã¯2ã€ãããããŸããã
- åçŽïŒããŒããŠã§ã¢ãã¢ããã°ã¬ãŒãããŠãã¹ã«ãŒããããŸãã¯å®¹éãå¢ãããŸãããã®ã¹ã±ãŒãªã³ã°ã¯å¹æçã§ãããã³ã¹ããããããŸãããŸããã¢ããªã±ãŒã·ã§ã³ãæé·ããç¶ããå¿ èŠãããå Žåã§ããåé¡ãæ°žä¹ ã«è§£æ±ºããããã§ã¯ãããŸããããããŠãååã«æ¡åŒµãããšãæçµçã«ã¢ããã°ã¬ãŒãããã®ã«ååãªæ©åšããªããªããŸãã
- : , . , .
ãã€ã¯ããµãŒãã¹ã¯ç°ãªããŸãããã®äŸ¡å€ã¯ãäºãã«ç¬ç«ããŠã¹ã±ãŒãªã³ã°ããã³ç®¡çãããå€ãã®ãã¿ã€ããã®ããŒã¿ããŒã¹ããã¥ãŒãããã³ãã®ä»ã®ãµãŒãã¹ãæã€æ©èœã«ãããŸãããã ãããã€ã¯ããµãŒãã¹ã«åãæ¿ãããšãã«æåã«æ°ã¥ãå§ããåé¡ã¯ãä»ã§ã¯ããããçš®é¡ã®ãµãŒããŒãšããŒã¿ããŒã¹ãåŠçããå¿ èŠããããšããäºå®ã§ããã
é·ãéããã¹ãŠãå¶ç¶ã«ä»»ãããéçºè ãšãªãã¬ãŒã¿ãŒã¯èªåãã¡ã§ç«ã¡äžãã£ãããã€ã¯ããµãŒãã¹ã«ãã£ãŠåŒãèµ·ããããã€ã³ãã©ã¹ãã©ã¯ãã£ç®¡çã®åé¡ã«åãçµãããšã¯å°é£ã§ãããããããã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãäœäžãããŸãã
ãã ããäŸçµŠã¯éèŠã«å¿ããŠçºçããŸãããã€ã¯ããµãŒãã¹ãæ®åããã°ããã»ã©ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®åé¡ã解決ããææ¬²ã®ããéçºè ãå¢ããŸãããã£ãããšãããã確å®ã«ãããŒã«ãåºçŸãå§ããDockerãKubernetesãAWSLambdaãªã©ã®ãã¯ãããžãŒãã®ã£ãããåããŸããããããã«ããããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã®æäœãéåžžã«ç°¡åã«ãªããŸãããéçºè ã¯ãã³ã³ããããªãœãŒã¹ãšé£æºããããã®ç¬èªã®ã³ãŒããäœæãã代ããã«ãäºåã«æ§ç¯ãããããŒã«ã«äŸåã§ããŸãã2020幎ã«ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®å¯çšæ§ãã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ã«å¹²æžããªããªããšãããã€ã«ã¹ããŒã³ã«ããããå°éããŸãããå®ç§ã«ïŒ

ãã¡ãããç§ãã¡ã¯ãŸã å®å šã«å®å®ãããœãããŠã§ã¢ã®ãŠãŒããã¢ã«äœãã§ããŸãããã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®äžå®å®ãã®åå ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã代ããã«äœ¿çšãããŠããŸãã
ãã€ã¯ããµãŒãã¹ã«é¢ããå¥ã®åé¡
ã¢ããªã¹ã§ã¯ãéçºè ã¯ç¶æ ããã€ããªã®æ¹æ³ã§å€æŽããã³ãŒããèšè¿°ããŸããäœããçºçããããçºçããªããã®ã©ã¡ããã§ãããŸãããã€ã¯ããµãŒãã¹ã§ã¯ãç¶æ ãããŸããŸãªãµãŒããŒã«åæ£ãããŸããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã倿Žããã«ã¯ãè€æ°ã®ããŒã¿ããŒã¹ãåæã«æŽæ°ããå¿ èŠããããŸãã 1ã€ã®ããŒã¿ããŒã¹ãæ£åžžã«æŽæ°ãããä»ã®ããŒã¿ããŒã¹ãã¯ã©ãã·ã¥ããŠãäžè²«æ§ã®ãªãäžéç¶æ ãæ®ãå¯èœæ§ããããŸããããããæ°Žå¹³ã¹ã±ãŒãªã³ã°ã®åé¡ã«å¯Ÿããå¯äžã®è§£æ±ºçã¯ãµãŒãã¹ã§ãã£ããããéçºè ã«ã¯ä»ã®éžæè¢ããããŸããã§ããã

ãµãŒãã¹å šäœã«åæ£ãããç¶æ ã®åºæ¬çãªåé¡ã¯ãå€éšãµãŒãã¹ãžã®ååŒã³åºããå¯çšæ§ã«é¢ããŠã©ã³ãã ãªçµæãããããããšã§ãããã¡ãããéçºè ã¯ã³ãŒãã®åé¡ãç¡èŠããŠãå€éšäŸåé¢ä¿ãžã®ãã¹ãŠã®åŒã³åºããåžžã«æåããŠãããšèŠãªãããšãã§ããŸãããã ããäžéšã®äŸåé¢ä¿ã«ãããèŠåãªãã«ã¢ããªã±ãŒã·ã§ã³ã忢ããå¯èœæ§ããããŸãããããã£ãŠãéçºè ã¯ãã¢ããªã¹ã®æä»£ããã®ã³ãŒããé©å¿ãããŠããã©ã³ã¶ã¯ã·ã§ã³ã®éäžã§ã®æäœã®å€±æã«å¯Ÿãããã§ãã¯ã远å ããå¿ èŠããããŸããã以äžã¯ãã¬ãŒã¹ç¶æ ãåé¿ããããã«ãå°çšã®myDBã¹ãã¢ããæåŸã«èšé²ãããç¶æ ãç¶ç¶çã«ååŸããããšã瀺ããŠããŸããæ®å¿µãªããããã®å®è£ ã§ãã圹ã«ç«ã¡ãŸããã myDBãæŽæ°ããã«ã¢ã«ãŠã³ãã®ç¶æ ãå€åãããšãäžæŽåãçºçããå¯èœæ§ããããŸãã
public void transferWithoutTemporal(
String fromId,
String toId,
String referenceId,
double amount,
) {
boolean withdrawDonePreviously = myDB.getWithdrawState(referenceId);
if (!withdrawDonePreviously) {
account.withdraw(fromAccountId, referenceId, amount);
myDB.setWithdrawn(referenceId);
}
boolean depositDonePreviously = myDB.getDepositState(referenceId);
if (!depositDonePreviously) {
account.deposit(toAccountId, referenceId, amount);
myDB.setDeposited(referenceId);
}
}
æ®å¿µãªããããšã©ãŒãªãã§ã³ãŒããæžãããšã¯äžå¯èœã§ãããŸããã³ãŒããè€éã«ãªãã»ã©ããã°ãçºçããå¯èœæ§ãé«ããªããŸãããæ³åã®ãšããããããã«ãŠã§ã¢ãã§åäœããã³ãŒãã¯è€éã§ããã ãã§ãªããè€éã§ããããŸããå°ãªããšãããçšåºŠã®ä¿¡é Œæ§ã¯ä¿¡é Œæ§ããªããããåªããŠãããããéçºè ã¯ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç¶æããããã«ãæåã¯ãã°ã®ããã³ãŒããäœæããå¿ èŠããããŸãããããã¯ç§ãã¡ã«æéãšåŽåãèŠããéçšäž»ã¯å€é¡ã®ãéãèŠããŸãããã€ã¯ããµãŒãã¹ã¯çŸããæ¡åŒµã§ããŸãããéçºè ã®æ¥œãããšçç£æ§ãããã³ã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãç ç²ã«ãªããŸãã
äœçŸäžãã®éçºè ããæãåçºæããããã€ãŒã«ã®1ã€ã§ãããã€ã©ãŒãã¬ãŒãã®ä¿¡é Œæ§ãåçºæããããã«æ¯æ¥æéãè²»ãããŠããŸãããã€ã¯ããµãŒãã¹ãæäœããããã®ææ°ã®ã¢ãããŒãã¯ãææ°ã®ã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãšã¹ã±ãŒã©ããªãã£ã®èŠä»¶ãåã«åæ ããŠããŸããã

äžæç
ä»ãç§ãã¡ã¯ç§ãã¡ã®è§£æ±ºçã«ãã©ãçããŸããã Stack Overflowã«ãã£ãŠæ¿èªãããŠããããå®ç§ã§ãããšã¯äž»åŒµããŠããŸãããç§ãã¡ã¯èªåãã¡ã®èããå ±æããããªãã®æèŠãèãããã ãã§ããã¹ã¿ãã¯ãããã³ãŒãã®æ¹åã«é¢ãããã£ãŒãããã¯ãåŸãã®ã«è¯ãå Žæã¯ãããŸããïŒ
仿¥ãŸã§ãäžèšã®åé¡ã解決ããã«ãã€ã¯ããµãŒãã¹ã䜿çšã§ãããœãªã¥ãŒã·ã§ã³ã¯ãããŸããã§ãããã¯ã©ãã·ã¥ç¶æ ããã¹ãããã³ãšãã¥ã¬ãŒãããã¯ã©ãã·ã¥ãèæ ®ããŠã³ãŒããèšè¿°ã§ããŸããããããã®åé¡ã¯äŸç¶ãšããŠçºçããŸãã Temporalããããã解決ãããšä¿¡ããŠããŸããããã¯ããã€ã¯ããµãŒãã¹ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã®ããã®ãªãŒãã³ãœãŒã¹ïŒMITã®ãã³ã»ã³ã¹ïŒã¹ããŒããã«ç°å¢ã§ãã
Temporalã«ã¯ãéžæããããŒã¿ããŒã¹ã§å®è¡ãããã¹ããŒããã«ããã¯ãšã³ããšããµããŒããããŠããèšèªã®1ã€ã§ããã¯ã©ã€ã¢ã³ããã¬ãŒã ã¯ãŒã¯ã®2ã€ã®äž»èŠã³ã³ããŒãã³ãããããŸããã¢ããªã±ãŒã·ã§ã³ã¯ãã¯ã©ã€ã¢ã³ããã¬ãŒã ã¯ãŒã¯ãšãå®è¡æã«ããã¯ãšã³ãã®ç¶æ 倿Žãèªåçã«ä¿åããéåžžã®ã¬ã¬ã·ãŒã³ãŒãã䜿çšããŠæ§ç¯ãããŸããä»ã®ã¢ããªã±ãŒã·ã§ã³ããã«ããããšããšåãäŸåé¢ä¿ãã©ã€ãã©ãªãããã³ãã«ããã§ãŒã³ã䜿çšã§ããŸããæ£çŽãªãšãããããã¯ãšã³ãã¯é«åºŠã«åæ£ãããŠãããããJ2EE2.0ãšã¯ç°ãªããŸããå®éãã»ãŒç¡éã®æ°Žå¹³ã¹ã±ãŒãªã³ã°ãå¯èœã«ããã®ã¯ããã¯ãšã³ãã®ååžã§ãã Temporalã¯ãDockerã€ã³ãã©ã¹ãã©ã¯ãã£ãKubernetesããµãŒããŒã¬ã¹ã¢ãŒããã¯ãã£ãšåæ§ã«ãã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒã«äžè²«æ§ãã·ã³ãã«ããä¿¡é Œæ§ããããããŸãã
Temporalã¯ããã€ã¯ããµãŒãã¹ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã®ããã®ä¿¡é Œæ§ã®é«ãã¡ã«ããºã ã倿°æäŸããŸããããããæãéèŠãªããšã¯ãç¶æ ãç¶æããããšã§ãããã®é¢æ°ã¯ãã€ãã³ãã®çºè¡ã䜿çšããŠãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿããã¹ããŒããã«ãªå€æŽãèªåçã«ä¿åããŸããã€ãŸããTemporalãå®è¡ãããŠããã³ã³ãã¥ãŒã¿ãŒãã¯ã©ãã·ã¥ããå Žåãã³ãŒãã¯äœãèµ·ãããªãã£ããã®ããã«èªåçã«å¥ã®ã³ã³ãã¥ãŒã¿ãŒã«ãžã£ã³ãããŸããããã¯ãããŒã«ã«å€æ°ãå®è¡ã¹ã¬ãããããã³ãã®ä»ã®ã¢ããªã±ãŒã·ã§ã³åºæã®ç¶æ ã«ãåœãŠã¯ãŸããŸãã
äŸããããŠãã ãããéçºè ãšããŠãããªãã¯ãããã仿¥ãã³ãŒããžã®å€æŽã远跡ããããã«SVNããŒãžã§ã³ç®¡çïŒã€ãŸãOG GitïŒã«äŸåããŠããŸãã SVNã¯ãéè€ãé¿ããããã«ãæ°ãããã¡ã€ã«ãä¿åããŠããæ¢åã®ãã¡ã€ã«ã«ãªã³ã¯ããã ãã§ãã Temporalã¯ãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®ã¹ããŒããã«ãªå±¥æŽã®SVNïŒå€§ãŸããªé¡æšïŒã®ãããªãã®ã§ããã³ãŒããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã倿ŽãããšãTemporalã¯ãã®å€æŽïŒçµæã§ã¯ãªãïŒããšã©ãŒãªãã§èªåçã«ä¿åããŸããã€ãŸããTemporalã¯ã¯ã©ãã·ã¥ããã¢ããªã±ãŒã·ã§ã³ã埩å ããã ãã§ãªããããŒã«ããã¯ããã©ãŒã¯ããã®ä»å€ãã®ããšãè¡ããŸãããã®ãããéçºè ã¯ããµãŒããŒãã¯ã©ãã·ã¥ããå¯èœæ§ãããããšãæåŸ ããŠã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå¿ èŠããªããªããŸããã
ããã¯ãæåãå ¥åãããã³ã«æåã§ããã¥ã¡ã³ããä¿åããïŒCtrl + SïŒããGoogleDocsã®èªåã¯ã©ãŠãä¿åã«åãæ¿ãããããªãã®ã§ããæåã§äœãä¿åããªããªã£ããšããæå³ã§ã¯ãªãããã®ããã¥ã¡ã³ãã«é¢é£ä»ããããŠãããã·ã³ã1ã€ããªããªã£ãã ãã§ããã¹ããŒããã«æ§ãšã¯ãéçºè ããã€ã¯ããµãŒãã¹ã®ããã«äœæããå¿ èŠããã£ãéå±ãªå®åã³ãŒããã¯ããã«å°ãªãäœæã§ããããšãæå³ããŸããããã«ãç¹å¥ãªã€ã³ãã©ã¹ãã©ã¯ãã£ïŒåå¥ã®ãã¥ãŒããã£ãã·ã¥ãããŒã¿ããŒã¹ïŒã¯äžèŠã«ãªããŸãããããã«ãããæäœãæ°æ©èœã®è¿œå ãç°¡åã«ãªããŸãããŸããçŽããããç¹å®ã®ç¶æ 管çã³ãŒããçè§£ããå¿ èŠããªããããåå¿è ãææ°ã®ç¶æ ã«ããã®ãã¯ããã«ç°¡åã«ãªããŸãã
ç¶æ ã®ä¿æã¯ããæ°žç¶ã¿ã€ããŒãã®åœ¢åŒã§å®è£ ãããŸããããã¯ãã³ãã³ãã§äœ¿çšã§ãããã§ã€ã«ã»ãŒãã¡ã«ããºã ã§ã
Workflow.sleepããšãŸã£ããåãããã«æ©èœã sleepãŸãããã ããWorkflow.sleepãã€ã§ãå®å
šã«å®æ¥œæ»ãããããšãã§ããŸããå€ãã®äžæçãªãŠãŒã¶ãŒã¯ãæ°é±éãããã«ã¯æ°å¹Žãç ã£ãŠããŸããããã¯ãå®è¡æéã®é·ãã¿ã€ããŒãTemporalã¹ãã¢ã«ä¿åãããŠã§ã€ã¯ã¢ããããã³ãŒãã远跡ããããšã§å®çŸãããŸããç¹°ãè¿ãã«ãªããŸããããµãŒããŒãã¯ã©ãã·ã¥ããå ŽåïŒãŸãã¯ãµãŒããŒããªãã«ããå ŽåïŒã§ããã¿ã€ããŒã®æéãåãããšãã³ãŒãã¯äœ¿çšå¯èœãªãã·ã³ã«ç§»åããŸããã¹ãªãŒãããã»ã¹ã¯ãªãœãŒã¹ãæ¶è²»ããŸãããããããããªãªãŒããŒãããã§æ°çŸäžãè¶
ããå¯èœæ§ããããŸããæœè±¡çãããããã«èããããããããŸããããã®ãããåäœããæéã³ãŒãã®äŸã次ã«ç€ºããŸãã
public class SubscriptionWorkflowImpl implements SubscriptionWorkflow {
private final SubscriptionActivities activities =
Workflow.newActivityStub(SubscriptionActivities.class);
public void execute(String customerId) {
activities.onboardToFreeTrial(customerId);
try {
Workflow.sleep(Duration.ofDays(180));
activities.upgradeFromTrialToPaid(customerId);
while (true) {
Workflow.sleep(Duration.ofDays(30));
activities.chargeMonthlyFee(customerId);
}
} catch (CancellationException e) {
activities.processSubscriptionCancellation(customerId);
}
}
}
ç¶æ ãæ°žç¶åããããšã«å ããŠãTemporalã¯å ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®äžé£ã®ã¡ã«ããºã ãæäŸããŸããã¢ã¯ãã£ããã£é¢æ°ã¯ã¯ãŒã¯ãããŒããåŒã³åºãããŸãããã¢ã¯ãã£ããã£å ã§å®è¡ãããŠããã³ãŒãã¯ã¹ããŒããã«ã§ã¯ãããŸããããããã¯æç¶ããŸããããã¢ã¯ãã£ããã£ã«ã¯èªåå詊è¡ãã¿ã€ã ã¢ãŠããããã³ããŒãããŒããå«ãŸããŸããã¢ã¯ãã£ããã£ã¯ã倱æããå¯èœæ§ã®ããã³ãŒããã«ãã»ã«åããã®ã«éåžžã«åœ¹ç«ã¡ãŸããã¢ããªããå€ãã®å Žåå©çšã§ããªããã³ãã³ã°APIã䜿çšããŠãããšããŸããããã¬ã¬ã·ãŒãœãããŠã§ã¢ã®å Žåããã®APIãåŒã³åºããã¹ãŠã®ã³ãŒããtry / catchã¹ããŒãã¡ã³ããå詊è¡ããžãã¯ãããã³ã¿ã€ã ã¢ãŠãã§ã©ããããå¿ èŠããããŸãããã ããã¢ã¯ãã£ããã£ãããã³ãã³ã°APIãåŒã³åºããšããããã®ãã¹ãŠã®æ©èœãããã«æäŸãããŸããåŒã³åºãã倱æããå Žåãã¢ã¯ãã£ããã£ã¯èªåçã«å詊è¡ãããŸããããã¯ãã¹ãŠçŽ æŽãããã§ããã ããä¿¡é Œæ§ã®äœããµãŒãã¹ãææããŠããŠããããDDoSããä¿è·ãããå ŽåããããŸãããããã£ãŠãã¢ã¯ãã£ããã£ã³ãŒã«ã¯ãé·ãã¿ã€ããŒã«ãã£ãŠããã¯ã¢ãããããã¿ã€ã ã¢ãŠãããµããŒãããŸããã€ãŸããã¢ã¯ãã£ããã£ã®ç¹°ãè¿ãéã®äžæåæ¢ã¯ãæ°æéãæ°æ¥ããŸãã¯æ°é±éã«éããå¯èœæ§ããããŸããããã¯ãæ£åžžã«å®è¡ããå¿ èŠãããã³ãŒãã«ç¹ã«åœ¹ç«ã¡ãŸãããå®è¡ããå¿ èŠãããé床ãããããŸããã
ãã®ãããªã§ã¯ãTemporalã®ããã°ã©ãã³ã°ã¢ãã«ã2åã§èª¬æããŠããŸãã
Temporalã®ãã1ã€ã®åŒ·ã¿ã¯ãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®å¯èŠ³æž¬æ§ã§ãããªãã¶ããŒã·ã§ã³APIã¯ãä»»æã®ã¯ãŒã¯ãããŒïŒå®è¡å¯èœãã©ããïŒããã¡ã¿ããŒã¿ãã¯ãšãªããããã®SQLã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸããããã»ã¹å ã§ç¬èªã®ã¡ã¿ããŒã¿å€ãå®çŸ©ããã³æŽæ°ããããšãã§ããŸãããªãã¶ããŒã·ã§ã³APIã¯ãç¹ã«éçºäžã®ãããã°æã«ãäžæçãªãªãã¬ãŒã¿ãŒãšéçºè ã«ãšã£ãŠéåžžã«äŸ¿å©ã§ããç£èŠã¯ãã¯ãšãªçµæã«å¯Ÿãããããã¢ã¯ã·ã§ã³ããµããŒãããŸããããšãã°ããªã¯ãšã¹ããäœææå»>æšæ¥ã§ãããã¹ãŠã®ã¯ãŒã«ãŒããã»ã¹ã«killã·ã°ãã«ãéä¿¡ã§ããŸãã Temporalã¯ãå®è¡äžã®ã€ã³ã¹ã¿ã³ã¹ããããŒã«ã«å€æ°ã®å€ããã«ã§ããåæãã§ããæ©èœããµããŒãããŠããŸããããã¯ãIDEã®ãããã¬ãŒãå®çšŒåã¢ããªã±ãŒã·ã§ã³ã§åäœããŠãããããªãã®ã§ããããšãã°ãããã¯å€ãååŸããæ¹æ³ã§ã
greeting å®è¡äžã®ã€ã³ã¹ã¿ã³ã¹ã®å ŽåïŒ
public static class GreetingWorkflowImpl implements GreetingWorkflow {
private String greeting;
@Override
public void createGreeting(String name) {
greeting = "Hello " + name + "!";
Workflow.sleep(Duration.ofSeconds(2));
greeting = "Bye " + name + "!";
}
@Override
public String queryGreeting() {
return greeting;
}
}
çµè«
ãã€ã¯ããµãŒãã¹ã¯åªããŠãããéçºè ãäŒæ¥ãæ¯æãçç£æ§ãšä¿¡é Œæ§ãç ç²ã«ããŠæäŸãããŸããTemporalã¯ãéçºè ã«ãã€ã¯ããµãŒãã¹ãæäŸããç°å¢ãæäŸããããšã«ããããã®åé¡ã解決ããããã«èšèšãããŠããŸããããã«äœ¿çšã§ããã¹ããŒããã«ãã¹ãèªåé害ããŠã©ããããã°ã¯ããã€ã¯ããµãŒãã¹éçºãã¹ããŒãã«ããTemporalãæäŸããæ©èœã®ã»ãã®äžéšã§ãã