
αααα»αβα’ααΈαααΆα ααΎαααΆααα·αα·αααααΎαααΌαααααΆαααααΉαααααΉααααΈααααααΆααααααααααααα·ααααα ααΆααααααα αΎαααΎααααΈαα·ααΆαα’αααΈααα αΌααα·αααααα αα·ααΈααΎααααΈα’αα»αααααααααααα Erlang/Elixir αααααΆαααααα·αααα αα·αααααΆαααααΎααΆααα αααα»ααα½αααΆα
- ααααΎ - ααΆαααααΎααα
- ααΆαβααααΎαβααβααΆαβααΆαβααααΎβαα»α
- ααααΎαααααΆαα½αααααΎ
- ααααα»ααα-ααΆα
- ααααα»ααααααα αααΆα - ααΆα
- ααΆαα ααα αΆαααΆααα·α αα
SOA, MSA αα·αααΆαααααΎααΆα
SOA, MSA ααΊααΆααααΆααααααααααααααααααααααααα αααΆαααααααΆααααααααααα’ααΆα ααααααααΆαααααΎααΆααααααααΌααα»ααααααααααΆααααΆαα’αα»αααααααααα½αααα
αααα»ααα·αα ααααααααααααΆαααα α¬ααααΆαααααααααααααααααααααα αααα»αααΊαααααΆααααΆαααααΎααααΆααααΆαα’αα»αααααααααΆαααααα·αααααΆα αα·αααΆααααααααααααα»ααααααΆαααααααα αα·αα’αΆααΈαααααααΆααααΆαααα½αα α’αααΈααααααααααΎαααααΎαααΎαααααΌ ααΆααΆααΆααααααΎααααα»αααΆααααααΎααααα»αααααααααααααααααΉαααΎαααΎ Unix-way: αααΆαααΆαα»αααααΆαααΆααααααΆαααα·α αα½α αααααα½ααα»αααααΌαα ααααα’αααααΆαααΈαα½ααα αα·ααΈααΆααααα API α’αα»αααααααααααΆαααΆαααααααα»ααααα’αΆα ααααΎαα ααΆαααΆαα½αα’αααααΆαα
ααΆαααααΎααΆαααΊααΌα
ααααααααααΆααααα αΆα αααα½ααααααΆαααΆαα αααααααααααΆααααααααΆααΊααα½α αα·αααααΎααΆαα ααΆααα½ααα»αααααΌαα
ααααα
ααα»α
αααααΆαααααααΆααααΆααααααΌαααααααΆα ααΆααααααΎαααΆαααα‘αΌααΈαααααααΆααααΆααααααΌαααααααΆααα
αααα»ααααααααα ααΆααααααααααΌα αα·ααα»αααααΆα ααααΌα
ααΆααΆααααααααΆαααα α»ααα
ααααα·αααααααααα
ααΆαααααΎααΆααααααΎααααα»αα’αα·ααααααΊαα·ααααααααΆααΆαααααα½αααααααααΆαα½α α¬αααα½α rabbitmq αααααα αααααααα·αααα
ααααααααααΆ:
- ααΆαα
ααα
αΆαα
α ααα»α ααααΌαααααΆααα’αΆα ααααΌαααΆααααααΎααα ααΎααααΆααα αααααααΆααα’αα α²αααα·ααααα»αααΆααααα’αΆα ααααΎαα ααΆαα ααααααΌααααααααΎαα½αααΆα - ααΆαααΆααααα
αααααααΎααΆαααΆαααααααααΌα boilerplate αα·αααΆαααΆααααα½αααααΆαααααΎααααΆααα - ααΆαααααααααΆαααααααααΎαα
ααΎααα·αααααΆααΆαααααΎαα»αααΆααααα rabbitmq α‘αΎααα·ααα ααα»ααααααααα αααααααΆααααααΆαααααααα αα·αααΆαααΉααααααΌα αααααΎαααααΉα OTP ααΆααααα’αΆα ααααΎααΆα ααΆαααααααααΆαα αααΆααα·α αααα»αα - ααΆαααααααα
ααααΆααααααΈαα½ααα’αΆα αα½ααααα αΌαααααΆααΌαααααΌααααΆααααααΌαααΆα αααΎαα - ααΆααααααΉαααΆααα ααΆα
- ααααααΆαααααΎααΆαααααααΆαα
ααΆαααααΎααΆαααΈαα ααααΎαααΆαα½ααααααα·ααΈα αα ααααααααααα»αααΎαα‘αΎα α’αααα’αΆα ααααΆααααΈα ααα»α ααααΌααα αααΆαααΈαααΈαα½ααα
αα»αααααααΆα αα αααα»αααααααααααααΆααααα αααΌα ααααααααααΆααΊααααα’αααααΆαααααααααα Erlang/Elixir αααα»αααααΆαα αααααΌαααααααααΆααα’ααααΆαααΈααΆαααα αααα»αααααΆαααα½α - αααααααααααα αααα»ααααααΆαα½αααααΆααα ααααΆααΈααααΌααααΌαααΆααααααΆα αααΈααααΆααΆα’αα·ααααΆ αα·αα’αα»ααααααααα·ααααα·ααΆαααΆαααααααααα½ααα»αααααΌαα ααααα’αααααΆαααΆα ααααα‘αααα½αα ααΆαα½αααΉααα·ααΈααΆααααααααααΆααΆααααα½ααααα»αααΆααααααΆ API ααααααααααααΆααααΌαααΆααΆααααα½ααααα»αααΆαααααΎααΆαααααΆααααααΌαααΆααΆααααα½ααααα»αααΆααααααα―αααΆαα·αααΆαααααΎααααααα½ααααα αΌαα
ααΆαα»ααααααααααααααααΆαα’αααααααααααααααΆαα α¬ααΆαααααααα½ααααααΆαα ααΆαααααααααααΆαααααΎααΆα ααααΆααααααΈαα½ααααΆαααααΆααααΆαααΈαα·αααΆα αααΎαα
- ααΆαα
αΆααααααΎαααααΆααααα
αα ααααΆααααΆαααα ααααΎαααΆα αα·αααΆαα’αΆααααααααααααα·ααααα·ααααΆααααααααΌαααΆαααααααα ααΆαααααααα αα·αα αΆααααααΎαα - ααΆααααααΎαα
ααα»α
ααααΆααααααΌαα
ααααΆααααα’αΆα ααααΎα ααα»α ααααΆααααααΌααα·αα·αααααααααΆααααααΆαααα αααα»αααΆαααααααα ααΆααααααααααααΆαα α¬αααααΎαα ααα»α ααααΆααααααΌαααΆαααααα - ααΆαα
α»ααααααααααΆααααα
ααΎααααΈα±ααααααΆαααααααααΎααΆαααααΎαα»αααΆααααΌαααα α»αααααααα α ααα»α ααααΌαααααΆααα - ααααΎαααΆαααααααΆα
ααααΆαααααααααΎαααΆαααΆαααΆαααααααααα - αα·αα
ααΆα 2 ααααααααααΆααα·ααααα’αΆα ααααΎαα ααΆα: ααααααΆαα·ααααααααααααααΆααα ααα‘α»ααααααααα·ααααα·ααΆαααααααΆ ααααΆααααΌαααΆαααααΆα αα ααααΈα ααα»α ααααΌα α αΎααααα αααα»αβααααΆαααΆαβα’αΆαααα ααΆαβααααΎβααΆαβααααΎαααΆαβααααααΈαβαα½αβαααβαααΆαααα
ααΆααΎααα αααα»αααααΆαααΆαα ααα»ααααααΌααα·ααα½αα±ααααααΆα ααΆααα’αααααααα α§ααΆα αααααΌαααΆαα½αααα·αααααααΉαααααΌαααΆααααααα±αααα αααα»αααΆααα·ααΆαααααααΌαα ααααααααααααα·α α
ααΆαααααΆααααααΌα
α ααα»α ααααΆααααααΌαααΊααΆααααΎαααΆαααααΎααΆααααα’αα»αααααααααα·ααααΆααα’ααααααααααΆαα½ααααΆαααΆαα»αα αααα»αααααΌααααΎααΆαα αα αααα»αα§ααΆα αααααΆααα’αααααααΆααααα αΆαααΆαααααα αααΆαααΆαα»ααΆαα’ααααααααααΆααααα ααα»α ααααΆααααααΌα αααααΆααΆααα½ααααα αΌαααααΆααααααααααααΆαααααΎααΆαα
ααααΌααααΆααααααΌαααΆα (MEPs)
ααΆααα ααααΌααααΆαααααΆααααααΌαα’αΆα αααα ααααΆααΈαααααΌα αα·αααααΌααα½αα α’ααΈαβααααΆαβα±ααβααΆαβααααΎαβααβαα βααΉαβααΆαβα αΌαβαα½α, αααααΆααβααβαα·αβααααΎβα α§ααΆα ααααα»ααΆαααααααΆαααΈαααααΌααα αααα»αααααΆαααααααααααΆαααΈαααααα-αααΆαααΈααα ααΊααΆααααΌααααΎαααααααΎα ααΌααααα‘ααααΎαααααΌ αα·αααΆαααααααααααααΆα
ααααΎαααααΎααα α¬ RPC
RPC ααααΌαααΆαααααΎαα ααααααααΎαααααΌαααΆαααα½αααΆαααααΎαααααΈααααΎαααΆαααααααααα ααααΎαααΆααααα’αΆα ααααΎαααΆααα ααΎ node ααΌα ααααΆ α¬αα ααΎααααΈαααααααααα ααΆαααααααααααΊααΆααααΆααααΆαααα’αααααααααααΆαα’αα·αα·αα αα·α αααΆαααΈααααααΎ ααΆααααααΆαα

αααααΆαααΆαααααΎααΆαααΊαα·αααααΆαααααααΆαααααα»α αααααΆααα’αα·αα·αα ααΆαααααΆααααααΌαααααΌαααΆααααα ααααΆ 2 ααααΆααααΆαα
αααα»αααααΎααααΎ
messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).ααΆαααααΆααααααΌα - ααααααααα½ααααααα ααα»α ααααΆααααααΌα
ResponseMatchingTag - ααααΆαααΌαααααΆααααααΆααααααΎαααΆαααΆαααααΎαααα α§ααΆα ααα αα αααα»αααααΈααααΆαααααΎααααΎααΌα ααααΆααααα·αααΆα αααΎααααααΆαααααα·αααα·ααααα’αααααααΎαααααααααΆα
αα·αααααααααΎ - ααααΎαα»αααΆαααΆα
ααααΎαααΆαα’ααααααααααΆα - 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).ααΆαααααΆααααααΌα - αααααααα
ααα»α
ααααΆααααααΌα,
αααααΉα - αααααΉαααααΌα
ααΆα - ααααα»α
ααααα»ααααααα αααΆα - ααΆα

ααΆααααααΆααααααΈα pub-sub α’αααα’αΆα ααα½αααΆαααααΆααααααΆααααα½ααααααΆααααΆααααααααΆα αααα»αααααααα αα·αα’αααααααΎααααΆααα’αΆα αα»αααααΆααΆαααααα»αα αα½αααααααα αΆαααΈααααΈαααααΆαα’αααααααΎααααΆααααααΆαα αα·ααααααα αααΎαα
ααααΌα ααα αΆαααΆααα·α αα
ααααΎααααααααααααααααΆααα’ααααΆαααααααααΉααα·α αα ααΆαααααΎαααΆααααααΆααααααΆαααα ααΌα ααΆααΆααααααΎααααΆαααΆααα ααΆααααααααΆαααΌαααααΉα αα·αααΆαααΆααααα·ααααααααΈααααααααααΆααΈααΈααΈα ααααΎαααΆαααααααααααααααααααααΆααα·α αα ααΆαααααα’αΆα ααααΌαααΆαααααΎααΆαααααααΆααααΆαααΆααααα½ααααααααααα§ααααααααααααΆαα α’αααΈααααα αααααααααααΆααααΎαααΊαααααΎαααΆα ααααααα processors αα·αα ααα αΆαααΆααα·α αα α±ααααααΎααααΆαααΆααα½αααα
ααΌααααα‘ααααΎαααααΆαααΆααααααΎαα‘αΎααααααααΎα§ααΆα ααααα 3 handlers α ααΌααααΈαααα ααααΆααααΆαααααΆαα ααα αΆαααΆααα·α αα ααααα αααααα½αααααΆααα»αααα·αααααααΆαα ααα αΆα αα·αααΆαα αΌαα ααααααα’ααααααααααΆαααΎαα‘αΎαα ααΆαα ααα αΆααα»ααα·ααα»αααΉαααα½ααα»αααααΌαα ααααααΆααα»αααα·ααα α αΎαααΎααααΈαααααΆαααααΆαααΆαααααΆαααΎαα ααα»αααα’ααααααααααΆα ααΎαααΉαααααΆαααΆαααΉααααααΉα prefetch_limit. αα αααα»αααααααααααααααα’αΆαααα prefetch_limit ααΉαααΆααΆααα’ααααααααααΆαααααΆααααΈααΆαααα½ααα·α αα ααΆαααΆααα’ααα
ααΆαααααΎααΆαααααααααααα½α αα·αααααΎαααΆαα’αΆαα·ααΆαα α’αααααααΎαααΆαααα½αααΆαααΆααα·α αα αα ααααα½ααααααααα αα·α αα ααΆαα’αΆα αααα ααααααααααα α¬αααΆαααα
messaging:ack(Tack)- ααΆαα α ααααα·αααΎααΆαααααΌαααΆαααααΎαααΆααααααααααmessaging:nack(Tack)- ααΆαα α αααα»αααααΆαααΆαα’αΆααααααΆααα’ααα αα αααααααα·α αα ααΆαααααΌαααΆααααααααααα·α ααΆαααααΎααΆαααΉααααααΌαααΆαα α’ααααααααααΆαααααααααα

α§αααΆααΆααΆααααΆααααααα»αααααααΆααα½αααΆαααΎαα‘αΎααααααααααααααΎαααΆαααΆααα·α αα ααΈ: αα½αααααΆα 1 αααααΆααααΈααα½αααΆαααΆααα·α αα ααΆαααΆααααααα·αααΆααααααααΆααΎααααΈααΆαααΆαααα’αααΈαα α ααα»α ααααΆααααααΌαα αααα»αααααΈααα α ααα»α ααααΆααααααΌαααΉααααααααΆααα·α αα αα α’ααααααααααΆααααααααα αααααΆααααΈα’ααααα ack ααΆααα»ααααααα αααααΆααα ααα»αααα½αα ααα½α α’ααααααααααααααΈ 3 ααΆααααααααα·α αα ααΆαααα α αΎαααΆααααααΌα nack ααΆαααααα ααΆααα·α αα ααααααΌαααΆαααααααα α±ααα’ααααααααααΆααααααααααααααΆααααα ααααΆαααααααααα
ααααααααα
ααΎαααΆαααααααααααααΎαααα»αα’ααΆαααΆααΌαααααΆαααααααααααα ααα αΆα αα·αααα½αααΆαααΆααααααΉαααΆααΌαααααΆαα’αααΈααΆαααααΎααααΆαααααααα½ααααα αααα»α Erlang/Elixir α
ααΆααααααΆααα½ααααα αΌαααααΆααααααΌααΌαααααΆα α’αααα’αΆα αααααΎαααααΌαααα»αααααΆα ααΎααααΈαααααααΆααααα αΆααααααα»αααΎαααΆαα
αα αααα»ααααααα α»αααααααααααααΈ ααΎαααΉααα·αα·αααααΎααααα αΆααΌαα ααααααΆαααααααα α ααΆααααααααααΌα αα·ααα»αααααΆα α αΎααααα·ααΆαα’αααΈαααααααΆαααααααααααΆαααααααΆα αα·αααΆαα’ααα±αα ααααααα α»αααααααααααα
α α»ααααα αααααααααααΈααΈαα
ααΌααα
ααΌαααΆααααααΆααααα
ααααααααΎ websequencediagrams.com
ααααα: www.habr.com
