ããã«ã¡ã¯HabrïŒ RBKmoneyãåã³é£çµ¡ãåããæ¥æå€§å·¥ã®æ¯æãåŠçã®æžãæ¹ã«é¢ããäžé£ã®èšäºãç¶ããŠããŸãã

ããã«ãã¹ããŒããã·ã³ãšããŠã®æ¯æãããžãã¹ããã»ã¹ã®å®è£
ã®èª¬æã®è©³çްãæãäžããäžé£ã®ã€ãã³ããå®è£
æ©èœãåãããã®ãããªãã·ã³ã®äŸã瀺ããããšæããŸããã ãµããžã§ã¯ãé åã倧ããããããšã倿ããŸããã ãã®æçš¿ã§ã¯ãäœæ¥ã®ãã¥ã¢ã³ã¹ãšããã©ãããã©ãŒã ã®ãã€ã¯ããµãŒãã¹éã®çžäºäœçšãå€éšã·ã¹ãã ãšã®çžäºäœçšãããã³ããžãã¹æ§æã®ç®¡çæ¹æ³ãæããã«ããŸãã
ãã¯ããµãŒãã¹
ç§ãã¡ã®ã·ã¹ãã ã¯å€ãã®ãã€ã¯ããµãŒãã¹ã§æ§æãããŠãããããžãã¹ããžãã¯ã®å®æããåéšåãå®è£
ããçžäºã«ããåãããŠãã¯ããµãŒãã¹ã圢æããŸãã å®éãéè¡ããã®ä»ã®æ¯æãã·ã¹ãã ã«æ¥ç¶ãããããŒã¿ã»ã³ã¿ãŒã«å±éããããã¯ããµãŒãã¹ã¯ãæ¯æãåŠçã§ãã
ãã€ã¯ããµãŒãã¹ãã³ãã¬ãŒã
æžãããŠããèšèªã«ãããããããã€ã¯ããµãŒãã¹ã®éçºã«ã¯çµ±äžãããã¢ãããŒãã䜿çšããŠããŸãã åãã€ã¯ããµãŒãã¹ã¯ã以äžãå«ãDockerã³ã³ãããŒã§ãã
- ErlangãŸãã¯Javaã§èšè¿°ãããããžãã¹ããžãã¯ãå®è£
ããã¢ããªã±ãŒã·ã§ã³èªäœã
- RPClib-ãã€ã¯ããµãŒãã¹éã®éä¿¡ãå®è£
ããã©ã€ãã©ãªã
- Apache Thriftã䜿çšããŸãããã®äž»ãªå©ç¹ã¯ãæ¢è£œã®ã¯ã©ã€ã¢ã³ããµãŒããŒã©ã€ãã©ãªãšãåãã€ã¯ããµãŒãã¹ãæäŸãããã¹ãŠã®ãããªãã¯ã¡ãœããã®èšè¿°ãå³å¯ã«é¡ååã§ããããšã§ãã
- ã©ã€ãã©ãªã®2çªç®ã®æ©èœã¯ã Google Dapperã®å®è£
ã§ããããã«ãããElasticsearchã®ç°¡åãªæ€çŽ¢ã§ãªã¯ãšã¹ãããã°ãã远跡ã§ããŸãã å€éšã·ã¹ãã ãããªã¯ãšã¹ããåä¿¡ããæåã®ãã€ã¯ããµãŒãã¹ã¯ãäžæã®
trace_id
çæãtrace_id
ãããã¯ãåŸç¶ã®åãªã¯ãšã¹ããã§ãŒã³ã«ãã£ãŠä¿åãããŸãã ãŸãã parent_id
ãšspan_id
ãçæããŠä¿åãparent_id
ããã«ãããã¯ãšãªããªãŒãæ§ç¯ããèŠæ±ã®åŠçã«é¢äžãããã€ã¯ããµãŒãã¹ã®ãã§ãŒã³å
šäœãèŠèŠçã«ç£èŠã§ããŸãã - 3çªç®ã®æ©èœ-ãªã¯ãšã¹ãã®ã³ã³ããã¹ãã«é¢ããããŸããŸãªæ
å ±ã®ãã©ã³ã¹ããŒãã¬ãã«ã§è»¢éãç©æ¥µçã«äœ¿çšããŸãã ããšãã°ãæéïŒã¯ã©ã€ã¢ã³ãã«èšå®ãããèŠæ±ã®äºæ³æå¹æéïŒããŸãã¯ãã®ä»£ããã«ã¡ãœãããåŒã³åºããŸãã
- Consulãã³ãã¬ãŒãã¯ããã€ã¯ããµãŒãã¹ã®å Žæãå¯çšæ§ãããã³ã¹ããŒã¿ã¹ã«é¢ããæ
å ±ãä¿æãããµãŒãã¹æ€åºãšãŒãžã§ã³ãã§ãã ãã€ã¯ããµãŒãã¹ã¯DNSåã§çžäºã«æ€çŽ¢ããŸãããŸãŒã³TTLã¯ãŒãã§ããæ»äº¡ãããããã«ã¹ãã§ãã¯ã«åæ Œããªãã£ããµãŒãã¹ã¯è§£æ±ºã忢ãããã©ãã£ãã¯ãåä¿¡ããŸãã
- Elasticsearchãçè§£ã§ãã圢åŒã§ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠããŒã«ã«ã³ã³ãããŒãã¡ã€ã«ã«
filebeat
ãããã°ãšãã³ã³ãããŒã«é¢é£ãããã¹ããã·ã³ã§å®è¡ãããŠããfilebeat
ããããã®ãã°ãfilebeat
ããŠElasticsearchã¯ã©ã¹ã¿ãŒã«éä¿¡ããŸãã
- ã€ãã³ããœãŒã·ã³ã°ã¢ãã«ã«åŸã£ãŠãã©ãããã©ãŒã ãå®è£
ãããããçµæã®ãã°ãã§ãŒã³ã¯ç°ãªãGrafanaããã·ã¥ããŒãã®åœ¢ã§ã®èŠèŠåã«ã䜿çšãããç°ãªãã¡ããªãã¯ãå®è£
ããæéãççž®ã§ããŸãïŒåå¥ã®ã¡ããªãã¯ã䜿çšããŸãïŒã

ãã€ã¯ããµãŒãã¹ãéçºããå Žåããã©ãããã©ãŒã ã®é«å¯çšæ§ãšãã©ãŒã«ããã¬ã©ã³ã¹ã®äž¡æ¹ã®åé¡ã解決ããããã«èšèšããããç¹å¥ã«èæ¡ããå¶éã䜿çšããŸãã
- åã³ã³ããã®å³å¯ãªã¡ã¢ãªå¶éãå¶éãè¶
ããå Žå-OOMãã»ãšãã©ã®ãã€ã¯ããµãŒãã¹ã¯256ã512M以å
ã«ãããŸãã ããã«ãããããžãã¹ããžãã¯ã®å®è£
ããã现ããæçåãããã¢ããªã¹ãžã®ããªããããä¿è·ãããé害ç¹ã®ã³ã¹ããåæžãããå®äŸ¡ãªããŒããŠã§ã¢ã§åäœããæ©èœã远å ãããŸãïŒãã©ãããã©ãŒã ãå±éãããå®äŸ¡ãªã·ã³ã°ã«ãŸãã¯ãã¥ã¢ã«ããã»ããµãµãŒããŒã§åäœããŸãïŒ;
- å¯èœãªéãå°ãªãã¹ããŒããã«ãã€ã¯ããµãŒãã¹ãšå¯èœãªéãå€ãã®ã¹ããŒãã¬ã¹ãªå®è£
ã ããã«ããããã©ãŒã«ããã¬ã©ã³ã¹ãå埩é床ã®åé¡ã解決ããããšãã§ããäžè¬çã«ãçè§£ã§ããªãåäœãçºçããå¯èœæ§ã®ããå Žæãæå°éã«æããããšãã§ããŸãã ããã¯ãå€§èŠæš¡ãªã¬ã¬ã·ãŒãèç©ããããšã·ã¹ãã ã®å¯¿åœãé·ããªããšç¹ã«éèŠã«ãªããŸãã
- ã¯ã©ãã·ã¥ãããŠããééããªãå£ãããã¢ãããŒãã«ããŸãããã ã·ã¹ãã ã®ã©ã®éšåã§ãå¿
ãé害ãçºçããããšãããã£ãŠããããããã©ãããã©ãŒã ã«èç©ãããæ
å ±ã®äžè¬çãªæ£ç¢ºãã«åœ±é¿ãäžããªãããã«èšèšããŠããŸãã ã·ã¹ãã å
ã®æªå®çŸ©ç¶æ
ã®æ°ãæå°éã«æããã®ã«åœ¹ç«ã¡ãŸãã
ãµãŒãããŒãã£ãšçµ±åããå€ãã®äººãç¶æ³ã«ç¢ºãã«ç²ŸéããŠããŸãã ãããã³ã«ã«åŸã£ãŠééãååŽããèŠæ±ã«å¯Ÿãã第äžè
ããã®å¿çãæåŸ
ããã©ã®ããã«è§£éãããäžæãªã仿§ã«èšèŒãããŠããªãå®å
šã«ç°ãªãçããæ¥ãŸããã
ãã®ç¶æ³ã§ã¯ããã®æ¯æããåŠçããã¹ããŒããã·ã³ã匷å¶çµäºããå€éšããã®ã¢ã¯ã·ã§ã³ã«å¯ŸããŠ500ã®ãšã©ãŒãåãåããŸããå
éšã§æ¯æãã®çŸåšã®ç¶æ
ã確èªãããã·ã³ã®ç¶æ
ãçŸå®ã«åãããŠã¹ããŒããã·ã³ã埩掻ãããŸãã
ãããã³ã«æåéçº

ãã®èšäºã®å·çæç¹ã§ã¯ããã©ãããã©ãŒã ã®æ©èœãä¿èšŒãããµãŒãã¹ã«ã€ããŠã636ã®ç°ãªããã§ãã¯ããµãŒãã¹ãã£ã¹ã«ããªã«ç»é²ãããŠããŸããã 1ã€ã®ãµãŒãã¹ã§ããã€ãã®ãã§ãã¯ãå®è¡ãããŠããããšãããã³ã»ãšãã©ã®ã¹ããŒãã¬ã¹ãµãŒãã¹ãå°ãªããšã3ã€ã®ã€ã³ã¹ã¿ã³ã¹ã§åäœããŠããããšãèæ
®ããŠãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã§ãäœããã®æ¹æ³ã§çžäºã«æ¥ç¶ã§ãã倱æããªãããšãå¿
èŠã§ãRPCå°çãžã
ã¹ã¿ãã¯ã«ã¯3ã€ã®éçºèšèªïŒErlangãJavaãJSïŒãããããããã¯ãã¹ãŠééçã«éä¿¡ã§ããå¿
èŠããããããç¶æ³ã¯è€éã§ãã
解決ããå¿
èŠãããæåã®ã¿ã¹ã¯ã¯ããã€ã¯ããµãŒãã¹éã§ããŒã¿ã亀æããããã®æ£ããã¢ãŒããã¯ãã£ãèšèšããããšã§ããã åºç€ãšããŠãApache Thriftã䜿çšããŸããã ãã¹ãŠã®ãã€ã¯ããµãŒãã¹ã¯triftãã€ããªã亀æããŸã; HTTPããã©ã³ã¹ããŒããšããŠäœ¿çšããŸãã
ãã©ã³ã仿§ã¯ãGitHubã«åå¥ã®ãªããžããªã®åœ¢åŒã§é
眮ãããããããããã«ã¢ã¯ã»ã¹ã§ãããã¹ãŠã®éçºè
ã䜿çšã§ããŸãã æåã¯ããã¹ãŠã®ãããã³ã«ã«å
±éã®ãªããžããªã1ã€äœ¿çšããŠããŸããããæéãçµã€ã«ã€ããŠãããã¯äžäŸ¿ã§ãããšããçµè«ã«è³ããŸãã-ãããã³ã«ã«é¢ããå
±å䞊è¡äœæ¥ã¯ãåžžã«é çã®çš®ã«ãªããŸããã ããŸããŸãªããŒã ãããŸããŸãªéçºè
ã§ããã倿°ã®ååã«åæããããšãäœåãªããããŸãããåå空éã«åå²ããããšããŠããå©ãã«ã¯ãªããŸããã§ããã
äžè¬çã«ããããã³ã«é§ååã®éçºããããšèšããŸãã å®è£
ãéå§ããåã«ããªãã仿§ã®åœ¢ã§å°æ¥ã®ãã€ã¯ããµãŒãã¹ãããã³ã«ãéçºãã7ã€ã®ã¬ãã¥ãŒãµãŒã¯ã«ãééããŠããã®ãã€ã¯ããµãŒãã¹ã®å°æ¥ã®é¡§å®¢ãåŒãä»ããåæã«ãã¹ãŠã®å°æ¥ã®ã¡ãœãããç¥ã£ãŠãããæ¢ã«ãã³ãã©ãŒãäœæã§ãããããåæã«è€æ°ã®ãã€ã¯ããµãŒãã¹ã®éçºãéå§ããæ©äŒãåŸãŸããªãã·ã§ã³ã§mokiã䜿çšããŸãã
ãããã³ã«éçºããã»ã¹ã®å¥ã®ã¹ãããã¯ã»ãã¥ãªãã£ã¬ãã¥ãŒã§ããããã§ã¯ãéçºè
ãéçºäžã®ä»æ§ã®åŸ®åŠãªéãã5åæã®èгç¹ããèŠãŸãã
ãŸããããŒã ã«ããããããã³ã«ææè
ã®å¥ã®åœ¹å²ã匷調ããããšãé©åã§ãããšèããŸããã ã¿ã¹ã¯ã¯é£ããããã¹ãŠã®ãã€ã¯ããµãŒãã¹ã®è©³çްã念é ã«çœ®ããŠããå¿
èŠããããŸããã倧ããªé åºã§ææãäžãããšã¹ã«ã¬ãŒã·ã§ã³ã®åäžãã€ã³ããååšããŸãã
ãããã®åŸæ¥å¡ã«ãããã«ãªã¯ãšã¹ãã®æçµæ¿èªããªããã°ããããã³ã«ããã¹ã¿ãŒãã©ã³ãã«ããŒãžã§ããŸããã githubã«ã¯ãããã«éåžžã«äŸ¿å©ãªæ©èœããããŸã- ã³ãŒãææè
ãç§ãã¡ã¯åãã§ããã䜿çšããŸãã
ãããã£ãŠããã€ã¯ããµãŒãã¹éã®éä¿¡ã®åé¡ããã©ãããã©ãŒã ã«ã©ã®ãããªãã€ã¯ããµãŒãã¹ãç»å Žãããããªãå¿
èŠãªã®ãã誀解ããå¯èœæ§ã®ããåé¡ã解決ããŸããã ãã®ãããã³ã«ã®ã»ããã¯ãããããã1ã€ã®ãã€ã¯ããµãŒãã¹ã®å®è£
ãæ¯èŒçç°¡åã«æžãæããããšãã§ãããããéçºã®ã³ã¹ããšé床ã«å¯ŸããŠç¡æ¡ä»¶ã«å質ãéžæãããã©ãããã©ãŒã ã®å¯äžã®éšåã§ãããæ°åã®ãããã³ã«ã¯ãã§ã«é«äŸ¡ã§èŠçã§ãã
ãã®éçšã§ãæ£ç¢ºãªãã°èšé²ã¯ææžåã®åé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸãã ã¡ãœãããšãã©ã¡ãŒã¿ãŒã®é©åãªååãããã€ãã®ã³ã¡ã³ããããã³èªå·±ææžåããã仿§ã«ãããå€ãã®æéãç¯çŽã§ããŸãïŒ
ããšãã°ããã€ã¯ããµãŒãã¹ã®ããããã®ã¡ãœããã®ä»æ§ã¯æ¬¡ã®ããã«ãªãããã©ãããã©ãŒã ã§çºçããã€ãã³ãã®ãªã¹ããååŸã§ããŸãã
/** */ typedef i64 EventID /* Event sink service definitions */ service EventSink { /** * , * , , `range`. * `0` `range.limit` . * * `range.after` , * , , * `EventNotFound`. */ Events GetEvents (1: EventRange range) throws (1: EventNotFound ex1, 2: base.InvalidRequest ex2) /** * * . */ base.EventID GetLastEventID () throws (1: NoLastEvent ex1) } /* Events */ typedef list<Event> Events /** * , -, . */ struct Event { /** * . * , * (total order). */ 1: required base.EventID id /** * . */ 2: required base.Timestamp created_at /** * -, . */ 3: required EventSource source /** * , ( ) * -, . */ 4: required EventPayload payload /** * . * . */ 5: optional base.SequenceID sequence } // Exceptions exception EventNotFound {} exception NoLastEvent {} /** * , - */ exception InvalidRequest { /** */ 1: required list<string> errors }
Thriftã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ã
å¿
èŠãªãã€ã¯ããµãŒãã¹ã®ç¹å®ã®ã¡ãœãããçŽæ¥åŒã³åºãã¿ã¹ã¯ã«çŽé¢ããå ŽåããããŸããããšãã°ã端æ«ããã®æã§ãã ããã¯ããããã°ãçããŒã¿ã»ããã®ååŸããŸãã¯ã¿ã¹ã¯ãéåžžã«ãŸãã§åå¥ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®éçºãå®çšçã§ãªãå Žåã«åœ¹ç«ã¡ãŸãã
ãã®ããã curl
æ©èœãçµã¿åãããããŒã«ãéçºããŸããããJSONæ§é ã®åœ¢åŒã§ç°¡åãªãªã¯ãšã¹ããè¡ãããšãã§ããŸãã ããã«å¿ããŠç§ãã¡ã¯åœŒãåŒãã woorl
ã ãã®ãŠãŒãã£ãªãã£ã¯æ±çšæ§ããããã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ã䜿çšããŠãªãã仿§ã®å Žæãæž¡ãã ãã§ååã§ãããæ®ãã¯èªåçã«å®è¡ãããŸãã éåžžã«äŸ¿å©ãªãŠãŒãã£ãªãã£ã§ãããšãã°ç«¯æ«ããçŽæ¥æ¯æããéå§ã§ããŸãã
ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç®¡çïŒããšãã°ãã¹ãã¢ã®äœæãªã©ïŒãæ
åœãããã©ãããã©ãŒã ãã€ã¯ããµãŒãã¹ã«ã¢ããŒã«ããæ¹æ³ã§ãã ãã¹ãã¢ã«ãŠã³ãã®ããŒã¿ããªã¯ãšã¹ãããŸããã

ãããããèªè
ã¯ã¹ã¯ãªãŒã³ã·ã§ããã®1ã€ã®æ©èœã«æ°ä»ããã§ãããã ããã奜ãã§ã¯ãããŸããã ãã€ã¯ããµãŒãã¹éã§ã®ããªããã³ãŒã«ã®æ¿èªãåºå®ããå¿
èŠããããŸããTLSãé©åã«æ¥çããå¿
èŠããããŸãã ãããããªãœãŒã¹ã¯ãã€ãã®ããã«ååã§ã¯ãããŸããã ãã€ã¯ããµãŒãã¹ã®åŠçãè¡ãããå¢çã®å
šäœã®ãšã³ã¯ããŒãžã£ãŒã«éå®ããŸããã
å€éšã·ã¹ãã ãšéä¿¡ããããã®ãããã³ã«
å€åãã®ãªãã仿§ãå
¬éããå人ã«ãã€ããªãããã³ã«ã䜿çšããéä¿¡ã匷å¶ããããã«ãç§ãã¡ã¯ããã圌ãã«ãšã£ãŠããŸãã«ãæ®é
·ã ãšèããŸããã ç§ãã¡ã䟿å©ã«çµ±åãããããã°ãã䟿å©ã«ææžåã§ããããã«äººéãèªãããããã³ã«ãéžæããå¿
èŠããããŸããã SwaggerãšããŠãç¥ãããOpen APIæšæºãéžæããŸããã
ãããã³ã«ã®ææžåã®åé¡ã«æ»ããšãSwaggerã§ã¯ãã®åé¡ãè¿
éãã€å®äŸ¡ã«è§£æ±ºã§ããŸãã ãããã¯ãŒã¯ã«ã¯ãSwagger仿§ã®çŸãããã¶ã€ã³ã®éçºè
åãããã¥ã¡ã³ãã®åœ¢åŒã§å€ãã®å®è£
ããããŸãã èŠã€ããããšãã§ãããã®ãã¹ãŠãèŠãŠãæçµçã«swDoc.jsonãå
¥åãšããŠåãå
¥ããåºåã§ãã®ãããª3åã®ããã¥ã¡ã³ããçæããJSã©ã€ãã©ãªã§ããReDocãéžæããŸããïŒ https ://developer.rbk.money/api/ã
å
éšThriftãšå€éšSwaggerã®äž¡æ¹ã®ãããã³ã«ã®éçºãžã®ã¢ãããŒãã¯ãç§ãã¡ã«ãšã£ãŠãŸã£ããåãã§ãã ããã¯éçºã«æéã远å ããŸãããé·æçã«ã¯å ±ãããŸãã
ãŸããå¥ã®éèŠãªåé¡ã解決ããå¿
èŠããããŸãã-ãéã®åŒãåºãã®ãªã¯ãšã¹ããåãå
¥ããã ãã§ãªããããã«ããããéè¡ã𿝿ãã·ã¹ãã ã«éä¿¡ããŸãã
ãªããã匷å¶çã«å®è£
ããããšã¯ããããªãã¯APIã«éä¿¡ãããããå®è¡äžå¯èœãªã¿ã¹ã¯ã§ãã
ãã®ããããããã³ã«ã¢ããã¿ã®æŠå¿µãæãã€ããŠå®è£
ããŸããã ãã©ãããã©ãŒã å
šäœã§åãå
éšãªãã仿§ãå®è£
ãããã1ã€ã®ãã€ã¯ããµãŒãã¹ã§ããã2ã€ç®ã¯ç¹å®ã®éè¡ãŸãã¯å€é»æã«åºæã®å€éšãããã³ã«ã§ãã
ãµãŒãããŒãã£ãšããåãããå¿
èŠããããšãã«ãã®ãããªã¢ããã¿ãŒãäœæãããšãã«çºçããåé¡ã¯ãããŸããŸãªã¹ããŒãªãŒãè±å¯ãªãããã¯ã§ãã ç§ãã¡ã®å®åã§ã¯ããã©ãŒã ã®çãããããªãã¯ãã¡ãããããªããäžãããããã³ã«ã§èª¬æãããŠããããã«ãã®æ©èœãå®è£
ããããšãã§ããŸãããç§ã¯äœã®ä¿èšŒãããŸããããã®ãã¹ãŠã®çããããªãã¯åœŒã«ç¢ºèªãæ±ããŸããã ãŸãããã®ãããªç¶æ³ã¯çããããšã§ã¯ãããŸããããããã«ãµãŒããŒããã®ãŠãŒã¶ãŒåãšãã¹ã¯ãŒãããããŸããããã«è¡ã£ãŠããã¹ãŠèªåã§èšå®ããŠãã ãããã
ç§ãã¡ãæ¯æãããŒãããŒãšçµ±åãããšããç¹ã«è峿·±ãããšã«æ°ã¥ããŸãããæ¯æãããŒãããŒã¯ã以åã«ãã©ãããã©ãŒã ãšçµ±åããç§ãã¡ãéããŠæ¯æããæåãããŸããïŒããã¯ãå€ãã®å Žåãæ¯æãæ¥çã®ããžãã¹ä»æ§ã§ãïŒã ãã¹ãç°å¢ã«å¯Ÿããåœç€Ÿã®ãªã¯ãšã¹ãã«å¿ããŠãããŒãããŒã¯ããã¹ãç°å¢èªäœã¯ãªãããRBCãã€ãŸãåœç€Ÿãé¢äžã§ãããã©ãããã©ãŒã ãšã®çµ±åã®ããã®ãã©ãã£ãã¯ãåŸãããšãã§ãããšåçããŸããã ããããããŒãããŒãéããŠããã€ãŠèªåèªèº«ãšçµ±åãããæ¹æ³ã§ãã
ãããã£ãŠãããŸããŸãªæ¯æãã·ã¹ãã ãä»ã®ãµãŒãããŒãã£ã®å€§èŠæš¡äžŠåæ¥ç¶ãå®è£
ããåé¡ãéåžžã«ç°¡åã«è§£æ±ºããŸããã ã»ãšãã©ã®å Žåããã®ããã«ãã©ãããã©ãŒã ã³ãŒãã倿Žããå¿
èŠã¯ãããŸãããã¢ããã¿ãŒãèšè¿°ããenumã«æ¯æãæ¹æ³ã远å ããã ãã§ãã
ãã®çµæããã®ãããªäœæ¥ã¹ããŒã ãåŸãããŸãã-RBKmoney APIãã€ã¯ããµãŒãã¹ïŒãããã¯Common APIããŸãã¯capi *ãšåŒã³ãŸããäžã®é äºã§èŠãŸããïŒã®å€åŽãèŠãŠãå
¬éSwagger仿§ã«åŸã£ãŠå
¥åããŒã¿ãæ€èšŒããã¯ã©ã€ã¢ã³ããèš±å¯ãããããŒããã£ã¹ãããŸããããã®ã¡ãœããã瀟å
ã®ãªããã³ãŒã«ã«çµã¿èŸŒã¿ã次ã®ãã€ã¯ããµãŒãã¹ã«ãã§ãŒã³ã§ãªã¯ãšã¹ããéä¿¡ããŸãã ããã«ããããã®ãµãŒãã¹ã¯ããã«å¥ã®ãã©ãããã©ãŒã èŠä»¶ãå®è£
ãããã®æè¡ä»æ§ã¯æ¬¡ã®ããã«å®åŒåãããŸããããã·ã¹ãã ã«ã¯åžžã«ç«ãé£Œãæ©äŒãå¿
èŠã§ããã
å€éšã·ã¹ãã ãžã®åŒã³åºããå¿
èŠãªå Žåãå
éšãã€ã¯ããµãŒãã¹ã¯å¯Ÿå¿ãããããã³ã«ã¢ããã¿ãŒã®ãªããã¡ãœãããååŸããç¹å®ã®éè¡ãŸãã¯æ¯æãã·ã¹ãã ã®èšèªã«å€æããŠéä¿¡ããŸãã
ãããã³ã«ã®åŸæ¹äºææ§ã®åé¡
ãã©ãããã©ãŒã ã¯åžžã«é²åããŠãããæ°ããæ©èœã远å ãããå€ãæ©èœã倿ŽãããŠããŸãã ãã®ãããªç¶æ³ã§ã¯ãåŸæ¹äºææ§ã®ãµããŒãã«æè³ããããäŸåãããã€ã¯ããµãŒãã¹ãåžžã«æŽæ°ããå¿
èŠããããŸãã ãããŠãå¿
é ãã£ãŒã«ãããªãã·ã§ã³ã®ãã¹ãŠã«å€ããç¶æ³ãåçŽãªå Žåãäœãããããšãã§ãããå察ã®å Žåã远å ã®ãªãœãŒã¹ãè²»ããå¿
èŠããããŸãã
äžé£ã®å
éšãããã³ã«ã䜿çšãããšãç©äºãç°¡åã«ãªããŸãã æ±ºæžæ¥çã¯ãã£ãã«å€åããªããããæ ¹æ¬çã«æ°ããå¯Ÿè©±æ¹æ³ãããã€ãç»å ŽããŸãã ããšãã°ãç§ãã¡ã®äžè¬çãªã¿ã¹ã¯ãèããŠã¿ãŸããã-æ°ãããããã€ããŒãæ°ããæ¯æãææ®µã«æ¥ç¶ããŸãã ããšãã°ãã«ã¶ãã¹ã¿ã³ã®ãã³ã²ã§æ¯æããåŠçã§ããããŒã«ã«ãŠã©ã¬ããåŠçã ããã¯ãã©ãããã©ãŒã ã®æ°ãããŠã©ã¬ããã§ãããååãšããŠåãQiwiãŠã©ã¬ãããšéãã¯ãããŸããããããã/ããããããã£ã³ã»ã«ã§ããäžæã®èå¥åãšã¡ãœãããå¿
èŠã§ãã
ãããã£ãŠããã¹ãŠã®ãŠã©ã¬ãããããã€ããŒã®ãªãã仿§ã¯æ¬¡ã®ããã«ãªããŸãã
typedef string DigitalWalletID struct DigitalWallet { 1: required DigitalWalletProvider provider 2: required DigitalWalletID id } enum DigitalWalletProvider { qiwi rbkmoney }
æ°ãããæ¯æãæ¹æ³ãæ°ãããŠã©ã¬ããã®åœ¢åŒã§è¿œå ãããšãenumãè£å®ãããŸãã
enum DigitalWalletProvider { qiwi rbkmoney newwallet }
çŸåšããã®ä»æ§ã䜿çšããŠãã¹ãŠã®ãã€ã¯ããµãŒãã¹ã匷åãããªããžããªãŠã£ã¶ãŒããšä»æ§ãåæããCI / CDãä»ããŠããããå±éããŠããŸãã
å€éšãããã³ã«ã¯ããè€éã§ãã Swagger仿§ã®åæŽæ°ã¯ãç¹ã«äžäœäºææ§ããªãå Žåã劥åœãªæéå
ã«é©çšããããšã¯ã»ãšãã©äžå¯èœã§ããããŒãããŒããã©ãããã©ãŒã ã®æŽæ°å°çšã®ç¡æã®éçºè
ãªãœãŒã¹ãä¿æããããšã¯ã»ãšãã©ãããŸããã
ãŸããããã¯åã«äžå¯èœãªå ŽåããããŸãããããã°ã©ããŒãç§ãã¡ã«æçŽãæžããŠå»ãããœãŒã¹ã³ãŒãã圌ãšäžç·ã«æã¡ãã©ã®ããã«äœæ¥ããããããããŸããã
ãã®ãããå€éšãããã³ã«ã®äžäœäºææ§ã®ãµããŒãã«æè³ããŠããŸãã ç§ãã¡ã®ã¢ãŒããã¯ãã£ã§ã¯ãããã¯å°ãç°¡åã§ã-Common APIã®ç¹å®ã®ããŒãžã§ã³ããšã«åå¥ã®ãããã³ã«ã¢ããã¿ãŒã䜿çšãããããå€ãcapiãã€ã¯ããµãŒãã¹ã¯ãã®ãŸãŸã«ããŠãããå¿
èŠã«å¿ããŠãã©ãããã©ãŒã å
ã®äºçްãªéšåã®ã¿ã倿ŽããŸãã ãããã£ãŠããã€ã¯ããµãŒãã¹capi-v1
ã capi-v2
ã capi-v3
ãªã©ã衚瀺ãããæ°žé ã«æ®ããŸãã
capi-v33
ãšãã«äœãèµ·ããããããããå€ãããŒãžã§ã³ã廿¢ããå¿
èŠããããŸãã
ãã®æç¹ã§ãç§ã¯éåžžãMicrosoftãªã©ã®äŒæ¥ãéåžžã«ããçè§£ãå§ããäœåå¹Žãæ©èœããŠãããœãªã¥ãŒã·ã§ã³ã®äžäœäºææ§ããµããŒãããããšã«èŠåŽããŠããŸãã
ã·ã¹ãã ãã«ã¹ã¿ãã€ãºãã
ãããã¯ã®çµããã«ãããžãã¹åºæã®ãã©ãããã©ãŒã èšå®ã®ç®¡çæ¹æ³ã説æããŸãã
æ¯æããè¡ãããšã¯ãèŠããã»ã©ç°¡åã§ã¯ãããŸããã ããžãã¹é¡§å®¢ã¯ãæ¯æãããšã«èšå€§ãªæ°ã®æ¡ä»¶ïŒææ°æããååãšããŠãæå»ã«å¿ããŠå®è£
ãæåããå¯èœæ§ãŸã§ïŒãä»å ããããšèããŠããŸãã ç§ãã¡ã¯ãããžãã¹é¡§å®¢ãçŸåšããã³å°æ¥ã«æãä»ãæ¡ä»¶ã®ã»ããå
šäœãããžã¿ã«åããã¿ã¹ã¯ãèšå®ãããã®ã»ãããæ°ããéå§ããã忝æãã«é©çšããŸãã
ãã®çµæãç¬èªã®DSLãéçºããããšã«ããŸãããããã«äŸ¿å©ãªç®¡çããŒã«ãåºå®ããŠãããžãã¹ã¢ãã«ãæ£ããæ¹æ³ã§èª¬æã§ããããã«ããŸãããæ¯æãã·ã¹ãã ã«åºæã®ãã®ä»ã®ãã®ã
ããšãã°ãããšã¹ãããšMSã®ã«ãŒãã§ååŸããããã«1ïŒ
ã®ææ°æãåãåããã·ã¹ãã å
ã®ã¢ã«ãŠã³ãã«åæ£ããå Žåãæ¬¡ã®ããã«ãã¡ã€ã³ãæ§æããŸãã
{ "cash_flow": { "decisions": [ { "if_": { "any_of": [ { "condition": { "payment_tool": { "bank_card": { "definition": { "payment_system_is": "maestro" } } } } }, { "condition": { "payment_tool": { "bank_card": { "definition": { "payment_system_is": "mastercard" } } } } } ] }, "then_": { "value": [ { "source": { "system": "settlement" }, "destination": { "provider": "settlement" }, "volume": { "share": { "parts": { "p": 1, "q": 100 }, "of": "operation_amount" } }, "details": "1% processing fee" } ] } } ] } }
, , . , JSON. , , , . , , . , CVS/SVN-.
" ". , , , 1%, , , . , , . , .
cvs-like , . , â stateless, , . . .
- . , , . , , .
. , 10 , , .
, , , -, woorl-. - JSON- . - JS, , UX:

, , , .
, , .
, , SaltStack.
, !