ืืขืืจ
- ืืงืฉืช ืชืืืื
- ืืงืฉื-ืชืืืื ืืชืืื
- ืชืืืื ืขื ืืงืฉื
- ืคืจืกื-ืืืจืฉื
- ืืคืื ืคืจืกื-ืืืจืฉื
- ืืืืงืช ืืฉืืืืช
SOA, MSA ืืืืืขืืช
SOA, MSA ืื ืืจืืืืงืืืจืืช ืืขืจืืช ืฉืืืืืจืืช ืืช ืืืืืื ืืื ืืืช ืืขืจืืืช, ืืขืื ืฉืืขืืจืช ืืืืขืืช ืืกืคืงืช ืคืจืืืืืืืืืช ืืืืฉืื ืฉืืื.
ืื ื ืื ืจืืฆื ืืงืื ืืจืืืืงืืืจืช ืืขืจืืช ืืื ืื ืืืจืช. ืื ื ืืขื ืืฉืืืืฉ ืืฉืืืืช ืืืขืืืืช ืืืฉืืืืฉืืืช ืืืืชืจ ืขืืืจ ืคืจืืืงื ืืขืกืง ืกืคืฆืืคืืื. ืืื ืคืจืืืืื ืฉื ืืืจ, ืขืืืฃ ืืืฆืืจ ืืืืงืื ืฉื ืืขืจืืช ืขื ืขืื ืขื ืืจื ื-Unix: ืจืืืืื ืขื ืงืืฉืืจืืืช ืืื ืืืืืช, ืืืจืืื ืขื ืืฉืืืืช ืืืืืืช. ืฉืืืืช API ืืืฆืขืืช ืืช ืืคืขืืืืช ืืคืฉืืืืช ืืืืชืจ ืืืคืฉืจืืืช ืขื ืืฉืืืืช.
ืืขืืจืช ืืืืขืืช ืืื, ืืคื ืฉืืฉื ืืจืื, ืืชืืื ืืืืขืืช. ืืืจืชื ืืขืืงืจืืช ืืื ืืงืื ืืืฉืืื ืืืืขืืช. ืืื ืืืจืืืช ืขื ืืืืฉืงืื ืืฉืืืืช ืืืืข, ืืฆืืจืช ืขืจืืฆืื ืืืืืื ืืืขืืจืช ืืืืข ืืชืื ืืืขืจืืช, ื ืืชืื ืืืืืื ืืื ืืืคืื ืืชืงืืืช ืืจืืช ืืืขืจืืช.
ืืืกืจืื ืฉืื ื ืืคืชืืื ืืื ื ืื ืกืื ืืืชืืจืืช ืื ืืืืืืฃ ืืช rabbitmq. ืืชืืื ืืช ืืขืืงืจืืืช ืฉืื:
- ืืคืฆื.
ื ืืชื ืืืฆืืจ ื ืงืืืืช ืืืืคื ืืื ืฆืืชื ืืืฉืืื, ืงืจืื ืืื ืืืคืฉืจ ืืงืื ืฉืืฉืชืืฉ ืืื. - ืคึผึทืฉืึฐืืึผืช.
ืืชืืงื ืืืืขืืจ ืงืื ื-boilerplate ืืื ืืืืช ืืฉืืืืฉ. - ืืืคืขื ืืืื ืืืชืจ.
ืื ืื ื ืื ืื ืกืื ืืืืืจ ืขื ืืคืื ืงืฆืืื ืืืืช ืฉื rabbitmq, ืืื ืืืืืืฉ ืจืง ืืช ืืฉืืื ืืืืจืืืืืช ืืืชืืืืจืชืืช, ืืืชื ืื ื ืืชืืืืื ื-OTP ืืฆืืจื ืคืฉืืื ืืื ืืืคืฉืจ, ืชืื ืืืขืืจ ืขืืืืืช. - ืึฐืึดืืฉืืึผืช.
ืื ืฉืืจืืช ืืืื ืืฉืื ืชืื ืืืช ืืืืคื ืจืืืช. - ืืืกื ืืขืืฆืื.
- ืืืจืืืืช.
ืืขืืจืช ืืืืืขืืช ืืืื ืขื ืืืคืืืงืฆืื. ืืื ืฉืืขืืืก ืืื, ืืชื ืืืื ืืืขืืืจ ืืช ื ืงืืืืช ืืืืืคื ืืืืื ืืช ืืืืืืช.
REMARK. ืืืืื ืช ืืจืืื ืืงืื, ืืื-ืคืจืืืงืืื ืืชืืืืื ืืืื ืืืขืจืืืช ืืืจืืืืช ืฉื Erlang/Elixir. ืื ืงืื ืืคืจืืืงื ืืืืงื ืืืืืจ ืืื - ืคืจืืืงื ืื. ืืืงืืื, ืฉืืจืืชื ืืืงืจื ืืืืืืื ืืฆืืจื ืืงืกืืืืืช ืืืืฆืขืื ืคืขืืืืช ืคืฉืืืืช ืืืืจืืืืช ืขื ืืฉืืช ื ืคืจืืช. ืืืืฉื ืื ืงื ืืชืืืง ืืช ื-API ืฉื ืื ืืืขืจืืช, ืงื ืืืฆืข ืฉืื ืืืื, ื ืื ืืืชืื ืืืื ื ืืืืืืช ืืืื ืืืจืฆืื.
ืจืืืื ืืืขืจืืช ืืงืืืืื ืืื ืืจืืงืฆืื ืืฉืืจื ืื ืืืืฆืขืืช ืืชืืื. ืื ืงืืืช ืืื ืฉื ืืืืขืืช, ืืื ืฉืืจืืช ืืฉ ืืื ืฉืืื ืืืื:
- ืืชืืื ืืฉืืจืืช.
ืืฉืื ืื, ืืชืืืื ืืืชืืืช ืืืืฆืขืื ืืช ืืฉืืจืืช ืืืืืจืื ืืืืคืขืืื. - ืืฆืืจืช ื ืงืืืช ืืืืคื.
ืืฉืืจืืช ืืืื ืืืฉืชืืฉ ืื ืงืืืช ืืืืคื ืกืืืืช ืฉืฆืืื ื ืืชืฆืืจืช ืืฆืืืช, ืื ืืืฆืืจ ื ืงืืืืช ืืืืคื ืืืืคื ืืื ืื. - ืจืืฉืื ืฉืืจืืช.
ืขื ืื ืช ืฉืืฉืืจืืช ืืฉืจืช ืืงืฉืืช, ืืฉ ืืืืจืฉื ืื ืงืืืช ืืืืืคื. - ืชืคืงืื ืชืงืื.
ืืฉืืจืืช ืืืืฆืจ ืขืืืื ืืืขืืื. - ืืืืืช.
ืืฉื ื 2 ืกืืื ืืืืื ืืคืฉืจืืื: ืจืืื ืืืจืื. ืืืืื ืคืขืืื ืจืืืื, ืืฉืืจืืช ืื ืืชืง ืื ืงืืืช ืืืืืคื ืื ืคืกืง. ืืืฆืื ืืืจืื, ืืขืืจืช ืืืืขืืช ืืืฆืขืช ืืช ืืื ืืกืงืจืืคืื ืืืฉื.
ืื ื ืจืื ืื ืืกืืื, ืืื ืืงืื ืื ืื ืื ืืคืืื. ืืืืืืืช ืงืื ืขื ืืขืจืืช ืืื ืชื ื ืื ืืชืื ืืชืื ืืืช ืืขื ืืืืืจ ืืืชืจ.
ืืืจืกืืช
Exchange point ืืื ืชืืืื ืืขืืจืช ืืืืขืืช ืฉืืืืฉื ืืช ืืืืืืื ืฉื ืืื ืืจืืงืฆืื ืขื ืจืืืืื ืืชืื ืชืื ืืช ืืืืืขืืช. ืืื ืืืืืืืืช ืืืืฆืืืช ืืืื, ืืจืืืืื ืืงืืืืื ืืื ืืจืืงืฆืื ืืืืฆืขืืช ื ืงืืืืช ืืืืคื, ืฉืืฉืืืื ืฉืืื ืืืฆืจ ืืืืขืืช.
ืืคืืกื ืืืืืคื ืืืืขืืช (ืืืจื ืืืจืืคื)
ืืขืืื, ื ืืชื ืืืืง ืืช ืืคืืกื ืืืืืคื ืืฉื ื ืืืืื ืื ืืื ืืืืื ืื. ืืจืืฉืื ืื ืืจืืืื ืขื ืชืืืื ืืืืืขื ื ืื ืกืช, ืืฉื ืืื ืื. ืืืืื ืงืืืกืืช ืืืคืืก ืื-ืืืืื ื ืืืจืืืืงืืืจืช ืฉืจืช-ืืงืื ืืื ืืคืืก Request-response. ืืืื ื ืกืชืื ืขื ืืชืื ืืช ืืืฉืื ืืืื ืฉืื.
ืืงืฉื-ืชืืืื ืื RPC
RPC ืืฉืืฉ ืืืฉืจ ืื ื ืฆืจืืืื ืืงืื ืชืืืื ืืชืืืื ืืืจ. ืชืืืื ืื ืขืฉืื ืืคืขืื ืืืืชื ืฆืืืช ืื ืืืืงื ืืืืฉืช ืืืจืช. ืืืื ืชืจืฉืื ืฉื ืืืื ืืจืืงืฆืื ืืื ืืืงืื ืืฉืจืช ืืืืฆืขืืช ืืืืขืืช.
ืืืืืื ืฉืืขืืจืช ืืืืืขืืช ืืื ืืกืื ืืจืื ืืช ืืืืืืื, ืขืืืจ ืืืงืื ืืืจืืืืื ืืืืืงืช ื-2 ืฉืืืื:
-
ืฉืืื ืืงืฉื
messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).
ืืืจืช โ ืฉื ืืืืืื ืฉื ื ืงืืืช ืืืืืคื
ResponseMatchingTag โ ืชืืืืช ืืงืืืืช ืืขืืืื ืืชืืืื. ืืืฉื, ืืืงืจื ืฉื ืฉืืืืช ืืกืคืจ ืืงืฉืืช ืืืืช ืืฉืืืืืช ืืืฉืชืืฉืื ืฉืื ืื.
RequestDefinition - ืืืฃ ืืืงืฉื
HandlerProcess โ PID ืฉื ืืืืคื. ืชืืืื ืื ืืงืื ืชืืืื ืืืฉืจืช. -
ืืขืื ืืช ืืชืืืื
handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)
ResponsePayload - ืชืืืืช ืฉืจืช.
ืขืืืจ ืืฉืจืช, ืืชืืืื ืืืจืื ืื ื-2 ืฉืืืื:
- ืืชืืื ื ืงืืืช ืืืืืคื
- ืืืคืื ืืืงืฉืืช ืฉืืชืงืืื
ืืืื ื ืืืืฉ ืืช ืืชืื ืืช ืืื ืขื ืงืื. ื ื ืื ืฉืขืืื ื ืืืืฉื ืฉืืจืืช ืคืฉืื ืืืกืคืง ืฉืืืช ืืื ืืืช ืืืืืงืช.
ืงืื ืฉืจืช
ืืืื ื ืืืืจ ืืช ื-API ืฉื ืืฉืืจืืช ื-api.hrl:
%% =====================================================
%% 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 ืืืืขืืช ืฉื 1 MB ืขืืืคืืช ืขื ืืืืขื ืืืืืช ืฉื 1 GB.
ืืืฉืืื 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).
ืืืจืช - ืฉื ื ืงืืืช ืืืืืคื,
ืืคืชื - ืืคืชื ื ืืชืื
ืืขืจืืช ื ืืกืคืืช - ืืืขื
ืืคืื ืคืจืกื-ืืืจืฉื
ืขื ืืื ืืจืืืช ืคืื-ืกืื, ืืชื ืืืื ืืงืื ืืคืืก ื ืื ืืจืืฉืื. ืืขืจื ืืืงืืจืืช ืืืฆืจืื ืื ืืืื ืืืืืช ืฉืื ื ืืืืืืื. ืืืืืจ ืืฆืื ืืงืจื ืขื ืฆืจืื ืืื ืืืกืคืจ ืืงืืจืืช.
ืืคืืก ืืืืงืช ืืฉืืืืช
ืืืขื ืื ืคืจืืืงื ืืจืื ืืืฉืืืืช ืขืืืื ืืืืืืช, ืืืื ืืคืงืช ืืืืืช, ืืกืืจืช ืืืืขืืช ืืืืืืจ ื ืชืื ืื ืืืขืจืืืช ืฆื ืฉืืืฉื. ื ืืชื ืืืืืื ืืงืืืช ืืช ืืชืคืืงื ืฉื ืืืขืจืืช ืืืืฆืขืช ืืฉืืืืช ืืื ืขื ืืื ืืืกืคืช ืืืคืืื. ืื ืื ืฉื ืืชืจ ืื ื ืืื ืืืฆืืจ ืืงืืฅ ืฉื ืืขืืืื ืืืืืง ืืื ืืื ืืฉืืืืช ืืืืคื ืฉืืื.
ืืืื ื ืกืชืื ืขื ืืืฆืืื ืืืชืขืืจืจืื ืืืืฆืขืืช ืืืืืื ืฉื 3 ืืืคืืื. ืื ืืฉืื ืืืืงืช ืืืฉืืืืช ืขืืื ืฉืืืช ืืืื ืืช ืืืืืงื ืืืฆืคืช ืืืืคืืื. ืืืืงื ืกืืืืืืช ืชืืื ืืืจืืืช ืืืืื ืืช, ืืืื ืืื ืืข ืืฆื ืฉื ืืฆืคืช ืืืคืืื, ื ืื ืืก ืืืืื prefetch_limit. ืืชื ืืื ืืืืคืื prefetch_limit ืืื ืข ืืืืคื ืืื ืืงืื ืืช ืื ืืืฉืืืืช.
ืืขืืจืช ืืืืขืืช ืื ืืืช ืชืืจืื ืืขืืืคืืช ืขืืืื. ืืขืืืื ืืงืืืื ืืฉืืืืช ืืฉืื ืืืืขืืช. ืืืฉืืื ืืืืื ืืืฉืืื ืืืฆืืื ืื ืืืืืฉื:
messaging:ack(Tack)
- ื ืงืจื ืื ืืืืืขื ืขืืืืช ืืืฆืืืmessaging:nack(Tack)
- ื ืงืจื ืืื ืืฆืื ืืืจืื. ืืืืจ ืืืืจืช ืืืฉืืื, ืืขืืจืช ืืืืืขืืช ืชืขืืืจ ืืืชื ืืืืคื ืืืจ.
ื ื ืื ืฉืืฉื ืืืจืื ืืชืจืืฉ ืืืื ืขืืืื ืฉืืืฉ ืืฉืืืืช: ืืขืื 1, ืืืืจ ืงืืืช ืืืฉืืื, ืงืจืก ืืืื ืฉืืกืคืืง ืืืืื ืขื ืืืจ ืื ืงืืืช ืืืืืคื. ืืืงืจื ืื, ื ืงืืืช ืืืืืคื ืชืขืืืจ ืืช ืืืฉืืื ืืืืคื ืืืจ ืืืืจ ืคืงืืขืช ืืืื ืืงืฆืื ื-ack. ืืกืืื ืืืฉืื, ืืืคื 3 ื ืืฉ ืืช ืืืฉืืื ืืฉืื ื ืืง; ืืชืืฆืื ืืื, ืืืฉืืื ืืืขืืจื ืื ืืืืคื ืืืจ ืฉืกืืื ืืืชื ืืืฆืืื.
ืกืืืื ืจืืฉืื ื
ืืืกืื ื ืืช ืืื ื ืืื ืืื ืืืกืืกืืืช ืฉื ืืขืจืืืช ืืืืืจืืช ืืืฉืื ื ืืื ื ืืกืืกืืช ืฉื ืืฉืืืืฉ ืืื ื-Erlang/Elixir.
ืขื ืืื ืฉืืืื ืฉื ืืคืืกืื ืืกืืกืืื, ืืชื ืืืื ืืื ืืช ืคืจืืืืืืช ืืืจืืืืช ืืื ืืคืชืืจ ืืขืืืช ืืชืขืืจืจืืช.
ืืืืง ืืืืจืื ืฉื ืืกืืจื, ื ืืื ืกืืืืืช ืืืืืืช ืฉื ืืจืืื ืฉืืจืืชืื, ื ืืชืื ืืืืืื, ืืื ื ืืืจ ืขื ืืฆื ืืคืจืงืื ืฉื ืืืจืืืืช ืืกืืืื ืืช ืชืงืืืช ืฉื ืืขืจืืืช.
ืกืืฃ ืืืืง ืืฉื ื.
ืชืฆืืื
ืืืืจืื ืฉืืืื ื ืืืืฆืขืืช websequencediagrams.com
ืืงืืจ: www.habr.com