éå»ã«
- ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹
- ãªã¯ãšã¹ãã®ãã£ã³ã¯åãããã¬ã¹ãã³ã¹
- ãªã¯ãšã¹ããå«ãã¬ã¹ãã³ã¹
- ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ã
- å転ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ã
- ã¿ã¹ã¯ã®åæ£
SOAãMSAãããã³ã¡ãã»ãŒãžã³ã°
SOAãMSA ã¯ã·ã¹ãã ãæ§ç¯ããããã®ã«ãŒã«ãå®çŸ©ããã·ã¹ãã ã¢ãŒããã¯ãã£ã§ãããã¡ãã»ãŒãžã³ã°ã¯ââãã®å®è£ ã®ããã®ããªããã£ããæäŸããŸãã
ããããã®ã·ã¹ãã ã¢ãŒããã¯ãã£ã宣äŒããã€ããã¯ãããŸãããç§ã¯ãç¹å®ã®ãããžã§ã¯ããããžãã¹ã«æãå¹æçã§åœ¹ç«ã€å®è·µæ¹æ³ã䜿çšããããšã«è³æã§ããã©ã®ãããªãã©ãã€ã ãéžæããã«ããŠããUnix æ¹åŒã念é ã«çœ®ããŠã·ã¹ãã ãããã¯ãäœæããããšããå§ãããŸããã€ãŸããã³ã³ããŒãã³ãã¯æ¥ç¶æ§ãæå°éã§ãåã ã®ãšã³ãã£ãã£ãæ åœããŸãã API ã¡ãœããã¯ããšã³ãã£ãã£ã«å¯ŸããŠæãåçŽãªã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
ã¡ãã»ãŒãžã³ã°ã¯ââãååã瀺ãããã«ãã¡ãã»ãŒãž ãããŒã«ãŒã§ãããã®äž»ãªç®çã¯ã¡ãã»ãŒãžãéåä¿¡ããããšã§ããæ
å ±ãéä¿¡ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãã·ã¹ãã å
ã§æ
å ±ãéä¿¡ããããã®è«çãã£ãã«ã®åœ¢æãã«ãŒãã£ã³ã°ãšãã©ã³ã·ã³ã°ãããã³ã·ã¹ãã ã¬ãã«ã§ã®é害åŠçãæ
åœããŸãã
ç§ãã¡ãéçºããŠããã¡ãã»ãŒãžã³ã°ã¯ââãrabbitmq ãšç«¶åããã眮ãæãããããããšãããã®ã§ã¯ãããŸããããã®äž»ãªç¹åŸŽ:
- ååžã
Exchange ãã€ã³ãã¯ããã¹ãŠã®ã¯ã©ã¹ã¿ãŒ ããŒãäžã§ãããã䜿çšããã³ãŒãã®ã§ããã ãè¿ãã«äœæã§ããŸãã - ã·ã³ãã«ã
å®åã³ãŒãã®æå°åãšäœ¿ããããã«éç¹ã眮ããŸãã - ããããæ§èœã
ããã§ã¯ãrabbitmq ã®æ©èœãç¹°ãè¿ãã€ããã¯ãããŸããããã¢ãŒããã¯ãã£å±€ãšãã©ã³ã¹ããŒãå±€ã®ã¿ã匷調ããã³ã¹ããæå°éã«æããããã«ããããã®å±€ãå¯èœãªéãåçŽã« OTP ã«é©åãããŸãã - æè»æ§ã
åãµãŒãã¹ã¯ãå€ãã®äº€æãã³ãã¬ãŒããçµã¿åãããããšãã§ããŸãã - èšèšã«ãã埩å åã
- ã¹ã±ãŒã©ããªãã£ã
ã¡ãã»ãŒãžã³ã°ã¯ââã¢ããªã±ãŒã·ã§ã³ãšãšãã«æé·ããŸããè² è·ãå¢å ããå Žåã亀æãã€ã³ããåã ã®ãã·ã³ã«ç§»åã§ããŸãã
åè ã³ãŒãæ§æã®èŠ³ç¹ããèŠããšãã¡ã¿ãããžã§ã¯ãã¯è€é㪠Erlang/Elixir ã·ã¹ãã ã«é©ããŠããŸãããã¹ãŠã®ãããžã§ã¯ã ã³ãŒã㯠XNUMX ã€ã®ãªããžããªãã€ãŸãã¢ã³ãã¬ã© ãããžã§ã¯ãã«é 眮ãããŸããåæã«ããã€ã¯ããµãŒãã¹ã¯æ倧éã«åé¢ãããå¥åã®ãšã³ãã£ãã£ãæ åœããåçŽãªæäœãå®è¡ããŸãããã®ã¢ãããŒãã䜿çšãããšãã·ã¹ãã å šäœã® API ã®ä¿å®ã容æã«ãªããå€æŽã容æã«ãªããåäœãã¹ããçµ±åãã¹ãã®äœæã容æã«ãªããŸãã
ã·ã¹ãã ã³ã³ããŒãã³ãã¯ãçŽæ¥ãŸãã¯ãããŒã«ãŒãä»ããŠå¯Ÿè©±ããŸããã¡ãã»ãŒãžã³ã°ã®èŠ³ç¹ããèŠããšãåãµãŒãã¹ã«ã¯ããã€ãã®ã©ã€ã ãã§ãŒãºããããŸãã
- ãµãŒãã¹ã®åæåã
ãã®æ®µéã§ã¯ããµãŒãã¹ãå®è¡ããããã»ã¹ãšäŸåé¢ä¿ãæ§æãããèµ·åãããŸãã - 亀æãã€ã³ãã®äœæã
ãµãŒãã¹ã¯ãããŒãæ§æã§æå®ãããéçãªäº€æãã€ã³ãã䜿çšããããšãã亀æãã€ã³ããåçã«äœæããããšãã§ããŸãã - ãµãŒãã¹ç»é²ã
ãµãŒãã¹ããªã¯ãšã¹ãã«å¯Ÿå¿ããã«ã¯ã亀æãã€ã³ãã«ãµãŒãã¹ãç»é²ããå¿ èŠããããŸãã - æ£åžžã«æ©èœããŠããŸãã
ãã®ãµãŒãã¹ã¯æçãªäœåãçã¿åºããŸãã - ã·ã£ããããŠã³ã
ã·ã£ããããŠã³ã«ã¯éåžžãšç·æ¥ã® 2 çš®é¡ããããŸããéåžžã®éçšäžããµãŒãã¹ã¯äº€æãã€ã³ãããåæãããåæ¢ããŸããç·æ¥äºæ ã§ã¯ãã¡ãã»ãŒãžã³ã°ã«ãã£ãŠãã§ã€ã«ãªãŒã㌠ã¹ã¯ãªããã® XNUMX ã€ãå®è¡ãããŸãã
ããªãè€éã«èŠããŸãããã³ãŒãã¯ããã»ã©æããã®ã§ã¯ãããŸãããã³ã¡ã³ãä»ãã®ã³ãŒãäŸã¯ãå°ãåŸã®ãã³ãã¬ãŒãã®åæã§ç€ºãããŸãã
亀æã«ã€ããŠ
Exchange ãã€ã³ãã¯ãã¡ãã»ãŒãžã³ã° ãã³ãã¬ãŒãå ã®ã³ã³ããŒãã³ããšã®å¯Ÿè©±ããžãã¯ãå®è£ ããã¡ãã»ãŒãžã³ã° ããã»ã¹ã§ãã以äžã«ç€ºããã¹ãŠã®äŸã§ã¯ãã³ã³ããŒãã³ãã¯äº€æãã€ã³ããéããŠå¯Ÿè©±ãããã®çµã¿åããã«ãã£ãŠã¡ãã»ãŒãžã³ã°ã圢æãããŸãã
ã¡ãã»ãŒãžäº€æãã¿ãŒã³ (MEP)
äžççã«ã亀æãã¿ãŒã³ã¯åæ¹åãšäžæ¹åã«åé¡ã§ããŸããåè ã¯åä¿¡ã¡ãã»ãŒãžãžã®å¿çãæå³ããŸãããåŸè ã¯ããã§ã¯ãããŸãããã¯ã©ã€ã¢ã³ã/ãµãŒã㌠ã¢ãŒããã¯ãã£ã«ãããåæ¹åãã¿ãŒã³ã®å žåçãªäŸã¯ãèŠæ±/å¿çãã¿ãŒã³ã§ãããã³ãã¬ãŒããšãã®å€æŽãèŠãŠã¿ãŸãããã
ãªã¯ãšã¹ã/ã¬ã¹ãã³ã¹ãŸã㯠RPC
RPC ã¯ãå¥ã®ããã»ã¹ããå¿çãåãåãå¿ èŠãããå Žåã«äœ¿çšãããŸãããã®ããã»ã¹ã¯åãããŒãäžã§å®è¡ãããŠããããå¥ã®å€§éžã«ããå¯èœæ§ããããŸãã以äžã¯ãã¡ãã»ãŒãžã³ã°ãä»ããã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®å¯Ÿè©±ã®å³ã§ãã
ã¡ãã»ãŒãžã³ã°ã¯ââå®å šã«éåæã§ãããããã¯ã©ã€ã¢ã³ãã«ãšã£ãŠäº€æ㯠2 ã€ã®ãã§ãŒãºã«åå²ãããŸãã
-
ãªã¯ãšã¹ãã®éä¿¡
messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).
å¿åè ãš â 亀æãã€ã³ãã®äžæã®åå
å¿çãããã³ã°ã¿ã° - å¿çãåŠçããããã®ããŒã«ã«ã©ãã«ãããšãã°ãç°ãªããŠãŒã¶ãŒã«å±ããè€æ°ã®åäžã®ãªã¯ãšã¹ããéä¿¡ããå Žåã§ãã
ãªã¯ãšã¹ãå®çŸ© - ãªã¯ãšã¹ãæ¬æ
ãã³ãã©ãŒããã»ã¹ - ãã³ãã©ãŒã® PIDããã®ããã»ã¹ã¯ãµãŒããŒããå¿çãåãåããŸãã -
å¿çãåŠçããŠããŸã
handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)
å¿çãã€ããŒã - ãµãŒããŒã®å¿çã
ãµãŒããŒã®å Žåããããã»ã¹ã¯ 2 ã€ã®ãã§ãŒãºã§æ§æãããŸãã
- 亀æãã€ã³ãã®åæå
- åä¿¡ãããªã¯ãšã¹ãã®åŠç
ãã®ãã³ãã¬ãŒããã³ãŒãã§èª¬æããŠã¿ãŸããããåäžã®æ£ç¢ºãªæå»ã¡ãœãããæäŸããåçŽãªãµãŒãã¹ãå®è£ ããå¿ èŠããããšããŸãã
ãµãŒããŒã³ãŒã
api.hrl ã§ãµãŒãã¹ API ãå®çŸ©ããŸãããã
%% =====================================================
%% entities
%% =====================================================
-record(time, {
unixtime :: non_neg_integer(),
datetime :: binary()
}).
-record(time_error, {
code :: non_neg_integer(),
error :: term()
}).
%% =====================================================
%% methods
%% =====================================================
-record(time_req, {
opts :: term()
}).
-record(time_resp, {
result :: #time{} | #time_error{}
}).
time_controller.erl ã§ãµãŒãã¹ ã³ã³ãããŒã©ãŒãå®çŸ©ããŸããã
%% РпÑОЌеÑе пПказаМ ÑПлÑкП зМаÑОЌÑй кПЎ. ÐÑÑавОв егП в ÑаблПМ gen_server ЌПжМП пПлÑÑОÑÑ ÑабПÑОй ÑеÑвОÑ.
%% ОМОÑОалОзаÑÐžÑ gen_server
init(Args) ->
%% пПЎклÑÑеМОе к ÑПÑке ПбЌеМа
messaging:monitor_exchange(req_resp, ?EXCHANGE, default, self())
{ok, #{}}.
%% ПбÑабПÑка ÑПбÑÑÐžÑ Ð¿ÐŸÑеÑО ÑвÑзО Ñ ÑПÑкПй ПбЌеМа. ÐÑП же ÑПбÑÑОе пÑОÑ
ПЎОÑ, еÑлО ÑПÑка ПбЌеМа еÑе Ме запÑÑÑОлаÑÑ.
handle_info(#exchange_die{exchange = ?EXCHANGE}, State) ->
erlang:send(self(), monitor_exchange),
{noreply, State};
%% ПбÑабПÑка API
handle_info(#time_req{opts = _Opts}, State) ->
messaging:response_once(Client, #time_resp{
result = #time{ unixtime = time_utils:unixtime(now()), datetime = time_utils:iso8601_fmt(now())}
});
{noreply, State};
%% завеÑÑеМОе ÑабПÑÑ gen_server
terminate(_Reason, _State) ->
messaging:demonitor_exchange(req_resp, ?EXCHANGE, default, self()),
ok.
ã¯ã©ã€ã¢ã³ãã³ãŒã
ãµãŒãã¹ã«ãªã¯ãšã¹ããéä¿¡ããã«ã¯ãã¯ã©ã€ã¢ã³ãã®ã©ãããã§ãã¡ãã»ãŒãžã³ã° ãªã¯ãšã¹ã API ãåŒã³åºãããšãã§ããŸãã
case messaging:request(?EXCHANGE, tag, #time_req{opts = #{}}, self()) of
ok -> ok;
_ -> %% repeat or fail logic
end
åæ£ã·ã¹ãã ã§ã¯ãã³ã³ããŒãã³ãã®æ§æã倧ããç°ãªãå¯èœæ§ãããããªã¯ãšã¹ãã®æç¹ã§ã¯ã¡ãã»ãŒãžã³ã°ããŸã éå§ãããŠããªããããµãŒãã¹ ã³ã³ãããŒã©ãŒããªã¯ãšã¹ããåŠçããæºåãã§ããŠããªãå¯èœæ§ããããŸãããããã£ãŠãã¡ãã»ãŒãžã³ã°ã®å¿çã確èªãã倱æããå Žåã«å¯ŸåŠããå¿
èŠããããŸãã
éä¿¡ãæåãããšãã¯ã©ã€ã¢ã³ãã¯ãµãŒãã¹ããå¿çãŸãã¯ãšã©ãŒãåãåããŸãã
handle_info ã§äž¡æ¹ã®ã±ãŒã¹ãåŠçããŸãããã
handle_info(#'$msg'{exchange = ?EXCHANGE, tag = tag, message = #time_resp{result = #time{unixtime = Utime}}}, State) ->
?debugVal(Utime),
{noreply, State};
handle_info(#'$msg'{exchange = ?EXCHANGE, tag = tag, message = #time_resp{result = #time_error{code = ErrorCode}}}, State) ->
?debugVal({error, ErrorCode}),
{noreply, State};
ãªã¯ãšã¹ãã®ãã£ã³ã¯åãããã¬ã¹ãã³ã¹
巚倧ãªã¡ãã»ãŒãžã®éä¿¡ã¯é¿ããã®ãæåã§ããã·ã¹ãã å šäœã®å¿çæ§ãšå®å®ããåäœã¯ããã«äŸåããŸããã¯ãšãªãžã®å¿çã倧éã®ã¡ã¢ãªãæ¶è²»ããå Žåãå¿çãè€æ°ã®éšåã«åå²ããããšãå¿ é ã§ãã
ãã®ãããªå Žåã®äŸãããã€ãæããŠã¿ãŸãããã
- ã³ã³ããŒãã³ãã¯ãã¡ã€ã«ãªã©ã®ãã€ã㪠ããŒã¿ã亀æããŸããå¿çãå°ããªéšåã«åå²ãããšããããããµã€ãºã®ãã¡ã€ã«ãå¹ççã«åŠçããã¡ã¢ãª ãªãŒããŒãããŒãåé¿ã§ããŸãã
- ãªã¹ããããšãã°ãããŒã¿ããŒã¹å ã®å·šå€§ãªããŒãã«ãããã¹ãŠã®ã¬ã³ãŒããéžæããããããå¥ã®ã³ã³ããŒãã³ãã«è»¢éããå¿ èŠããããŸãã
ç§ã¯ãããã®åå¿ãæ©é¢è»ãšåŒãã§ããŸãããããã®å Žåãã1024 MB ã®ã¡ãã»ãŒãžã 1 åéä¿¡ããã»ããã1 GB ã®ã¡ãã»ãŒãžã XNUMX ã€éä¿¡ãããããåªããŠããŸãã
Erlang ã¯ã©ã¹ã¿ãŒã§ã¯ãå¿çã亀æãã€ã³ãããã€ãã¹ããŠçŽã¡ã«åä¿¡è ã«éä¿¡ãããããã亀æãã€ã³ããšãããã¯ãŒã¯ã®è² è·ã軜æžããããšããè¿œå ã®å©ç¹ãåŸãããŸãã
ãªã¯ãšã¹ããå«ãã¬ã¹ãã³ã¹
ããã¯ããã€ã¢ãã° ã·ã¹ãã ãæ§ç¯ããããã® RPC ãã¿ãŒã³ã®ããªãçããå€æŽã§ãã
ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ã (ããŒã¿åæ£ããªãŒ)
ã€ãã³ãé§ååã·ã¹ãã ã¯ãããŒã¿ã®æºåãæŽããšããã«æ¶è²»è
ã«ããŒã¿ãé
ä¿¡ããŸãããããã£ãŠãã·ã¹ãã ã¯ãã« ã¢ãã«ãããŒãªã³ã° ã¢ãã«ãããããã·ã¥ ã¢ãã«ã®åŸåãé«ããªããŸãããã®æ©èœã䜿çšãããšãåžžã«ããŒã¿ãèŠæ±ããŠåŸ
æ©ããããšã«ãããªãœãŒã¹ã®ç¡é§ãåé¿ã§ããŸãã
ãã®å³ã¯ãç¹å®ã®ãããã¯ã«ãµãã¹ã¯ã©ã€ãããŠããã³ã³ã·ã¥ãŒãã«ã¡ãã»ãŒãžãé
åžããããã»ã¹ã瀺ããŠããŸãã
ãã®ãã¿ãŒã³ã䜿çšããå žåçãªäŸã¯ãç¶æ ã®ååžã§ããã³ã³ãã¥ãŒã¿ãŒ ã²ãŒã ã®ã²ãŒã äžçãååŒæã®åžå ŽããŒã¿ãããŒã¿ ãã£ãŒãã®æçšãªæ å ±ã§ãã
å å ¥è ã³ãŒããèŠãŠã¿ãŸãããã
init(_Args) ->
%% пПЎпОÑÑваеЌÑÑ ÐœÐ° ПбЌеММОк, клÑÑ = key
messaging:subscribe(?SUBSCRIPTION, key, tag, self()),
{ok, #{}}.
handle_info(#exchange_die{exchange = ?SUBSCRIPTION}, State) ->
%% еÑлО ÑПÑка ПбЌеМа МеЎПÑÑÑпМа, ÑП пÑÑаеЌÑÑ Ð¿ÐµÑепПЎклÑÑОÑÑÑÑ
messaging:subscribe(?SUBSCRIPTION, key, tag, self()),
{noreply, State};
%% ПбÑабаÑÑваеЌ пÑОÑеЎÑОе ÑППбÑеМОÑ
handle_info(#'$msg'{exchange = ?SUBSCRIPTION, message = Msg}, State) ->
?debugVal(Msg),
{noreply, State};
%% пÑО ПÑÑаМПвке пПÑÑебОÑÐµÐ»Ñ - ПÑклÑÑаеЌÑÑ ÐŸÑ ÑПÑкО ПбЌеМа
terminate(_Reason, _State) ->
messaging:unsubscribe(?SUBSCRIPTION, key, tag, self()),
ok.
ãœãŒã¹ã¯é¢æ°ãåŒã³åºããŠãéœåã®è¯ãå Žæã«ã¡ãã»ãŒãžããããªãã·ã¥ã§ããŸãã
messaging:publish_message(Exchange, Key, Message).
å¿åè
ãš - 亀æãã€ã³ãã®ååã
ã㌠- ã«ãŒãã£ã³ã°ããŒ
ã¡ãã»ãŒãž - ãã€ããŒã
å転ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ã
pub-subãå±éãããšãã®ã³ã°ã«äŸ¿å©ãªãã¿ãŒã³ãååŸã§ããŸãããœãŒã¹ãšã³ã³ã·ã¥ãŒãã®ã»ããã¯ãŸã£ããç°ãªãå ŽåããããŸãããã®å³ã¯ãXNUMX 人ã®ã³ã³ã·ã¥ãŒããšè€æ°ã®ãœãŒã¹ã®ã±ãŒã¹ã瀺ããŠããŸãã
ã¿ã¹ã¯ã®åæ£ãã¿ãŒã³
ã»ãŒãã¹ãŠã®ãããžã§ã¯ãã«ã¯ãã¬ããŒãã®çæãéç¥ã®é ä¿¡ããµãŒãããŒã㣠ã·ã¹ãã ããã®ããŒã¿ã®ååŸãªã©ã®é 延åŠçã¿ã¹ã¯ãå«ãŸããŸãããããã®ã¿ã¹ã¯ãå®è¡ããã·ã¹ãã ã®ã¹ã«ãŒãããã¯ããã³ãã©ãŒãè¿œå ããããšã§ç°¡åã«æ¡åŒµã§ããŸããæ®ã£ãŠããã®ã¯ãããã»ããµã®ã¯ã©ã¹ã¿ã圢æããããã»ããµéã§ã¿ã¹ã¯ãåçã«åæ£ããããšã ãã§ãã
3 ã€ã®ãã³ãã©ãŒã®äŸã䜿çšããŠãçºçããç¶æ³ãèŠãŠã¿ãŸããããã¿ã¹ã¯åæ£ã®æ®µéã§ããåæ£ã®å ¬å¹³æ§ããã³ãã©ã®ãªãŒããŒãããŒã®åé¡ãçããŸããã©ãŠã³ãããã³åæ£ã¯å ¬å¹³æ§ãä¿ã¡ããã³ãã©ãŒã®ãªãŒããŒãããŒã®ç¶æ³ãé¿ããããã«ãå¶éãå°å ¥ããŸãã ããªãã§ããå¶éãéæž¡ç¶æ ã§ã¯ ããªãã§ããå¶é XNUMX ã€ã®ãã³ãã©ãŒããã¹ãŠã®ã¿ã¹ã¯ãåä¿¡ã§ããªããªããŸãã
ã¡ãã»ãŒãžã³ã°ã¯ââãã¥ãŒãšåŠçã®åªå é äœã管çããŸããããã»ããµã¯ã¿ã¹ã¯ãå°çãããšãããåãåããŸããã¿ã¹ã¯ã¯æ£åžžã«å®äºããå Žåãããã°ã倱æããå ŽåããããŸãã
messaging:ack(Tack)
- ã¡ãã»ãŒãžãæ£åžžã«åŠçãããå Žåã«åŒã³åºãããŸãmessaging:nack(Tack)
- ãã¹ãŠã®ç·æ¥äºæ ã«åŒã³åºãããŸããã¿ã¹ã¯ãè¿ããããšãã¡ãã»ãŒãžã³ã°ã¯ââãããå¥ã®ãã³ãã©ãŒã«æž¡ããŸãã
1 ã€ã®ã¿ã¹ã¯ã®åŠçäžã«è€éãªé害ãçºçãããšããŸããããã»ããµ 3 ã¯ãã¿ã¹ã¯ãåä¿¡ããåŸã亀æãã€ã³ãã«äœãå ±åããæéããªããŸãŸã¯ã©ãã·ã¥ããŸããããã®å Žåã亀æãã€ã³ãã¯ãack ã¿ã€ã ã¢ãŠããçµéããåŸãã¿ã¹ã¯ãå¥ã®ãã³ãã©ãŒã«è»¢éããŸããäœããã®çç±ã§ãã³ãã©ãŒ XNUMX ãã¿ã¹ã¯ãæŸæ£ããNack ãéä¿¡ãããããã¿ã¹ã¯ãå¥ã®ãã³ãã©ãŒã«è»¢éãããã¿ã¹ã¯ã¯æ£åžžã«å®äºããŸããã
äºåçµæ
ç§ãã¡ã¯åæ£ã·ã¹ãã ã®åºæ¬çãªæ§æèŠçŽ ãã«ããŒããErlang/Elixir ã§ã®ãããã®äœ¿çšã«ã€ããŠã®åºæ¬çãªç解ãç²åŸããŸããã
åºæ¬çãªãã¿ãŒã³ãçµã¿åãããããšã§ãæ°ããªåé¡ã解決ããããã®è€éãªãã©ãã€ã ãæ§ç¯ã§ããŸãã
ã·ãªãŒãºã®æåŸã®éšåã§ã¯ããµãŒãã¹ã®ç·šæãã«ãŒãã£ã³ã°ããã©ã³ã·ã³ã°ã«é¢ããäžè¬çãªåé¡ãæ€èšããã·ã¹ãã ã®ã¹ã±ãŒã©ããªãã£ãšãã©ãŒã«ã ãã¬ã©ã³ã¹ã®å®éçãªåŽé¢ã«ã€ããŠã説æããŸãã
第äºéšã®çµããã
ãã©ã
websequencediagrams.com ã䜿çšããŠäœæãããã€ã©ã¹ã
åºæïŒ habr.com