ã¤ã³ãã°ã¬ã¼ã·ã§ã³ã®ããã®ããã«ã¦ã§ã¢è£½åã®ãã¯ãã«ã«ãµãã¼ããæ å½ãã¦ããå±±ä¸ã§ãã
ä»å㯠ã¬ãããããã®ã·ãã¢ã¢ã¼ããã¯ãã§ãã Eric Murphy ããã«ããããã¤ã¯ããµã¼ãã¹ã®ããã®åæ£ãã¼ã¿ ã ã¤ãã³ãã½ã¼ã·ã³ã° vs ãã§ã³ã¸ãã¼ã¿ãã£ããã£(CDC)ãã®ç¿»è¨³è¨äºã§ãããã®è¨äºã§ã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ãCDCãCDC + Outboxãã¿ã¼ã³ãCQRSãããããç°¡åã«èª¬æããªããããããã®ç¹æ§ã®éããæ¯è¼ãã¾ããã¾ããã¤ãã³ãã½ã¼ã·ã³ã°ã¨CQRSã®ç°¡æãªèª¬æããªããã¦ããä»ããã¾ãæ確ã«èªããããã¨ãå°ãªããã®ã®ã½ããã¦ã§ã¢ã®è¨è¨ã«å¤§ããªå½±é¿ãããã¼ããã¡ã¤ã³ã¤ãã³ãã¨ãã§ã³ã¸ã¤ãã³ãã®éãã«ã触ãããã¦ãã¾ãã
[åæ] Distributed Data for Microservices â Event Sourcing vs. Change Data Capture by Eric Murphy
ããã¾ã翻訳ããã¾ããªãã®ã¯è¨±ãã¦ãã ãã (^^;
ãã®è¨äºã§ã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ãã³ãã³ãã¯ã¨ãªã®è²¬ä»»åé¢ï¼CQRSï¼ããã§ã³ã¸ãã¼ã¿ãã£ããã£ï¼CDCï¼ãããã³Outboxãã¿ã¼ã³ã®é åãã¿ã¦ããã¾ãã ãããã®ã½ãªã¥ã¼ã·ã§ã³ã®ä¾¡å¤ãæããã«ãªãã§ãããã ããã¦ç°ãªããããã®è¨è¨ã«ã¤ãã¦ãããããã®é·æ/çæãç¨ãã¦èª¬æãã¾ãã
ããããããªããããã®ã½ãªã¥ã¼ã·ã§ã³ãéè¦ãªã®ã§ããããï¼ ããã¯å¤ãã®ãã¼ã ããã¤ã¯ããµã¼ãã¹ãæ§ç¯ãããã¼ã¿ãè¤æ°ã®ãã¼ã¿ã¹ãã¢ã«åæ£ãã¦ããããã§ãã ãã¤ã¯ããµã¼ãã¹ã®ã·ã¹ãã ã§ã¯ããªã¬ã¼ã·ã§ãã«ãã¼ã¿ãã¼ã¹ããªãã¸ã§ã¯ãã¹ãã¢ãã¡ã¢ãªå ãã£ãã·ã¥ãããã«ã¯æ¤ç´¢ã¤ã³ããã¯ã¹ãå«ã¾ãã¦ããå ´åãããã¾ãã ãã¼ã¿ã¯ãããã¾å¤±ãããããåæãã¨ããªããªã£ãããç ´æãããããããã·ã§ã³ã¯ãªãã£ã«ã«ãªã·ã¹ãã ã«ã¯æ²æ¨ãªçµæããããããã¨ãããã¾ãã
ãããã®æ·±å»ãªåé¡ãåé¿ããã½ãªã¥ã¼ã·ã§ã³ã¯ãå¤ãã®çµç¹ã«ã¨ã£ã¦ã¨ã¦ãéè¦ã§ããããã æ®å¿µãªãããããããä¸å¯æ¬ ã®ã½ãªã¥ã¼ã·ã§ã³ãç解ããã®ã¯å°é£ã§ãããã¾ããããã¯ã¤ãã³ãã½ã¼ã·ã³ã°ãCQRSãCDCãããã³Outboxã§ãä¾å¤ã§ã¯ããã¾ããããããã®ã½ãªã¥ã¼ã·ã§ã³ãç¹å®ã®ã¦ã¼ã¹ã±ã¼ã¹ã«ã©ã®ããã«é©ç¨ã§ããããå¦ã³ããã¦ç解ããæ©ä¼ã¨ãã¦æãã¦ãã ããã
ãã®è¨äºã®æå¾ã§ãããããã«ãããã4ã¤ã®ã½ãªã¥ã¼ã·ã§ã³ã®ãã¡ã3ã¤ã¯é«ã価å¤ãããã¾ãããæ®ãã®ï¼ã¤ã¯ç¨ãªç¶æ³ãé¤ãã¦ã¯æ¨å¥¨ããã¾ããããã®è¨äºã§ã®ã¢ããã¤ã¹ã¯ãããªãã®ç¹æã®ã¦ã¼ã¹ã±ã¼ã¹ã«å¯¾ãã¦è©ä¾¡ãããã¹ãã§ããããã4ã¤ã®ã½ãªã¥ã¼ã·ã§ã³ã®ã©ãããé©åã§ã¯ãªããã¨ãããã§ãããã
ãªã¢ã¯ãã£ãã·ã¹ãã
軽ãæ¯ãè¿ããªããã¤ãã³ãã½ã¼ã·ã³ã°ã¨ãã§ã³ã¸ãã¼ã¿ãã£ããã£(CDC)ã¯ããªã¢ã¯ãã£ããªåæ£ã·ã¹ãã ï¼ã¤ã¾ããã¤ã¯ããµã¼ãã¹ï¼ã®æ§ç¯ã«ä½¿ç¨ã§ããã½ãªã¥ã¼ã·ã§ã³ã§ãã ãã¤ã¯ããµã¼ãã¹ã¯ãã¬ã¸ãªã¨ã³ã(å復å)ã¨ã¨ã©ã¹ãã£ãã¯(å¼¾åæ§)ãåãã¦ãããã¨ã«ããã絶ããå¤åããç°å¢ï¼ã¤ã¾ãã¯ã©ã¦ãï¼ã«å¯¾å¿ããå¿ è¦ãããã¾ãã ãããã®è½åã®èå¾ã«ãããã¸ãã¯ã¯ãã¡ãã»ã¼ã¸ã¨ã¤ãã³ãé§åã§ãã 詳細㯠Reactive Manifesto ãèªããã¨ããå§ããã¾ãã
ã¤ãã³ãã½ã¼ã·ã³ã°ã¨ãã§ã³ã¸ãã¼ã¿ãã£ããã£(CDC)ã®å ±æã®ã´ã¼ã«
ãã®è¨äºã§ç´¹ä»ãã2ã¤ã®ã³ã¢ã½ãªã¥ã¼ã·ã§ã³ã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ã¨ãã§ã³ã¸ãã¼ã¿ãã£ããã£ã§ãã ãããã®ã½ãªã¥ã¼ã·ã§ã³ãç´¹ä»ããåã«ããããã次ã®å ±éã®ç®æ¨ãéæãã¦ãããã¨ããããã§ãããï¼
- 1ã¤ã®ãã¼ã¿ã¹ãã¢ããç¹å®ã®ãã¼ã¿ã»ããã®ããã®ã°ãã¼ãã«ãªçå®ã®æ å ±æº(source of truth)ã¨ãã¦æå®ãã
- éå»ãç¾å¨ã®ã¢ããªã±ã¼ã·ã§ã³ã®ç¶æ ããã¸ã£ã¼ãã«ã¾ãã¯ãã©ã³ã¶ã¯ã·ã§ã³ãã°ã¨ãå¼ã°ããä¸é£ã®ã¤ãã³ãã¨ãã¦è¡¨ç¾ãã
- å¿ è¦ã«å¿ãã¦ç¶æ ãåæ§ç¯ã¾ãã¯ææ°åããããã®ãã¤ãã³ããåçãããã¨ãã§ããã¸ã£ã¼ãã«ãæä¾ãã
ã¤ãã³ãã½ã¼ã·ã³ã°ã¯ç¬èªã®ã¸ã£ã¼ãã«ãæ å ±æº(source of truth)ã¨ãã¦ä½¿ç¨ããä¸æ¹ã§ãã§ã³ã¸ãã¼ã¿ãã£ããã£ã¯åºç¤ã¨ãªããã¼ã¿ãã¼ã¹ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãæ å ±æº(source of truth)ã¨ãã¦ä½¿ç¨ãã¾ãããã®éãã¯ããã®è¨äºã®å¾åã§èª¬æããã½ããã¦ã§ã¢ã®è¨è¨ã¨å®è£ ã«å¤§ããªå½±é¿ãåã¼ãã¾ãã
ãã¡ã¤ã³ã¤ãã³ã vs ãã§ã³ã¸ã¤ãã³ã
æ·±ãæãä¸ããåã«ãã¤ãã³ãã½ã¼ã·ã³ã°ã¨ãã§ã³ã¸ãã¼ã¿ãã£ããã£ã«é¢ãã¦ãããããã®é¢å¿äºã¨ãªãã¤ãã³ãã®ã¿ã¤ããåºå¥ãããã¨ã¯éè¦ã§ãã
- ãã¡ã¤ã³ã¤ãã³ã â ã¢ããªã±ã¼ã·ã§ã³ã«ãã£ã¦çæãããããã¸ãã¹ãã¡ã¤ã³ã®ä¸é¨ã§ããæ示çãªã¤ãã³ãã ãããã®ã¤ãã³ãã¯é常ãOrderPlacedãItemShippedãªã©ãéå»å½¢ã§è¡¨ãããããã¡ã¤ã³ã¤ãã³ãã¯ã¤ãã³ãã½ã¼ã·ã³ã°ã®ä¸»è¦ãªé¢å¿äºã
- ãã§ã³ã¸ã¤ãã³ã â ãã¼ã¿ãã¼ã¹ãã©ã³ã¶ã¯ã·ã§ã³ãã°ããçæãããã¤ãã³ããçºçããç¶æ é·ç§»ã示ãã ãã§ã³ã¸ã¤ãã³ãã¯ãã§ã³ã¸ãã¼ã¿ãã£ããã£ã«ã¨ã£ã¦ã®é¢å¿äºã
ãã¡ã¤ã³ã¤ãã³ãã¨ãã§ã³ã¸ã¤ãã³ãã¯ããã§ã³ã¸ã¤ãã³ãã«ãã¡ã¤ã³ã¤ãã³ããå«ã¾ãã¦ããå ´åãé¤ããªãé¢ä¿ããã¾ããããã§ã³ã¸ã¤ãã³ãã«ãã¡ã¤ã³ã¤ãã³ããå«ã¾ãã¦ããã¨ããã®ã¯ããã®è¨äºã®å¾åã§ç´¹ä»ããOutboxãã¿ã¼ã³ã®é åã§ãã
ããã§ã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ã¨ãã§ã³ã¸ãã¼ã¿ãã£ããã£ã«é¢ããããã¤ãã®å ±éç¹ã確ç«ããã®ã§ãæ·±ãæãä¸ãã¾ãããã
ã¤ãã³ãã½ã¼ã·ã³ã°
ã¤ãã³ãã½ã¼ã·ã³ã°ã¯ãã½ããã¦ã§ã¢ããã¡ã¤ã³ã¤ãã³ãã®ã¸ã£ã¼ãã«ã¨ãã¦ã®ç¶æ ãç¶æã§ããããã«ããã½ãªã¥ã¼ã·ã§ã³ã§ãã ãããã¦ã¸ã£ã¼ãã«å ¨ä½ã§ã¢ããªã±ã¼ã·ã§ã³ã®ç¾å¨ã®ç¶æ ã表ç¾ãã¾ãã ã¾ãããã®ã¸ã£ã¼ãã«ã使ç¨ããã¨ãå±¥æ´ãç°¡åã«ç£æ»ãããã以åã®ç¶æ ãåç¾ãã¦ã¿ã¤ã ãã©ãã«ãããã¨ã©ã¼ãåç¾ããããããã¨ãã§ãã¾ãã
ä¸è¬çã«ã¤ãã³ãã½ã¼ã·ã³ã°ã®å®è£ ã«ã¯æ¬¡ã®ãããªç¹å¾´ãããã¾ãï¼
- ã¢ããªã±ã¼ã·ã§ã³ã®ãã¸ãã¹ãã¸ãã¯ããçæããããã¡ã¤ã³ã¤ãã³ãããã¢ããªã±ã¼ã·ã§ã³ã«å¯¾ããæ°ããç¶æ ã追å ãã
- ã¢ããªã±ã¼ã·ã§ã³ã®ç¶æ ã¯ã追è¨ã®ã¿ã®ã¤ãã¥ã¼ã¿ãã«ãªã¤ãã³ããã°ï¼ã¸ã£ã¼ãã«ï¼ãä»ãã¦æ´æ°ããã
- ã¸ã£ã¼ãã«ã¯ãã¢ããªã±ã¼ã·ã§ã³ã®åç¶æéä¸ãçå®ã®æ å ±æº(source of truth)ã¨è¦ãªããã
- ã¸ã£ã¼ãã«ã¯ãã©ã®ãããªæç¹ã®ã¢ããªã±ã¼ã·ã§ã³ã®ç¶æ ã§ãåæ§ç¯ã§ãããããªãã¬ã¤å¯è½ã§ãã
- ã¸ã£ã¼ãã«ã¯ããªãã¸ã§ã¯ãï¼DDDç¨èªã§ããã¨ããã®éç´ï¼ã®ç¾å¨ã®ç¶æ ãè£è¶³ããããã«ããã¡ã¤ã³ã¤ãã³ããIDã§ã°ã«ã¼ãåãã
ã¾ãå ãã¦ãã¤ãã³ãã½ã¼ã·ã³ã°ã®å®è£ ã«ã¯æ¬¡ã®ç¹å¾´ããããã¨ãããã¾ãï¼
- ã¢ããªã±ã¼ã·ã§ã³ã®ç¶æ ã®åä½æãé«éåããããã®ã¸ã£ã¼ãã«ã®ã¹ãããã·ã§ããã¡ã«ããºã
- å¿ è¦ã«å¿ãã¦ã¸ã£ã¼ãã«ããã¤ãã³ããåé¤ããã¡ã«ããºã ï¼é常ã¯ã³ã³ãã©ã¤ã¢ã³ã¹ä¸ã®çç±ããï¼
- ã¢ããªã±ã¼ã·ã§ã³ã®ç¶æ ãé å¸ããããã«ä½¿ç¨ã§ããã¤ãã³ããã£ã¹ãããã®ããã®API
- ä¸è¬çãªã·ã¹ãã ã§ã¯åå¨ãããããªå¼·ãä¸è²«æ§ã®ãããã©ã³ã¶ã¯ã·ã§ã³ä¿è¨¼ã¯æä¾ãããªã
- ã¸ã£ã¼ãã«å ã®ã¤ãã³ãå½¢å¼ã®å¤æ´ã«å¯¾å¦ããããã®ä¸ä½äºææ§ã¡ã«ããºã
- ã¢ããªã±ã¼ã·ã§ã³ã®çå®ã®æ å ±æº(source of truth)ã§ããã¸ã£ã¼ãã«ãããã¯ã¢ããããã³å¾©å ããã¡ã«ããºã
ã¤ãã³ãã½ã¼ã¹ã¯ãã¼ã¿ãã¼ã¹ã®åä½ã模å£ãã¾ããããããããã¯ã¢ããªã±ã¼ã·ã§ã³ã¬ãã«ã«ã¦è¡ããã¾ãã å³2ãã¿ãã°ããã¼ã¿ãã¼ã¹ã¨ã»ã¨ãã©åæ§ã®ä»çµã¿(å³ï¼)ã§æ´æ°ããã¦ãããã¨ããããã§ãããã
ãã®å³2ã¨å³3ã®æ¯è¼ã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ã¨ãã§ã³ã¸ãã¼ã¿ãã£ããã£ãæ¯è¼ããã«ã¤ãã¦ããéè¦ã«ãªãã¾ãã
ãã§ã³ã¸ãã¼ã¿ãã£ããã£
ãã§ã³ã¸ãã¼ã¿ãã£ããã£ï¼CDCï¼ã¯ããã¼ã¿ãã¼ã¹ãã©ã³ã¶ã¯ã·ã§ã³ãã°ï¼ã¾ãã¯åçã®ã¡ã«ããºã ï¼ãããã§ã³ã¸ã¤ãã³ãããã£ããã£ãããããã®ã¤ãã³ããä¸æµã³ã³ã·ã¥ã¼ãã«è»¢éããã½ãªã¥ã¼ã·ã§ã³ã§ãã CDCã¯ãæçµçã«ã¢ããªã±ã¼ã·ã§ã³ã®ç¶æ ãå¤é¨åãããã¼ã¿ã®å¤é¨ã¹ãã¢ã¨åæãããã¨ãå¯è½ã«ãã¾ãã
é常ããã§ã³ã¸ãã¼ã¿ãã£ããã£ã®å®è£ ã«ã¯æ¬¡ã®ç¹å¾´ãããã¾ãï¼
- ãã©ã³ã¶ã¯ã·ã§ã³ãããã§ã³ã¸ã¤ãã³ãããããªã¢ã©ã¤ãºåããç®çã®ããã«ããã¼ã¿ãã¼ã¹ã®ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãèªã¿åãå¤é¨ããã»ã¹ã§ãã
- ãã§ã³ã¸ã¤ãã³ãã¯ãã¡ãã»ã¼ã¸ã¨ãã¦ä¸æµã³ã³ã·ã¥ã¼ãã¼ã«è»¢éããã
ã覧ã®ã¨ãããCDCã¯é常ã«çãç¯å²ã§ã®æ¯è¼çåç´ãªæ¦å¿µã§ããããã¯åã«ãã¼ã¿ãã¼ã¹ã®ãã©ã³ã¶ã¯ã·ã§ã³ãã°ããé¢å¿ã®ããã³ã³ã·ã¥ã¼ãã«å¯¾ãã¦ã¤ãã³ãã¹ããªã¼ã ã¨ãã¦ãå¤é¨åããã ãã§ãã
CDCã¯ãã¤ãã³ãã®æ¶è²»æ¹æ³ã«æè»æ§ä¸ãã¾ãã å³4ã®ããã«ï¼
- ãªãã·ã§ã³ 1 ã¯ããã©ã³ã¶ã¯ã·ã§ã³ãã°ããã¡ãã»ã¼ã¸ããã¼ã«ã¼ã«ã¤ãã³ãããã£ããã£ãã¦è»¢éããã¹ã¿ã³ãã¢ãã³CDCããã»ã¹ï¼ã½ã¼ã¹ã³ãã¯ã¿ï¼
- ãªãã·ã§ã³ 2 ã¯ãã¤ãã³ããã¢ããªã±ã¼ã·ã§ã³ã«ç´æ¥éä¿¡ããçµã¿è¾¼ã¿CDCã¯ã©ã¤ã¢ã³ã
- ãªãã·ã§ã³ A ã¯ãCDCã¤ãã³ãããã¼ã¿ã¹ãã¢ã«ç´æ¥æ°¸ç¶åããå¥ã®ã³ãã¯ã¿ï¼ã·ã³ã¯ã³ãã¯ã¿ï¼
- ãªãã·ã§ã³ B ã¯ãã¡ãã»ã¼ã¸ããã¼ã«ã¼ãä»ãã¦ã¢ããªã±ã¼ã·ã§ã³ã«ã¤ãã³ãã転é
æå¾ã«ãCDCå®è£ ã«ã¯åº¦ã 次ã®ãããªç¹å¾´ããããã¨ãããã¾ãï¼
- å°ãªãã¨ã1åã®é ä¿¡(at-least-once)ä¿è¨¼ã§ãã¤ãã³ãããã¹ã¦ã®ã³ã³ã·ã¥ã¼ãã«è»¢éããããã«ããã¥ã©ãã«ãªã¡ãã»ã¼ã¸ããã¼ã«ã¼ãå©ç¨ããã
- ã¤ãã³ããä¿æããã¦ããéãããã¼ã¿ã¹ãã¢ã®ãã©ã³ã¶ã¯ã·ã§ã³ãã°ã¾ãã¯ã¡ãã»ã¼ã¸ããã¼ã«ã¼ããã¤ãã³ãããªãã¬ã¤ããè½åããã
CDCã¯é常ã«æè»ã§ãè¤æ°ã®ã¦ã¼ã¹ã±ã¼ã¹ã«é©å¿ã§ãã¾ãã ã¢ã¼ãªã¼ã¢ããã¿ã¼ã®CDCã®æ¡ç¨è ã¯ãªãã·ã§ã³ 1 ã A ãé¸æãã¦ãã¾ããããCDCãå¢ããå¢ãã«ã¤ãã¦ããªãã·ã§ã³1 ã Bãããã¦ãªãã·ã§ã³ 2 ã®äººæ°ãé«ã¾ã£ã¦ãã¾ãã
Outboxãã¿ã¼ã³ãå®è£ ããããã«CDCãå©ç¨ãã
Outboxãã¿ã¼ã³ã®ä¸»ãªç®çã¯ãï¼ãã¼ãã«ã«æ ¼ç´ããã¦ããï¼ã¢ããªã±ã¼ã·ã§ã³ã®ç¶æ ã®æ´æ°ã¨ãã¡ã¤ã³ã¤ãã³ãã®çºè¡ããåä¸ã®ãã©ã³ã¶ã¯ã·ã§ã³å ã§è¡ããã¨ãä¿è¨¼ãããã¨ã§ããããã«ã¯ããã¼ã¿ãã¼ã¹å ã«Outboxãã¼ãã«ãä½æãã¦ããã©ã³ã¶ã¯ã·ã§ã³ã®ä¸é¨ã¨ãã¦ãããã®ãã¡ã¤ã³ã¤ãã³ããåéãããã¨ãå«ã¿ã¾ãããã¡ã¤ã³ã¤ãã³ãã¨ãã®Outboxã§ã®è»¢éã«ã¾ã¤ãããã©ã³ã¶ã¯ã·ã§ã³ã®ä¿è¨¼ã¯ãã·ã¹ãã å ¨ä½ã®ãã¼ã¿ä¸è²«æ§ã«ã¨ã£ã¦éè¦ã§ãã
ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããã¨ãCDCã³ãã¯ã¿ã«ãã£ã¦ãã¡ã¤ã³ã¤ãã³ããåå¾ãããä¿¡é ¼ã§ããã¡ãã»ã¼ã¸ããã¼ã«ã¼ãå©ç¨ãã¦é¢å¿ã®ããã³ã³ã·ã¥ã¼ãã¼ã«è»¢éããã¾ãï¼å³5ãåç §ï¼ã ãããã®ã³ã³ã·ã¥ã¼ãã¼ã¯ããã®ãã¡ã¤ã³ã¤ãã³ãã使ç¨ãã¦ãå½¼ãèªèº«ã®éç´ãå ·ä½åããããããã¾ããï¼ä¸è¨ã®ã¤ãã³ãã½ã¼ã·ã³ã°ãåç §ï¼ã
Outboxã¯ãéä¿¡ããã¤ãã³ããã¼ã¿ã®ä¸æçãªã¹ãã¢ã«ããããèªã¿åããã¯ã¨ãªã¯æå³ããã¦ããªããããã¢ããªã±ã¼ã·ã§ã³ããã¯æ½è±¡åããããã¨ãããã¾ããå®éãOutboxã«ãããã¡ã¤ã³ã¤ãã³ãã¯ãæ¿å ¥å¾ã«ããã«åé¤ãããå¯è½æ§ãããã¾ãï¼
ã¤ãã³ãã½ã¼ã·ã³ã°ã¸ã£ã¼ãã« vs Outbox
ããã§ãã¤ãã³ãã½ã¼ã·ã³ã°ã¸ã£ã¼ãã«ã¨ãOutboxãç¨ããCDC ã®è¨è¨ã®ãªã¼ãã¼ã©ããã詳ããè¦ããã¨ãã§ãã¾ããã¸ã£ã¼ãã«ã®å±æ§ãOutboxãã¼ãã«ã¨æ¯è¼ãããã¨ã«ãããé¡ä¼¼æ§ãæããã«ãªãã¾ãã DDDã§ããã¨ããã®éç´ã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ã¨Outboxã®åæ¹ã«ã¨ã£ã¦ããã¼ã¿ãã©ã®ããã«ä¿åããæ¶è²»ããããã®ä¸å¿ã«ããã¾ãã
ã¤ãã³ãã½ã¼ã·ã³ã°ã¸ã£ã¼ãã«ã¨Outboxéã«åå¨ããä¸è¬çãªå±æ§ã¯æ¬¡ã®ã¨ããã§ãï¼
- ã¤ãã³ãID â ã¤ãã³ãããèªä½ã®ä¸æã®èå¥åãã¹ãçã®ã³ã³ã·ã¥ã¼ãã®éè¤æé¤ã«ã使ç¨ã§ãã
- éç´ID â ã¤ãã³ãã«é¢é£ãããã¼ãã£ã·ã§ã³ã§å©ç¨ãããä¸æã®èå¥åã ãããã®ã¤ãã³ãã¯éç´ã®ç¶æ ãæ§æ
- éç´ã¿ã¤ã â é¢å¿ã®ããã³ã³ã·ã¥ã¼ãã¼ã®ã¿ã«ã¤ãã³ããã«ã¼ãã£ã³ã°ããããã«ä½¿ç¨ã§ããéç´ã®ã¿ã¤ã
- ã·ã¼ã±ã³ã¹/ã¿ã¤ã ã¹ã¿ã³ã â ã¤ãã³ããã½ã¼ããã¦é åºãä¿è¨¼ããæ¹æ³
- ã¡ãã»ã¼ã¸ãã¤ãã¼ã â ä¸æµã³ã³ã·ã¥ã¼ãã¼ãèªã¿åãå¯è½ãªå½¢å¼ã§äº¤æãããã¤ãã³ããã¼ã¿ãå«ã
Outboxãã¼ãã«ã¨ã¤ãã³ãã½ã¼ã·ã³ã°ã¸ã£ã¼ãã«ã¯åºæ¬çã«åããã¼ã¿å½¢å¼ãæã¡ã¾ãã主ãªéãã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ã¸ã£ã¼ãã«ã¯æ°¸ç¶çã§ä¸å¤ã®ãã¡ã¤ã³ã¤ãã³ãã®ã¹ãã¢ã§ããã®ã«å¯¾ããOutboxã¯é常ã«çå½ã§ããããã¡ã¤ã³ã¤ãã³ãããã§ã³ã¸ã¤ãã³ãå ã«è¨é²ãããä¸æµã³ã³ã·ã¥ã¼ãã«è»¢éããããã ã®éçå ´ã§ãããã¨ã§ãã
ã³ãã³ãã¯ã¨ãªã®è²¬ä»»åé¢ï¼CQRSï¼
ã³ãã³ãã¯ã¨ãªã®è²¬ä»»åé¢ãã¿ã¼ã³ï¼ç¥ãã¦CQRSï¼ã¯ãä¸è¬çã«ã¤ãã³ãã½ã¼ã·ã³ã°ã¨å ±ã«å©ç¨ããã¾ãããã ããCQRSã使ç¨ããããã«ã¤ãã³ãã½ã¼ã·ã³ã°ã¯å¿ è¦ããã¾ããããã¨ãã°ã代ããã«Outboxãã¿ã¼ã³ã§å®è£ ã§ãã¾ãã
CQRSã¨ã¯ä½ã§ããããï¼ããã¯ãããããã®ã¾ã¨ã¾ã£ããã¼ã¿ãã¯ã¨ãªå¯è½ãªèªã¿åãå°ç¨ã®ãã¥ã¼ã«ãããã¨ã主ãªç®çã¨ãã¦ãããã¸ã§ã¯ã·ã§ã³(æå½±)ã¨å¼ã°ãããã¼ã¿ã®ä»£æ¿è¡¨ç¾ãä½æãããã¿ã¼ã³ã§ãããã¾ãã¾ãªã¯ã©ã¤ã¢ã³ããé¢å¿ã®ããåããã¼ã¿ã»ããã«å¯¾ãã¦ãè¤æ°ã®ããã¸ã§ã¯ã·ã§ã³ãããå ´åãããã¾ãã
CQRSã®ã³ãã³ãé¢ã§ã¯ãã¢ã¯ã·ã§ã³ï¼ã³ãã³ãï¼ãå¦çããããã¦æçµçã«ããã¸ã§ã¯ã·ã§ã³ãããç¶æ ãä½æããããã«å©ç¨ã§ãããã¡ã¤ã³ã¤ãã³ããçæãããã¢ããªã±ã¼ã·ã§ã³ã«å½ã¦ã¯ã¾ãã¾ããããããCQRSãã¤ãã³ãã½ã¼ã·ã³ã°ã«é »ç¹ã«é¢é£ä»ããããï¼ã¤ã®çç±ã§ãã
CQRSãã¤ãã³ãã½ã¼ã·ã³ã°ã¨çµåãããããã1ã¤ã®çç±ã¯ãã¸ã£ã¼ãã«ã¯ã¢ããªã±ã¼ã·ã§ã³ã«ãã£ã¦ã¯ã¨ãªã§ããªãããã§ãã ã¤ãã³ãã½ã¼ã¹ã·ã¹ãã ã§ãã¼ã¿ãã¯ã¨ãªããå¯ä¸ã®æ¹æ³ã¯ãããã¸ã§ã¯ã·ã§ã³ã使ç¨ãããã¨ã§ãã ãããã®ããã¸ã§ã¯ã·ã§ã³ã¯çµææ´åæ§ã§ãããã¨ã«çæãã¦ãã ãããããã«ããæè»æ§ããããããã¾ãããå¼·ãä¸è²«æ§ã®ãããã¥ã¼ããã®é¸è±ã¨è¤éãããå¼ãèµ·ããã¾ãã
å³6ã¨å³7ããåããããã«ããããã¯ã¤ãã³ãã½ã¼ã·ã³ã°ã«åºã¥ãCQRSãã¿ã¼ã³ã®2ã¤ã®ç°ãªã解éã§ãããæçµçµæã¯åãã§ãã¤ãã³ãããã®ã¿çãããã¼ã¿ã®ã¯ã¨ãªå¯è½ãªããã¸ã§ã¯ã·ã§ã³ã«ãªãã¾ãã åè¿°ãã¾ããããCQRSã¯å³8ã®ããã«Outboxãã¿ã¼ã³ã¨çµã¿åããããã¨ãã§ãã¾ãããã®è¨è¨ã®å©ç¹ã¯ã¢ããªã±ã¼ã·ã§ã³ãã¼ã¿ãã¼ã¹å ã§ä¾ç¶ã¨ãã¦å¼·åãªä¸è²«æ§ããããã¨ã§ããããããCQRSããã¸ã§ã¯ã·ã§ã³ãç¨ããçµææ´åæ§ã¨ãªãã¾ãã
ãã¡ã¤ã³ã¤ãã³ããã¢ããªã±ã¼ã·ã§ã³å é¨ã§å¦çãã
ãã®è¨äºã®ä¸ã§ã¯ãã·ã¹ãã å ¨ä½ã«ãã¼ã¿ãé å¸ãããã¨ã«éç¹ãç½®ãã¦ãã¾ãããã¢ããªã±ã¼ã·ã§ã³å é¨ã§ãã¡ã¤ã³ã¤ãã³ãã使ç¨ãããã¨ãéè¦ã§ãã ãã¡ã¤ã³ã¤ãã³ããå é¨ã§å¦çãããã¨ã¯ãã¤ãã³ãã®çºçå ã¨åããã¤ã¯ããµã¼ãã¹ã³ã³ããã¹ãå ã§ã®ãã¸ãã¹ãã¸ãã¯ã®å®è¡ãªã©ã®ããã¾ãã¾ãªçç±ã§å¿ è¦ã¨ãªãã¾ãã ããã¯ã¤ãã³ãé§åã¢ããªã±ã¼ã·ã§ã³ãæ§ç¯ããä¸è¬çãªæ¹æ³ã§ãã
ã¤ãã³ãã½ã¼ã·ã³ã°ã¾ãã¯CDCã®ãããããç¨ãã¦ããã¡ã¤ã³ã¤ãã³ããå é¨çã«å¦çããã«ã¯ãã¤ãã³ããã¡ã¢ãªã§æ¸¡ããã£ã¹ãããã£ã¡ã«ããºã ãå¿ è¦ã§ãããã«ã¯ Vert.x EventBusãAkka Actor Systemããããã¯Spring Application Events ã¨ãã£ãä¾ãããã¾ãã ããããªããOutboxãã¿ã¼ã³ã®å ´åã«ã¯ãã¤ãã³ãã¯Outboxãã©ã³ã¶ã¯ã·ã§ã³ãæ£å¸¸ã«å®äºããå¾ã«ã®ã¿ãã£ã¹ãããããã¾ãã
ç¹æ§ã®æ¯è¼
ãã®è¨äºã¯ããããã®äºã説æããã®ã§ãè¦ç´ãã表ãæçããããã¾ãããï¼
ç¹æ§ | ã¤ãã³ãã½ã¼ã·ã³ã° | CDC | CDC + Outbox | CQRS |
---|---|---|---|---|
ç®ç | ãã¡ã¤ã³ã¤ãã³ããå«ãã¸ã£ã¼ãã«ã®ç¶æ ããã£ãã㣠| ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãããã§ã³ã¸ã¤ãã³ããã¨ã¯ã¹ãã¼ã | CDCãä»ãã¦Outboxãããã¡ã¤ã³ã¤ãã³ããã¨ã¯ã¹ãã¼ã | ãã¡ã¤ã³ã¤ãã³ãã使ç¨ãã¦ããã¼ã¿ã®ããã¸ã§ã¯ã·ã§ã³ãçæ |
ã¤ãã³ãã¿ã¤ã | ãã¡ã¤ã³ã¤ãã³ã | ãã§ã³ã¸ã¤ãã³ã | ãã§ã³ã¸ã¤ãã³ãã«çµã¿è¾¼ã¾ãããã¡ã¤ã³ã¤ãã³ã | ãã¡ã¤ã³ã¤ãã³ã |
çã®æ å ±æº(Source of Truth) | ã¸ã£ã¼ãã« | ãã©ã³ã¶ã¯ã·ã§ã³ãã° | ãã©ã³ã¶ã¯ã·ã§ã³ãã° | (å®è£ ã«ä¾åãã) |
å¢ç(Boundary) | ã¢ããªã±ã¼ã·ã§ã³ | ã·ã¹ãã | ã·ã¹ãã (CDC) ã¢ããªã±ã¼ã·ã§ã³ (Outbox) | ã¢ããªã±ã¼ã·ã§ã³ãããã¯ã·ã¹ãã |
ä¸è²«æ§ã¢ãã« | N/A (ã¸ã£ã¼ãã«ã«ã®ã¿æ¸ãè¾¼ã¿) | å¼·ãä¸è²«æ§ (ãã¼ãã«)ãçµææ´åæ§ (Change Event capture) | å¼·ãä¸è²«æ§ (Outbox)ãçµææ´åæ§ (Change Event capture) | çµææ´åæ§ |
ãªãã¬ã¤å¯è½ | Yes | Yes | Yes | (å®è£ ã«ä¾åãã) |
ã¤ãã³ãã½ã¼ã·ã³ã° + CQRS ã® é·æã¨çæ
ã¤ãã³ãã½ã¼ã·ã³ã°ã¨CQRSãç解ããã®ã§ãã¤ãã³ãã½ã¼ã·ã³ã°ã¨CQRSãçµã¿åãããå ´åã®é·æã¨çæã確èªãã¾ãããããããã®é·æã¨çæã¯ãå©ç¨å¯è½ãªç¾å¨ã®å®è£ ãèæ ®ããåæ£ã·ã¹ãã ãæ§ç¯ããç§èªèº«ãä»ã®ã¨ãã¹ãã¼ã両æ¹ããã®çµé¨ããã¨ã«ææ¸åãã¾ããã
ã¤ãã³ãã½ã¼ã·ã³ã° + CQRS ã® é·æ
- ç£æ»ãç®çã¨ãã¦ã¸ã£ã¼ãã«ã«ç°¡åã«ã¢ã¯ã»ã¹ã§ãã
- ä¸è¬çã«ã¸ã£ã¼ãã«ã¸ã®å¤§éã®æ¸ãè¾¼ã¿æä½ã«å¯¾ããããã©ã¼ãã³ã¹ãé«ã
- 大éãã¼ã¿ã«å¯¾ãã¦ã¸ã£ã¼ãã«ãã·ã£ã¼ãã§ããå¯è½æ§ãããï¼ãã ããã¼ã¿ã¹ãã¢ä¾åï¼
ã¤ãã³ãã½ã¼ã·ã³ã° + CQRS ã® çæ
- ãã¹ã¦ã¯çµææ´åæ§ã®ãã¼ã¿ã§ãã å¼·ãä¸è²«æ§ãã¼ã¿ã®è¦ä»¶ã¯ã¤ãã³ãã½ã¼ã·ã³ã°ã¨CQRSã«ã¯é©åãã¾ãã
- ã¸ã£ã¼ãã«ã¸ã®æ¸ãè¾¼ã¿ã¯èªã¿åããã¨ãã§ãã¾ããï¼ã¯ã¨ãªè¦³ç¹ããï¼
- ã¸ã£ã¼ãã«ããã³ã¤ãã³ãã½ã¼ã¹ã¢ã¼ããã¯ãã£å¨ãã®é·æã¡ã³ããã³ã¹ã®èæ ®
- ã¨ã©ã¼ã±ã¼ã¹ããã®è£æ£ã¢ã¯ã·ã§ã³ã®ããã®å¤ãã®ã³ã¼ããæ¸ãå¿ è¦ããã
- ãã¥ã¢ã«æ¸ãè¾¼ã¿ã®æ¬ é¥ã解決ããããã®ãã©ã³ã¶ã¯ã·ã§ã³ä¿è¨¼ããªãï¼å¾ã§èª¬æãã¾ãï¼
- ã¤ãã³ãã®å½¢å¼ãå¤åããããã«ãã¬ã¬ã·ã¼ãã¼ã¿ã®ä¸ä½äºææ§ã¾ãã¯ç§»è¡ãæ¤è¨ããå¿ è¦ããã
- ã¸ã£ã¼ãã«ã®ã¹ãããã·ã§ããã¨ããã«é¢é£ããå½±é¿ãèæ ®ããå¿ è¦ããã
- ã¤ãã³ãã½ã¼ã·ã³ã°ã¨CQRSã使ç¨ããçµé¨ã®ããéçºè ã¯äºå®ä¸åå¨ãã¾ãã
- ã¤ãã³ãã½ã¼ã·ã³ã°ã®ã¦ã¼ã¹ã±ã¼ã¹ãä¸è¶³ãã¦ããããé©ç¨ãå¶éããã
ã¤ãã³ãã½ã¼ã·ã³ã°ã¨CQRSã®ãã¥ã¢ã«æ¸ãè¾¼ã¿ã®ãªã¹ã¯
ã¤ãã³ãã½ã¼ã·ã³ã°ã®1ã¤ã®åé¡ã¯ãã¢ããªã±ã¼ã·ã§ã³ã«ã¨ã©ã¼ãããå ´åãCQRSããã¸ã§ã¯ã·ã§ã³ãæ´æ°ãããã¨ã«å¤±æããå¯è½æ§ããããã¨ã§ãã ããã«ãããã¼ã¿ã失ãããå¯è½æ§ãããã¾ããæ®å¿µãªãããã¢ããªã±ã¼ã·ã§ã³èªä½ã«é©åãªè£æ£ã¢ã¯ã·ã§ã³ãçµã¿è¾¼ã¾ãªããã°ããã®ãã¼ã¿ãå復ãããã¨ã¯å°é£ããããã¾ããã 追å ã³ã¼ãã¨è¤éãã¯éçºè ã«å§ãããã¨ã©ã¼ãçºçãããããªãã¾ãã ãã¨ãã°1ã¤ã®åé¿çã¯ãã¤ãã³ãã½ã¼ã¹ã¸ã£ã¼ãã«ã«ç¸é¢ããèªã¿åããªãã»ããçªå·ã追跡ããã¨ã©ã¼æã«ãã¡ã¤ã³ã¤ãã³ããåå¦çãã¦CQRSããã¸ã§ã¯ã·ã§ã³ãæ´æ°ã§ããããªãã¬ã¤ã®è½åãä¸ãããã¨ã§ãã
ãã®ã¨ã©ã¼ãçºçããæ ¹æ¬çãªçç±ã¯ãã¸ã£ã¼ãã«ã¨CQRSããã¸ã§ã¯ã·ã§ã³ã®ä¸¡æ¹ã«æ¸ãè¾¼ãããã®ãã©ã³ã¶ã¯ã·ã§ã³ãæ¬ ãã¦ãããã¨ã§ããããã¯ããã¥ã¢ã«æ¸ãè¾¼ã¿ãã¨å¼ã°ãããã®ã§ãããã¨ã©ã¼ã®ãªã¹ã¯ãå¤§å¹ ã«å¢å ãã¾ãã ãã®ãã¥ã¢ã«æ¸ãè¾¼ã¿ã®æ¬ é¥ãå³9ã«ç¤ºãã¾ãã
å³7ã«ç¤ºãããã«ãã¡ãã»ã¼ã¸ããã¼ã«ã¼ã追å ãã¦ãããã¥ã¢ã«æ¸ãè¾¼ã¿ã®åé¡ã¯è§£æ±ºãã¾ããããã®è¨è¨ã§ã¯ãã¡ãã»ã¼ã¸ããã¼ã«ã¼ã«ã¡ãã»ã¼ã¸ãæ¸ãåºãã¦ãããããã¨ã©ã¼ãçºçããå¯è½æ§ãããã¾ãã ãã¥ã¢ã«æ¸ãè¾¼ã¿ã®æ¬ é¥ã¯ãCQRSã§ã¤ãã³ãã½ã¼ã·ã³ã°ã使ç¨ããéã®èª²é¡ã®ã»ãã®ä¸ä¾ã§ãã ããã«ãã¸ã£ã¼ãã«ãçå®ã®æºæ³(source of truth)ã¨ãã¦æã¤ãã¨ã«ããé·æçãªã¡ã³ããã³ã¹ã¨Day 2ã®å½±é¿ã«ãããæéã®çµéã¨ã¨ãã«ã¢ããªã±ã¼ã·ã§ã³ã®ãªã¹ã¯ãé«ã¾ãã¾ãã ã¾ããã¤ãã³ãã½ã¼ã·ã³ã°ã¯ãã»ã¨ãã©ã®ã¨ã³ã¸ãã¢ã«ã¯é¦´æã¿ã®ãªããã©ãã¤ã ã§ãããã·ã¹ãã ãåè¨è¨ãããã¨ã«ã¤ãªãã誤ã£ãæ¶æ¸¬ãè¨è¨ä¸ã®é¸æããããããªãã¾ãã ã¤ãã³ãã½ã¼ã·ã³ã°ã®é·æã¨çæãCQRSã¨çµã¿åããã¦èããã¨ããã®è¨è¨ã«çæããåã«ä»£æ¿æ¡ãæ¢ããã¨ããå§ããã¾ãã ããªãã®ã¦ã¼ã¹ã±ã¼ã¹ã¯ã¤ãã³ãã½ã¼ã·ã³ã°ã«é©åããããããã¾ãããããCDCãé©åããå ´åãããã¾ãã
CDCã¨Outbox ã®ããã®Debezium
Debeziumã¯ãRed Hatããµãã¼ããããªã¼ãã³ã½ã¼ã¹CDCããã¸ã§ã¯ãã§ãããéå»æ°å¹´éã§å¾ã ã«äººæ°ãéãã¦ãã¾ããæè¿ãDebeziumã¯ãQuarkus Javaãã¤ã¯ããµã¼ãã¹ã©ã³ã¿ã¤ã ã®æ¡å¼µæ©è½ãåããOutboxãã¿ã¼ã³ã®å®å ¨ãªãµãã¼ãã追å ãã¾ãããDebeziumãQuarkusãããã³Outboxã¯ããã¥ã¢ã«æ¸ãè¾¼ã¿ã®æ¬ é¥ãåé¿ããå æ¬çãªã½ãªã¥ã¼ã·ã§ã³ãæä¾ããä¸è¬çã«ã¤ãã³ãã½ã¼ã¹ã½ãªã¥ã¼ã·ã§ã³ã¨æ¯è¼ãã¦ãå¹³åçãªéçºè ãã¼ã ã«ã¨ã£ã¦ããå®ç¨çãªã½ãªã¥ã¼ã·ã§ã³ã§ãã
CDC + Outbox with Debezium ã®é·æ
- çå®ã®æºæ³(Source of truth)ã¯ãã¢ããªã±ã¼ã·ã§ã³ãã¼ã¿ãã¼ã¹ã®ãã¼ãã«ã¨ãã©ã³ã¶ã¯ã·ã§ã³ãã°å ã«ã¨ã©ã¾ãã¾ã
- ãã©ã³ã¶ã¯ã·ã§ã³ã®ä¿è¨¼ã¨ä¿¡é ¼ã§ããã¡ãã»ã¼ã¸ã³ã°ã«ããããã¼ã¿ã®æ失ã¾ãã¯ç ´æã®å¯è½æ§ãå¤§å¹ ã«æ¸å°ãã¾ã
- ãããã¿ã¤ãã«ã«ãªãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«é©åããæè»ãªã½ãªã¥ã¼ã·ã§ã³
- ã·ã³ãã«ãªè¨è¨ã¯ãé·æã«ããã£ã¦ç¶æãããã
- èªèº«ã®æ¸ãè¾¼ã¿ãèªã¿åãã¨ã¯ã¨ãªãå¯è½
- ã¢ããªã±ã¼ã·ã§ã³ãã¼ã¿ãã¼ã¹å ã®å¼·åãªä¸è²«æ§ã®æ©ä¼ãããã æ®ãã®ã·ã¹ãã å ¨ä½ã«ã¾ãããçµææ´åæ§
CDC + Outbox with Debezium ã®çæ
- ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãèªã¿åããã¡ãã»ã¼ã¸ããã¼ã«ã¼ãééãããã¨ã«ããã追å ã®ã¬ã¤ãã³ã·ãçºçããå ´åãããã¾ãã ã¬ã¤ãã³ã·ã¼ãæå°åããããã«ãã¥ã¼ãã³ã°ãå¿ è¦ãªå ´åãããã¾ãã
- Quarkusã¯åªãã¦ãã¾ãããæ¢è£½ããã Outbox API ã®ç¾å¨ã®å¯ä¸ã®ãªãã·ã§ã³ã§ããããã å¿ è¦ã«å¿ãã¦ç¬èªã®å®è£ ããã¼ã«ãããã¨ãã§ãã¾ãã
ã¾ã¨ã
ãã¤ã¯ããµã¼ãã¹ã使ç¨ããåæ£ã·ã¹ãã ã®æ§ç¯ã¯ãé常ã«å°é£ãªå ´åãããã¾ãã ããããã¤ãã³ãã½ã¼ã·ã³ã°ã®ãããªæ¬æ°ãªã½ãªã¥ã¼ã·ã§ã³ãæ¤è¨ããä¸ã§é åçãªçç±ã§ãã ãã ããé常ãDebeziumã使ç¨ããCDCããã³Outboxã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ã®ããåªãã代æ¿æ段ã§ãããããã«ã¯CQRSãã¿ã¼ã³ã¨äºææ§ãããã¾ãã ä¸é¨ã®ã¦ã¼ã¹ã±ã¼ã¹ã§ã¯ã¤ãã³ãã½ã¼ã·ã³ã°ã«ä¾¡å¤ãããå ´åãããã¾ãããã¾ãDebeziumã¨Outboxã試ãã¦ã¿ããã¨ããå§ããã¾ãã
ããã«å ã¸é²ãããã®ãªã½ã¼ã¹
ããã¥ã¡ã³ã
- Debezium Tutorial
- Debezium Outbox Event Router
- Debezium Outbox Pattern Sample Application (Quarkus)
- Quarkus Getting Started
ããã°ã¨è¨äº
- Reliable Microservices Data Exchange With the Outbox Pattern
- Transactional Outbox Pattern
- Outbox Event Router goes Supersonic!
- Introducing Event Sourcing
- Exploring CQRS and Event Sourcing
- What they donât tell you about event sourcing
- Day Two Problems When Using CQRS and Event Sourcing
- Introducing Derivative Event Sourcing
- Domain Events versus Change Data Capture
- Reactive Manifesto
ãããªã¨ããããã£ã¹ã
- Gunnar Morling on Change Data Capture and Debezium
- Microservices & Data: Implementing the Outbox Pattern with Debezium
Eric Murphy
Ericha ã¯ã¬ãããããã®ã·ãã¢ã¢ã¼ããã¯ãã§ããå½¼ã¯ã¢ããªã±ã¼ã·ã§ã³éçºã¨OpenShiftã®ã³ã³ãµã«ãã£ã³ã°ããã¸ã§ã¯ãããªã¼ããã¦ãã¾ãã Eric ã¯ã·ã¢ãã«ã®ãã°ã«ä½ãã§ãã¾ãã [twitter] [github]