ืื‘ื ื™ ื‘ื ื™ื™ืŸ ืฉืœ ืืคืœื™ืงืฆื™ื•ืช ืžื‘ื•ื–ืจื•ืช. ื’ื™ืฉื” ืจืืฉื•ื ื”

ืื‘ื ื™ ื‘ื ื™ื™ืŸ ืฉืœ ืืคืœื™ืงืฆื™ื•ืช ืžื‘ื•ื–ืจื•ืช. ื’ื™ืฉื” ืจืืฉื•ื ื”

ื‘ืขื‘ืจ ัั‚ะฐั‚ัŒะต ื‘ื—ื ื• ืืช ื”ื™ืกื•ื“ื•ืช ื”ืชื™ืื•ืจื˜ื™ื™ื ืฉืœ ืืจื›ื™ื˜ืงื˜ื•ืจื” ืจื™ืืงื˜ื™ื‘ื™ืช. ื”ื’ื™ืข ื”ื–ืžืŸ ืœื“ื‘ืจ ืขืœ ื–ืจื™ืžื•ืช ื ืชื•ื ื™ื, ื“ืจื›ื™ื ืœื™ื™ืฉื ืžืขืจื›ื•ืช Erlang/Elixir ืชื’ื•ื‘ืชื™ื•ืช ื•ื“ืคื•ืกื™ ื”ื•ื“ืขื•ืช ื‘ื”ืŸ:

  • ื‘ืงืฉืช ืชื’ื•ื‘ื”
  • ื‘ืงืฉื”-ืชื’ื•ื‘ื” ื—ืชื•ื›ื”
  • ืชื’ื•ื‘ื” ืขื ื‘ืงืฉื”
  • ืคืจืกื-ื”ื™ืจืฉื
  • ื”ืคื•ืš ืคืจืกื-ื”ื™ืจืฉื
  • ื—ืœื•ืงืช ืžืฉื™ืžื•ืช

SOA, MSA ื•ื”ื•ื“ืขื•ืช

SOA, MSA ื”ืŸ ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืžืขืจื›ืช ืฉืžื’ื“ื™ืจื•ืช ืืช ื”ื›ืœืœื™ื ืœื‘ื ื™ื™ืช ืžืขืจื›ื•ืช, ื‘ืขื•ื“ ืฉื”ืขื‘ืจืช ื”ื•ื“ืขื•ืช ืžืกืคืงืช ืคืจื™ืžื™ื˜ื™ื‘ื™ื•ืช ืœื™ื™ืฉื•ื ืฉืœื”ืŸ.

ืื ื™ ืœื ืจื•ืฆื” ืœืงื“ื ืืจื›ื™ื˜ืงื˜ื•ืจืช ืžืขืจื›ืช ื›ื–ื• ืื• ืื—ืจืช. ืื ื™ ื‘ืขื“ ื”ืฉื™ืžื•ืฉ ื‘ืฉื™ื˜ื•ืช ื”ื™ืขื™ืœื•ืช ื•ื”ืฉื™ืžื•ืฉื™ื•ืช ื‘ื™ื•ืชืจ ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ ื•ืขืกืง ืกืคืฆื™ืคื™ื™ื. ื‘ื›ืœ ืคืจื“ื™ื’ืžื” ืฉื ื‘ื—ืจ, ืขื“ื™ืฃ ืœื™ืฆื•ืจ ื‘ืœื•ืงื™ื ืฉืœ ืžืขืจื›ืช ืขื ืขื™ืŸ ืขืœ ื“ืจืš ื”-Unix: ืจื›ื™ื‘ื™ื ืขื ืงื™ืฉื•ืจื™ื•ืช ืžื™ื ื™ืžืœื™ืช, ืื—ืจืื™ื ืขืœ ื™ืฉื•ื™ื•ืช ื‘ื•ื“ื“ื•ืช. ืฉื™ื˜ื•ืช API ืžื‘ืฆืขื•ืช ืืช ื”ืคืขื•ืœื•ืช ื”ืคืฉื•ื˜ื•ืช ื‘ื™ื•ืชืจ ื”ืืคืฉืจื™ื•ืช ืขื ื™ืฉื•ื™ื•ืช.

ื”ืขื‘ืจืช ื”ื•ื“ืขื•ืช ื”ื™ื, ื›ืคื™ ืฉื”ืฉื ืžืจืžื–, ืžืชื•ื•ืš ื”ื•ื“ืขื•ืช. ืžื˜ืจืชื• ื”ืขื™ืงืจื™ืช ื”ื™ื ืœืงื‘ืœ ื•ืœืฉืœื•ื— ื”ื•ื“ืขื•ืช. ื”ื™ื ืื—ืจืื™ืช ืขืœ ื”ืžืžืฉืงื™ื ืœืฉืœื™ื—ืช ืžื™ื“ืข, ื™ืฆื™ืจืช ืขืจื•ืฆื™ื ืœื•ื’ื™ื™ื ืœื”ืขื‘ืจืช ืžื™ื“ืข ื‘ืชื•ืš ื”ืžืขืจื›ืช, ื ื™ืชื•ื‘ ื•ืื™ื–ื•ืŸ ื•ื›ืŸ ื˜ื™ืคื•ืœ ื‘ืชืงืœื•ืช ื‘ืจืžืช ื”ืžืขืจื›ืช.
ื”ืžืกืจื™ื ืฉืื ื• ืžืคืชื—ื™ื ืื™ื ื ืžื ืกื™ื ืœื”ืชื—ืจื•ืช ืื• ืœื”ื—ืœื™ืฃ ืืช rabbitmq. ื”ืชื›ื•ื ื•ืช ื”ืขื™ืงืจื™ื•ืช ืฉืœื•:

  • ื”ืคืฆื”.
    ื ื™ืชืŸ ืœื™ืฆื•ืจ ื ืงื•ื“ื•ืช ื”ื—ืœืคื” ื‘ื›ืœ ืฆืžืชื™ ื”ืืฉื›ื•ืœ, ืงืจื•ื‘ ื›ื›ืœ ื”ืืคืฉืจ ืœืงื•ื“ ืฉืžืฉืชืžืฉ ื‘ื”ื.
  • ืคึผึทืฉืึฐื˜ื•ึผืช.
    ื”ืชืžืงื“ ื‘ืžื–ืขื•ืจ ืงื•ื“ ื”-boilerplate ื•ื‘ื ื•ื—ื•ืช ื”ืฉื™ืžื•ืฉ.
  • ื”ื•ืคืขื” ื˜ื•ื‘ื” ื™ื•ืชืจ.
    ืื ื—ื ื• ืœื ืžื ืกื™ื ืœื—ื–ื•ืจ ืขืœ ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืฉืœ rabbitmq, ืืœื ืœื”ื“ื’ื™ืฉ ืจืง ืืช ื”ืฉื›ื‘ื” ื”ืื“ืจื™ื›ืœื™ืช ื•ื”ืชื—ื‘ื•ืจืชื™ืช, ืื•ืชื” ืื ื• ืžืชืื™ืžื™ื ืœ-OTP ื‘ืฆื•ืจื” ืคืฉื•ื˜ื” ื›ื›ืœ ื”ืืคืฉืจ, ืชื•ืš ืžื–ืขื•ืจ ืขืœื•ื™ื•ืช.
  • ื’ึฐืžึดื™ืฉืื•ึผืช.
    ื›ืœ ืฉื™ืจื•ืช ื™ื›ื•ืœ ืœืฉืœื‘ ืชื‘ื ื™ื•ืช ื”ื—ืœืคื” ืจื‘ื•ืช.
  • ื—ื•ืกืŸ ื‘ืขื™ืฆื•ื‘.
  • ืžื“ืจื’ื™ื•ืช.
    ื”ืขื‘ืจืช ื”ื”ื•ื“ืขื•ืช ื’ื“ืœื” ืขื ื”ืืคืœื™ืงืฆื™ื”. ื›ื›ืœ ืฉื”ืขื•ืžืก ื’ื“ืœ, ืืชื” ื™ื›ื•ืœ ืœื”ืขื‘ื™ืจ ืืช ื ืงื•ื“ื•ืช ื”ื”ื—ืœืคื” ืœืžื›ื•ื ื•ืช ื‘ื•ื“ื“ื•ืช.

REMARK. ืžื‘ื—ื™ื ืช ืืจื’ื•ืŸ ื”ืงื•ื“, ืžื˜ื-ืคืจื•ื™ืงื˜ื™ื ืžืชืื™ืžื™ื ื”ื™ื˜ื‘ ืœืžืขืจื›ื•ืช ืžื•ืจื›ื‘ื•ืช ืฉืœ Erlang/Elixir. ื›ืœ ืงื•ื“ ื”ืคืจื•ื™ืงื˜ ืžืžื•ืงื ื‘ืžืื’ืจ ืื—ื“ - ืคืจื•ื™ืงื˜ ื’ื’. ื‘ืžืงื‘ื™ืœ, ืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืžื‘ื•ื“ื“ื™ื ื‘ืฆื•ืจื” ืžืงืกื™ืžืœื™ืช ื•ืžื‘ืฆืขื™ื ืคืขื•ืœื•ืช ืคืฉื•ื˜ื•ืช ื”ืื—ืจืื™ื•ืช ืขืœ ื™ืฉื•ืช ื ืคืจื“ืช. ื‘ื’ื™ืฉื” ื–ื• ืงืœ ืœืชื—ื–ืง ืืช ื”-API ืฉืœ ื›ืœ ื”ืžืขืจื›ืช, ืงืœ ืœื‘ืฆืข ืฉื™ื ื•ื™ื™ื, ื ื•ื— ืœื›ืชื•ื‘ ืžื‘ื—ื ื™ ื™ื—ื™ื“ื•ืช ื•ืื™ื ื˜ื’ืจืฆื™ื”.

ืจื›ื™ื‘ื™ ื”ืžืขืจื›ืช ืžืงื™ื™ืžื™ื ืื™ื ื˜ืจืืงืฆื™ื” ื™ืฉื™ืจื” ืื• ื‘ืืžืฆืขื•ืช ืžืชื•ื•ืš. ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ ื”ื•ื“ืขื•ืช, ืœื›ืœ ืฉื™ืจื•ืช ื™ืฉ ื›ืžื” ืฉืœื‘ื™ ื—ื™ื™ื:

  • ืืชื—ื•ืœ ื”ืฉื™ืจื•ืช.
    ื‘ืฉืœื‘ ื–ื”, ื”ืชื”ืœื™ืš ื•ื”ืชืœื•ืช ื”ืžื‘ืฆืขื™ื ืืช ื”ืฉื™ืจื•ืช ืžื•ื’ื“ืจื™ื ื•ืžื•ืคืขืœื™ื.
  • ื™ืฆื™ืจืช ื ืงื•ื“ืช ื”ื—ืœืคื”.
    ื”ืฉื™ืจื•ืช ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื ืงื•ื“ืช ื”ื—ืœืคื” ืกื˜ื˜ื™ืช ืฉืฆื•ื™ื ื” ื‘ืชืฆื•ืจืช ื”ืฆื•ืžืช, ืื• ืœื™ืฆื•ืจ ื ืงื•ื“ื•ืช ื”ื—ืœืคื” ื‘ืื•ืคืŸ ื“ื™ื ืžื™.
  • ืจื™ืฉื•ื ืฉื™ืจื•ืช.
    ืขืœ ืžื ืช ืฉื”ืฉื™ืจื•ืช ื™ืฉืจืช ื‘ืงืฉื•ืช, ื™ืฉ ืœื”ื™ืจืฉื ื‘ื ืงื•ื“ืช ื”ื”ื—ืœืคื”.
  • ืชืคืงื•ื“ ืชืงื™ืŸ.
    ื”ืฉื™ืจื•ืช ืžื™ื™ืฆืจ ืขื‘ื•ื“ื” ืžื•ืขื™ืœื”.
  • ืœื›ื‘ื•ืช.
    ื™ืฉื ื 2 ืกื•ื’ื™ ื›ื™ื‘ื•ื™ ืืคืฉืจื™ื™ื: ืจื’ื™ืœ ื•ื—ืจื•ื. ื‘ืžื”ืœืš ืคืขื•ืœื” ืจื’ื™ืœื”, ื”ืฉื™ืจื•ืช ืžื ื•ืชืง ืžื ืงื•ื“ืช ื”ื”ื—ืœืคื” ื•ื ืคืกืง. ื‘ืžืฆื‘ื™ ื—ื™ืจื•ื, ื”ืขื‘ืจืช ื”ื•ื“ืขื•ืช ืžื‘ืฆืขืช ืืช ืื—ื“ ืžืกืงืจื™ืคื˜ื™ ื”ื›ืฉืœ.

ื–ื” ื ืจืื” ื“ื™ ืžืกื•ื‘ืš, ืื‘ืœ ื”ืงื•ื“ ืœื ื›ืœ ื›ืš ืžืคื—ื™ื“. ื“ื•ื’ืžืื•ืช ืงื•ื“ ืขื ื”ืขืจื•ืช ื™ื™ื ืชื ื• ื‘ื ื™ืชื•ื— ื”ืชื‘ื ื™ื•ืช ืžืขื˜ ืžืื•ื—ืจ ื™ื•ืชืจ.

ื‘ื•ืจืกื•ืช

Exchange point ื”ื•ื ืชื”ืœื™ืš ื”ืขื‘ืจืช ื”ื•ื“ืขื•ืช ืฉืžื™ื™ืฉื ืืช ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ืื™ื ื˜ืจืืงืฆื™ื” ืขื ืจื›ื™ื‘ื™ื ื‘ืชื•ืš ืชื‘ื ื™ืช ื”ื”ื•ื“ืขื•ืช. ื‘ื›ืœ ื”ื“ื•ื’ืžืื•ืช ื”ืžื•ืฆื’ื•ืช ืœื”ืœืŸ, ื”ืจื›ื™ื‘ื™ื ืžืงื™ื™ืžื™ื ืื™ื ื˜ืจืืงืฆื™ื” ื‘ืืžืฆืขื•ืช ื ืงื•ื“ื•ืช ื”ื—ืœืคื”, ืฉื”ืฉื™ืœื•ื‘ ืฉืœื”ืŸ ื™ื•ืฆืจ ื”ื•ื“ืขื•ืช.

ื“ืคื•ืกื™ ื—ื™ืœื•ืคื™ ื”ื•ื“ืขื•ืช (ื—ื‘ืจื™ ืื™ืจื•ืคื”)

ื‘ืขื•ืœื, ื ื™ืชืŸ ืœื—ืœืง ืืช ื“ืคื•ืกื™ ื”ื”ื—ืœืคื” ืœืฉื ื™ ื›ื™ื•ื•ื ื™ื ื•ื—ื“ ื›ื™ื•ื•ื ื™ื. ื”ืจืืฉื•ื ื™ื ืžืจืžื–ื™ื ืขืœ ืชื’ื•ื‘ื” ืœื”ื•ื“ืขื” ื ื›ื ืกืช, ื”ืฉื ื™ื™ื ืœื. ื“ื•ื’ืžื” ืงืœืืกื™ืช ืœื“ืคื•ืก ื“ื•-ื›ื™ื•ื•ื ื™ ื‘ืืจื›ื™ื˜ืงื˜ื•ืจืช ืฉืจืช-ืœืงื•ื— ื”ื™ื ื“ืคื•ืก Request-response. ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื”ืชื‘ื ื™ืช ื•ื”ืฉื™ื ื•ื™ื™ื ืฉืœื”.

ื‘ืงืฉื”-ืชื’ื•ื‘ื” ืื• RPC

RPC ืžืฉืžืฉ ื›ืืฉืจ ืื ื• ืฆืจื™ื›ื™ื ืœืงื‘ืœ ืชื’ื•ื‘ื” ืžืชื”ืœื™ืš ืื—ืจ. ืชื”ืœื™ืš ื–ื” ืขืฉื•ื™ ืœืคืขื•ืœ ื‘ืื•ืชื• ืฆื•ืžืช ืื• ืžืžื•ืงื ื‘ื™ื‘ืฉืช ืื—ืจืช. ืœื”ืœืŸ ืชืจืฉื™ื ืฉืœ ื”ืื™ื ื˜ืจืืงืฆื™ื” ื‘ื™ืŸ ื”ืœืงื•ื— ืœืฉืจืช ื‘ืืžืฆืขื•ืช ื”ื•ื“ืขื•ืช.

ืื‘ื ื™ ื‘ื ื™ื™ืŸ ืฉืœ ืืคืœื™ืงืฆื™ื•ืช ืžื‘ื•ื–ืจื•ืช. ื’ื™ืฉื” ืจืืฉื•ื ื”

ืžื›ื™ื•ื•ืŸ ืฉื”ืขื‘ืจืช ื”ื”ื•ื“ืขื•ืช ื”ื™ื ืืกื™ื ื›ืจื•ื ื™ืช ืœื—ืœื•ื˜ื™ืŸ, ืขื‘ื•ืจ ื”ืœืงื•ื— ื”ืžืจื›ื–ื™ื™ื” ืžื—ื•ืœืงืช ืœ-2 ืฉืœื‘ื™ื:

  1. ืฉื•ืœื— ื‘ืงืฉื”

    messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).

    ื”ืžืจืช โ€’ ืฉื ื™ื™ื—ื•ื“ื™ ืฉืœ ื ืงื•ื“ืช ื”ื”ื—ืœืคื”
    ResponseMatchingTag โ€’ ืชื•ื•ื™ืช ืžืงื•ืžื™ืช ืœืขื™ื‘ื•ื“ ื”ืชื’ื•ื‘ื”. ืœืžืฉืœ, ื‘ืžืงืจื” ืฉืœ ืฉืœื™ื—ืช ืžืกืคืจ ื‘ืงืฉื•ืช ื–ื”ื•ืช ื”ืฉื™ื™ื›ื•ืช ืœืžืฉืชืžืฉื™ื ืฉื•ื ื™ื.
    RequestDefinition - ื’ื•ืฃ ื”ื‘ืงืฉื”
    HandlerProcess โ€’ PID ืฉืœ ื”ืžื˜ืคืœ. ืชื”ืœื™ืš ื–ื” ื™ืงื‘ืœ ืชื’ื•ื‘ื” ืžื”ืฉืจืช.

  2. ืžืขื‘ื“ ืืช ื”ืชื’ื•ื‘ื”

    handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)

    ResponsePayload - ืชื’ื•ื‘ืช ืฉืจืช.

ืขื‘ื•ืจ ื”ืฉืจืช, ื”ืชื”ืœื™ืš ืžื•ืจื›ื‘ ื’ื ืž-2 ืฉืœื‘ื™ื:

  1. ืืชื—ื•ืœ ื ืงื•ื“ืช ื”ื”ื—ืœืคื”
  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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”