ãã¹ãŠãççµåã«ããããµãŒãã¹ãäºãã®çšŒåæéã«é¢ããæåŸ ã§ã¯ãªããã€ãã³ããéããŠéä¿¡ããããã«ããã

ã¢ããªã¹ããããã€ã¡ã³ãã®ããã«ããã¯ã«ãªã£ãŠãã â ãããã倿Žã«ããŒã éã®èª¿æŽãå¿ èŠã§ã課éã·ã¹ãã ã«ãã°ããããšã¢ããªã±ãŒã·ã§ã³å šäœã忢ããŠããŸãããŸãã¯ãç°ãªãæ©èœãç°ãªãé床ã§é²åããæ°ããã·ã¹ãã ãæ§ç¯ããŠããå ŽåïŒæ³šæç®¡çã¯æ¯é±å€æŽãããããåšåº«ããžãã¯ã¯ååæããšã«å€æŽããããã«ã¹ã±ãŒãé害ãã§ãŒã³ãåŒãèµ·ããåæç㪠API åŒã³åºãã§ã¯ãªããã€ãã³ããéããŠéä¿¡ããããšã§ãç¬ç«ããŠéçºããããã€ãã¹ã±ãŒãªã³ã°ã§ãããµãŒãã¹ãå¿ èŠã«ãªãã
Explore more design patterns and system architectures
MicrocosmWorksã¯ãApache KafkaãAmazon EventBridgeã®ãããªæ°žç¶çãªã¡ãã»ãŒãžãããŒã«ãŒãåããã€ãã³ãé§ååã·ã¹ãã ãèšèšããŠãããã³ã³ã·ã¥ãŒããŒãã€ãã³ããæ£åžžã«åŠçãããŸã§ã€ãã³ããä¿æããããšã§ãé害çºçæã®ããŒã¿æå€±ãé²ããŸããé害ãçºçãããã€ã¯ããµãŒãã¹ãã€ãã³ããã€ãã©ã€ã³å šäœããããã¯ããªãããããããã¬ã¿ãŒãã¥ãŒãææ°ããã¯ãªãå詊è¡ããªã·ãŒãããã³ãµãŒããããã¬ãŒã«ãŒãå®è£ ããŠããŸããããŠã³ã¹ããªãŒã ãµãŒãã¹ã埩æ§ãããšãæåä»å ¥ãªãã§æªåŠçã®ã€ãã³ãã«èªåçã«è¿œãã€ããŸãã
ã€ãã³ãé§ååéä¿¡ã¯ããµãŒãã¹ã峿ã®å¿çãå¿ èŠãšããªãå Žåããããã€ã¡ã³ããµã€ã¯ã«ãåé¢ããå¿ èŠãããå ŽåããŸãã¯åäžã®ã¢ã¯ã·ã§ã³ãè€æ°ã®ããŠã³ã¹ããªãŒã ããã»ã¹ãããªã¬ãŒããå Žåã«åªããéžæè¢ã§ããMicrocosmWorksã¯éåžžãæ³šæåŠçãéç¥ãã€ãã©ã€ã³ãåæããŒã¿ã®åã蟌ã¿ã«ã€ãã³ãé§ååãã¿ãŒã³ãæšå¥šããŠãããäžæ¹ãç§æªæºã®å¿çãå¿ èŠãšãããŠãŒã¶ãŒåãã¯ãšãªã«ã¯åæ API ãç¶æããŠããŸããç§ãã¡ãæ§ç¯ããå€ãã®æ¬çªã·ã¹ãã ã§ã¯ãåæèªã¿èŸŒã¿ãšéåææžã蟌ã¿ãçµã¿åããããã€ããªããã¢ãããŒããæ¡çšããŠããŸãã
MicrocosmWorksã¯ãKafkaãããã¯ã§ããŒãã£ã·ã§ã³ããŒããŒã¹ã®é åºä»ãã䜿çšããç¹å®ã®ãšã³ãã£ãã£ïŒç¹å®ã®æ³šæããŠãŒã¶ãŒãªã©ïŒã«é¢é£ãããã¹ãŠã®ã€ãã³ããåãã³ã³ã·ã¥ãŒããŒã€ã³ã¹ã¿ã³ã¹ã«ãã£ãŠé åºéãã«åŠçãããããšãä¿èšŒããŠããŸãããšã³ãã£ãã£ããŸããã é åºä»ããå¿ èŠãªã·ããªãªã§ã¯ãåªçæ§ã®ããã€ãã³ããã³ãã©ãåããsaga orchestratorsãå®è£ ããé äžåã®ã¡ãã»ãŒãžãå®å šã«ååŠçã§ããããã«ããŠããŸãããŸããã€ãã³ããã€ããŒãã«vector clocksãsequence numbersãåã蟌ãããšã§ãã³ã³ã·ã¥ãŒããŒãé åºä»ãã®ç«¶åãæ€åºãã解決ã§ããããã«ããŠããŸãã
MicrocosmWorksã¯ãcompensating transactionsã䌎ãSaga patternãå®è£ ããŠããŸããããã«ãããåãã€ã¯ããµãŒãã¹ã¯ããŒã«ã«ãªtransactionãå®äºããåŸã«domain eventsãçºè¡ããããŠã³ã¹ããªãŒã ã®ãµãŒãã¹ãããã«å¿ããŠåå¿ãããããŸãã¯é害æã«rollback compensationsãããªã¬ãŒããŸããç§ãã¡ã¯ããããããžãã¹ããŒã¿ãšãšãã«ã€ãã³ããããŒã«ã«ãªoutbox tableã«ã¢ãããã¯ã«æžã蟌ã¿ããã®åŸmessage brokerã«ç¢ºå®ã«çºè¡ããoutbox patternãšçµã¿åãããŠããŸããããã«ãããtwo-phase commitsã®ããã©ãŒãã³ã¹ãšä¿¡é Œæ§ã®ããã«ãã£ãªãã«eventual consistencyãå®çŸããŸãã
MicrocosmWorksã¯ãOpenTelemetryã䜿çšããŠããã¹ãŠã®ã€ãã³ãã«çžé¢IDãšåæ£ãã¬ãŒã·ã³ã°ããããŒãçµã¿èŸŒãã§ããŸããããã«ãããJaegerãGrafana Tempoã®ãããªããŒã«ã§ãåå ãããã¹ãŠã®ãã€ã¯ããµãŒãã¹ã«ãããããžãã¹ååŒã®å®å šãªã©ã€ããµã€ã¯ã«ãå¯èŠåã§ããŸãããŸãããµãŒãã¹ããšã®ã¹ã«ãŒããããã³ã³ã·ã¥ãŒããŒã©ã°ãåŠçã¬ã€ãã³ã·ã衚瀺ãããªã¢ã«ã¿ã€ã ã®ã€ãã³ããããŒããã·ã¥ããŒããæ§ç¯ããŠãããããã«ããã¯ãç¹å®ããããããŠããŸããåœç€Ÿã®æšæºçãªãªãã¶ãŒãããªãã£ã¹ã¿ãã¯ã«ã¯ãã€ãã³ãã¡ã¿ããŒã¿ãå«ãæ§é åãã®ã³ã°ãå«ãŸããŠãããåäžã®ã€ãã³ãã§ããããã¥ãŒãµãŒãããã¹ãŠã®ã³ã³ã·ã¥ãŒããŒãŸã§æ°ç§ã§è¿œè·¡ã§ããããã«ããŠããŸãã
ç§ãã¡ã®ã¢ãŒããã¯ãã¯ããã®ãã¿ãŒã³ã䜿çšããŠã·ã¹ãã ãèšèšããã³æ§ç¯ããç¹å®ã®èŠä»¶ã«å¯Ÿå¿ããã®ããæäŒãã§ããŸãã
ãåãåããã€ãã³ãé§ååãã€ã¯ããµãŒãã¹ã¯ãã·ã¹ãã ãç¬ç«ããŠãããã€å¯èœãªãµãŒãã¹ã«åè§£ããäž»ã«éåæã€ãã³ããéããŠéä¿¡ããŸããåãµãŒãã¹ã¯èªèº«ã®ããŒã¿ãææããç¶æ ãå€åãããšãã«ãã¡ã€ã³ã€ãã³ããçºè¡ããä»ã®ãµãŒãã¹ããã®ã€ãã³ãã«åå¿ããŸããããã«ãããæéççµåãæé€ãããŸã â ãµãŒãã¹ A ã¯ãã®äœæ¥ãè¡ãããã«ãµãŒãã¹ B ãå®è¡ãããŠããå¿ èŠããããŸããããã®ãã¿ãŒã³ã«ã¯ãæžã蟌ã¿ã¢ãã«ãšèªã¿åãã¢ãã«ãåé¢ããããã® CQRS (Command Query Responsibility Segregation)ãç¶æ 倿Žã®å®å šãªå±¥æŽããã£ããã£ããããã®ã€ãã³ããœãŒã·ã³ã°ã忣ããã¯ãªãã§ãã«ããµãŒãã¹éãã©ã³ã¶ã¯ã·ã§ã³ã管çããããã® saga orchestration ãçµã¿èŸŒãŸããŠããŸãã
ãã®ã¢ãŒããã¯ãã£ã¯ããµãŒãã¹éã§ãã¡ã€ã³ã€ãã³ããã«ãŒãã£ã³ã°ãã ã€ãã³ãããã¯ããŒã³ (Kafka, EventBridge, ãŸã㯠NATS) ãäžå¿ã«æ§ç¯ãããŠããŸããåãµãŒãã¹ã«ã¯3ã€ã®å¢çããããŸãïŒåä¿¡ãªã¯ãšã¹ããåŠçããŠã€ãã³ããçºè¡ãã ã³ãã³ããã³ãã©ãèªã¿åãã«æé©åããããããžã§ã¯ã·ã§ã³ãæäŸãã ã¯ãšãªãã³ãã©ãããã³ä»ã®ãµãŒãã¹ããã®ã€ãã³ãã«åå¿ãã ã€ãã³ãããã»ããµ ã§ããSaga Orchestrator ã¯ãã€ãã³ãããªãã¹ã³ããã¹ãããã倱æãããšãã«è£åã³ãã³ããçºè¡ããããšã§ã倿®µéã®ããžãã¹ããã»ã¹ïŒäŸïŒæ³šæåŠçïŒã調æŽããŸãã
| ã¬ã€ã€ãŒ | ãã¯ãããžãŒ |
|---|---|
| ã³ã³ãã¥ãŒãã£ã³ã° | Node.js (NestJS), Python (FastAPI), Go â ã¯ãŒã¯ããŒãç¹æ§ã«åºã¥ããµãŒãã¹ããšã«éžæ |
| ã¡ãã»ãŒãžã³ã° | Apache Kafka (MSK), AWS EventBridge, NATS JetStream, RabbitMQ |
| ããŒã¿ | PostgreSQL (ãã©ã³ã¶ã¯ã·ã§ã³), DynamoDB (ããŒããªã¥ãŒ), Redis (ãã£ãã·ã³ã°/ããã¯), EventStoreDB |
| ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ | Temporal (ã¯ãŒã¯ãããŒãªãŒã±ã¹ãã¬ãŒã·ã§ã³), AWS Step Functions, ã«ã¹ã¿ã Sagaã³ãŒãã£ããŒã¿ãŒ |
| å¯èŠ³æž¬æ§ | OpenTelemetry (忣ãã¬ãŒã·ã³ã°), Datadog, Jaeger, çžé¢IDä»ãæ§é åãã®ã³ã° |
| å©çšãã¹ãå Žå | é¿ããã¹ãå Žå |
|---|---|
| è€æ°ã®ããŒã ãç°ãªãåšæã§ç¬ç«ããŠãããã€ããå¿ èŠããã | ããŒã ã5äººæªæºã®ãšã³ãžãã¢ã§ããå Žå â é©åã«æ§é åãããã¢ããªã¹ã®æ¹ãéçšãã·ã³ãã« |
| ã·ã¹ãã ã®ç°ãªãéšåãç°ãªãã¹ã±ãŒãªã³ã°ç¹æ§ãæã€ | MVPãæ§ç¯äžã§è¿ éãªãªãªãŒã¹ãå¿ èŠãªå Žå â 忣ã·ã¹ãã ã¯æ§ç¯ã«æéãããã |
| 匷åãªç£æ»èšŒè·¡ãšã€ãã³ããªãã¬ã€æ©èœãå¿ èŠ | ãã¹ãŠã®æäœãåæçãªã匷åãªæŽåæ§ãæã€å¿çãå¿ èŠãšãã |
| ãã¡ã€ã³ãèªç¶ãªå¢çã¥ããããã³ã³ããã¹ãïŒæ³šæãæ¯æããåšåº«ïŒãæã€ | ãã¡ã€ã³ãå¯çµåããŠããå Žå â åå²ãããšåæ£ã¢ããªã¹ã«ãªã |
MW ã¯ãæè¡ã¬ã€ã€ãŒïŒAPI ãµãŒãã¹ãããŒã¿ãµãŒãã¹ãèªèšŒãµãŒãã¹ãªã©ïŒã§ãã€ã¯ããµãŒãã¹ã«åè§£ããããšã¯ãããŸãããç§ãã¡ã¯ãDDD (Domain-Driven Design) ã®å¢çã¥ããããã³ã³ããã¹ãã䜿çšããŠããã¡ã€ã³å¢çã«æ²¿ã£ãŠåè§£ããŸããã³ãŒããæžãåã«ãã€ãã³ãã¹ããŒãã³ã°ã¯ãŒã¯ã·ã§ããã宿œããŠããã¡ã€ã³ã€ãã³ããã³ãã³ããéçŽããããã³ã°ããŸã â ããããµãŒãã¹å¢çãæ±ºå®ãããã®ã§ãããæè¡çãªå¥œã¿ã決å®ãããã®ã§ã¯ãããŸãããç§ãã¡ã¯ãšã³ã¿ãŒãã©ã€ãºã¯ã©ã€ã¢ã³ãåãã«ã¢ããªã¹ãã€ãã³ãé§ååã¢ãŒããã¯ãã£ã«ç§»è¡ããŠããŸããããæãäžè¬çãªæèšã¯æ¬¡ã®ãšããã§ãïŒãŸãã¯å°æ°ã®å€§ããªãµãŒãã¹ããå§ããåŸã§åå²ããããšã§ãã
ã¢ãã«ã¯ããèªäœã§åäœããããã§ã¯ãããŸãããã¢ãã«ã®ãã¬ãŒãã³ã°ãæ€èšŒããããã€ãç£èŠãè¡ããã€ãã©ã€ã³ãããå®éã®è£œåã§ãããã¢ãã«ã¯ãã®ææç©ã®äžã€ã«éããŸããã