๊ณผ๊ฑฐ์
- ์์ฒญ-์๋ต
- ์์ฒญ ์ฒญํฌ ์๋ต
- ์์ฒญ์ ๋ํ ์๋ต
- ๊ฒ์-๊ตฌ๋
- ๋ฐ์ ๊ฒ์ ๊ตฌ๋
- ์์
๋ถ๋ฐฐ
SOA, MSA ๋ฐ ๋ฉ์์ง
SOA, MSA๋ ์์คํ ๊ตฌ์ถ ๊ท์น์ ์ ์ํ๋ ์์คํ ์ํคํ ์ฒ์ด๋ฉฐ ๋ฉ์์ง์ ๊ตฌํ์ ์ํ ๊ธฐ๋ณธ ์์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋๋ ์ด๊ฒ ๋๋ ์ ์์คํ ์ํคํ ์ฒ๋ฅผ ์ ํํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋๋ ํน์ ํ๋ก์ ํธ์ ๋น์ฆ๋์ค์ ๊ฐ์ฅ ํจ๊ณผ์ ์ด๊ณ ์ ์ฉํ ๋ฐฉ๋ฒ์ ์ ์ฉํ๋ ๊ฒ์ ์ง์งํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ค ํจ๋ฌ๋ค์์ ์ ํํ๋ Unix ๋ฐฉ์์ ์ฃผ์ํ๋ฉด์ ์์คํ ๋ธ๋ก์ ๋ง๋๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ์ฆ, ์ฐ๊ฒฐ์ฑ์ด ์ต์์ด๊ณ ๊ฐ๋ณ ์ํฐํฐ๋ฅผ ๋ด๋นํ๋ ๊ตฌ์ฑ ์์์ ๋๋ค. API ๋ฉ์๋๋ ์ํฐํฐ๋ก ๊ฐ์ฅ ๊ฐ๋จํ ์์ ์ ์ํํฉ๋๋ค.
๋ฉ์์ง - ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ๋ฉ์์ง ๋ธ๋ก์ปค์
๋๋ค. ์ฃผ์ ๋ชฉ์ ์ ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ๋ณด๋ด๋ ๊ฒ์
๋๋ค. ์ ๋ณด ์ ์ก์ ์ํ ์ธํฐํ์ด์ค, ์์คํ
๋ด์์ ์ ๋ณด ์ ์ก์ ์ํ ๋
ผ๋ฆฌ ์ฑ๋ ํ์ฑ, ๋ผ์ฐํ
๋ฐ ๋ฐธ๋ฐ์ฑ, ์์คํ
์์ค์์์ ์ฅ์ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค.
๊ฐ๋ฐ๋ ๋ฉ์์ง์ rabbitmq์ ๊ฒฝ์ํ๊ฑฐ๋ ๋์ฒดํ๋ ค๊ณ ์๋ํ์ง ์์ต๋๋ค. ์ฃผ์ ๊ธฐ๋ฅ:
- ๋ถํฌ.
๊ตํ ์ง์ ์ ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์ ์ต๋ํ ๊ฐ๊น์ด ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ ธ๋์์ ์์ฑํ ์ ์์ต๋๋ค. - ๋จ์์ฑ
์์ฉ๊ตฌ ์ฝ๋ ์ต์ํ์ ์ฌ์ฉ ํธ์์ฑ์ ์ค์ ์ ๋ก๋๋ค. - ๋ ๋์ ์ฑ๋ฅ.
์ฐ๋ฆฌ๋ rabbitmq์ ๊ธฐ๋ฅ์ ๋ฐ๋ณตํ๋ ค๋ ๊ฒ์ด ์๋๋ผ ๊ฐ๋ฅํ ํ ๊ฐ๋จํ๊ฒ OTP์ ๋ง๋ ์ํคํ ์ฒ ๋ฐ ์ ์ก ๊ณ์ธต๋ง ์ ํํ์ฌ ๋น์ฉ์ ์ต์ํํฉ๋๋ค. - ์ ์์ฑ.
๊ฐ ์๋น์ค๋ ๋ง์ ๊ตํ ํ ํ๋ฆฟ์ ๊ฒฐํฉํ ์ ์์ต๋๋ค. - ์ค๊ณ์ ๋ฐ๋ฅธ ํ๋ ฅ์ฑ.
- ํ์ฅ์ฑ.
๋ฉ์์ง์ ์ฑ๊ณผ ํจ๊ป ์ฑ์ฅํฉ๋๋ค. ๋ถํ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๊ตํ ์ง์ ์ ๋ณ๋์ ๊ธฐ๊ณ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
๋น๊ณ ์ฝ๋ ๊ตฌ์ฑ ์ธก๋ฉด์์ ๋ฉํ ํ๋ก์ ํธ๋ ๋ณต์กํ Erlang/Elixir ์์คํ ์ ์ ํฉํฉ๋๋ค. ๋ชจ๋ ํ๋ก์ ํธ ์ฝ๋๋ ํ๋์ ์ ์ฅ์(์ฐ์ฐ ํ๋ก์ ํธ)์ ์์ต๋๋ค. ๋์์ ๋ง์ดํฌ๋ก ์๋น์ค๋ ์ต๋ํ ๊ฒฉ๋ฆฌ๋์ด ๋ณ๋์ ์ํฐํฐ๋ฅผ ๋ด๋นํ๋ ๊ฐ๋จํ ์์ ์ ์ํํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ ์ฒด ์์คํ ์ API๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ณ ๋ณ๊ฒฝํ๊ธฐ ์ฝ๊ณ ๋จ์ ๋ฐ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค.
์์คํ ๊ตฌ์ฑ ์์๋ ์ง์ ๋๋ ๋ธ๋ก์ปค๋ฅผ ํตํด ์ํธ ์์ฉํฉ๋๋ค. ๋ฉ์์ง์ ์ ์ฅ์์ ๋ณผ ๋ ๊ฐ ์๋น์ค์๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์๋ช ๋จ๊ณ๊ฐ ์์ต๋๋ค.
- ์๋น์ค ์ด๊ธฐํ.
์ด ๋จ๊ณ์์ ์๋น์ค ๋ฐ ์ข ์์ฑ์ ์คํํ๋ ํ๋ก์ธ์ค์ ๊ตฌ์ฑ ๋ฐ ์คํ์ด ์ด๋ฃจ์ด์ง๋๋ค. - ๊ตํ ์ง์ ์ ๋ง๋ญ๋๋ค.
์๋น์ค๋ ํธ์คํธ ๊ตฌ์ฑ์ ์ง์ ๋ ์ ์ ๊ตํ ์ง์ ์ ์ฌ์ฉํ๊ฑฐ๋ ๋์ ์ผ๋ก ๊ตํ ์ง์ ์ ์์ฑํ ์ ์์ต๋๋ค. - ์๋น์ค ๋ฑ๋ก.
์๋น์ค๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ค๋ฉด ๊ตํ ์ง์ ์ ๋ฑ๋กํด์ผ ํฉ๋๋ค. - ์ ์ ์๋.
์๋น์ค๋ ์ ์ฉํ ์์ ์ ์ํํฉ๋๋ค. - ์์
์๋ฃ.
์ ง๋ค์ด์๋ ์ ๊ธฐ ๋ฐ ๋น์์ 2๊ฐ์ง ์ ํ์ด ์์ต๋๋ค. ์ ๊ธฐ ์๋น์ค์์๋ ๊ตํ ์ง์ ์์ ์ฐ๊ฒฐ์ด ๋์ด์ง๊ณ ์ค์ง๋ฉ๋๋ค. ๊ธด๊ธ ์ํฉ์์ ๋ฉ์์ง์ ์ฅ์ ์กฐ์น ์๋๋ฆฌ์ค ์ค ํ๋๋ฅผ ์คํํฉ๋๋ค.
๊ฝค ๋ณต์กํด ๋ณด์ด์ง๋ง ์ฝ๋๊ฐ ๊ทธ๋ ๊ฒ ๋ฌด์ญ์ง๋ ์์ต๋๋ค. ์ฃผ์์ด ์๋ ์ฝ๋ ์์ ๋ ๋์ค์ ํ ํ๋ฆฟ ๋ถ์์์ ์ ๊ณต๋ฉ๋๋ค.
๊ตํ
๊ตํ ์ง์ ์ ๋ฉ์์ง ํ ํ๋ฆฟ ๋ด์ ๊ตฌ์ฑ ์์์์ ์ํธ ์์ฉ ๋ ผ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๋ฉ์์ง ํ๋ก์ธ์ค์ ๋๋ค. ์๋์ ๋ชจ๋ ์์์ ๊ตฌ์ฑ ์์๋ ๋ฉ์์ง์ ํ์ฑํ๋ ์กฐํฉ์ธ ๊ตํ ์ง์ ์ ํตํด ์ํธ ์์ฉํฉ๋๋ค.
๋ฉ์์ง ๊ตํ ํจํด(MEP)
์ ์ธ๊ณ์ ์ผ๋ก ๊ตํ ํจํด์ ์๋ฉด๊ณผ ์ผ๋ฐฉ์ผ๋ก ๋๋ ์ ์์ต๋๋ค. ์ ์๋ ๋ค์ด์ค๋ ๋ฉ์์ง์ ๋ํ ์๋ต์ ์๋ฏธํ์ง๋ง ํ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ-์๋ฒ ์ํคํ ์ฒ์์ ์๋ฐฉํฅ ํจํด์ ์ ํ์ ์ธ ์๋ ์์ฒญ-์๋ต ํจํด์ ๋๋ค. ํ ํ๋ฆฟ๊ณผ ์์ ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค.
์์ฒญ-์๋ต ๋๋ RPC
RPC๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ก๋ถํฐ ์๋ต์ ๋ฐ์์ผ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค๋ ๋์ผํ ํธ์คํธ ๋๋ ๋ค๋ฅธ ๋๋ฅ์์ ์คํ๋ ์ ์์ต๋๋ค. ์๋๋ ๋ฉ์์ง์ ํตํ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ํธ ์์ฉ ๋ค์ด์ด๊ทธ๋จ์ ๋๋ค.
๋ฉ์์ง์ ์์ ํ ๋น๋๊ธฐ์์ด๋ฏ๋ก ํด๋ผ์ด์ธํธ์ ๋ํ ๊ตํ์ 2๋จ๊ณ๋ก ๋๋ฉ๋๋ค.
-
์์ฒญ ๋ณด๋ด๊ธฐ
messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).
๊ตํ โ ๊ณ ์ ํ ๊ตํ ์ง์ ์ด๋ฆ
ResponseMatchingTag โ ์๋ต ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ก์ปฌ ๋ ์ด๋ธ. ์๋ฅผ ๋ค์ด, ์๋ก ๋ค๋ฅธ ์ฌ์ฉ์์ ๋์ผํ ์์ฒญ์ ์ฌ๋ฌ ๊ฐ ๋ณด๋ด๋ ๊ฒฝ์ฐ์ ๋๋ค.
์์ฒญ ์ ์ โ ์์ฒญ ๋ณธ๋ฌธ
์ฒ๋ฆฌ๊ธฐ ํ๋ก์ธ์ค โ ํธ๋ค๋ฌ์ PID. ์ด ํ๋ก์ธ์ค๋ ์๋ฒ์์ ์๋ต์ ๋ฐ์ต๋๋ค. -
์๋ต ์ฒ๋ฆฌ
handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)
์๋ต ํ์ด๋ก๋ - ์๋ฒ ์๋ต.
์๋ฒ์ ๊ฒฝ์ฐ ํ๋ก์ธ์ค๋ ๋ค์ 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๊ฐ์ 1MB ๋ฉ์์ง๊ฐ ๋จ์ผ 1GB ๋ฉ์์ง๋ณด๋ค ๋ซ์ต๋๋ค.
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๋ฅผ ๋ฐฐํฌํ๋ฉด ๋ก๊น ์ ํธ๋ฆฌํ ํจํด์ ์ป์ ์ ์์ต๋๋ค. ์์ค์ ์๋น์ ์ธํธ๋ ์์ ํ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด ๊ทธ๋ฆผ์ ํ ๋ช ์ ์๋น์์ ์ฌ๋ฌ ์์ค๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์์ ๋ถํฌ ํจํด
๊ฑฐ์ ๋ชจ๋ ํ๋ก์ ํธ์๋ ๋ณด๊ณ ์ ์์ฑ, ์๋ฆผ ์ ๋ฌ ๋ฐ ํ์ฌ ์์คํ ์์ ๋ฐ์ดํฐ ์์ ๊ณผ ๊ฐ์ ์ง์ฐ ์ฒ๋ฆฌ ์์ ์ด ์์ต๋๋ค. ์ด๋ฌํ ์์ ์ ์ํํ๋ ์์คํ ์ ์ฒ๋ฆฌ๋์ ํ๋ก์ธ์๋ฅผ ์ถ๊ฐํ์ฌ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์๊ฒ ๋จ์ ๊ฒ์ ํ๋ก์ธ์ ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ๊ณ ๊ทธ๋ค ์ฌ์ด์ ์์ ์ ๊ณ ๋ฅด๊ฒ ๋ถ๋ฐฐํ๋ ๊ฒ์ ๋๋ค.
3๊ฐ์ ํธ๋ค๋ฌ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ํ๋ ์ํฉ์ ๊ณ ๋ คํ์ญ์์ค. ์์ ๋ฐฐ๋ถ ๋จ๊ณ์์๋ ๋ฐฐ๋ถ์ ๊ณต์ ์ฑ๊ณผ ์ฒ๋ฆฌ๊ธฐ์ ๊ณผ์์ ๋ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ผ์ด๋ ๋ก๋น ๋ถ๋ฐฐ๋ ๊ณต์ ์ฑ์ ์ฑ ์์ง ๊ฒ์ด๋ฉฐ, ํธ๋ค๋ฌ์ ์ค๋ฒํ๋ก์ฐ ์ํฉ์ ํผํ๊ธฐ ์ํด ์ ํ์ ๋์ ํ ๊ฒ์ ๋๋ค. ํ๋ฆฌํ์น_ํ๊ณ. ์ ํ ๋ชจ๋์์ ํ๋ฆฌํ์น_ํ๊ณ ํ๋์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ๋ชจ๋ ์์ ์ ์์ ํ๋๋ก ํ์ฉํ์ง ์์ต๋๋ค.
๋ฉ์์ง์ ๋๊ธฐ์ด๊ณผ ์ฒ๋ฆฌ ์ฐ์ ์์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ํ๋ก์ธ์๋ ์์ ์ด ๋์ฐฉํ๋ฉด ์์ ํฉ๋๋ค. ์์ ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๊ฑฐ๋ ์คํจํ ์ ์์ต๋๋ค.
messaging:ack(Tack)
โ ๋ฉ์์ง ์ฒ๋ฆฌ ์ฑ๊ณต ์ ํธ์ถmessaging:nack(Tack)
โ ๋ชจ๋ ๋น์ ์ํฉ์์ ํธ์ถ๋ฉ๋๋ค. ์์ ์ด ๋ฐํ๋ ํ ๋ฉ์์ง์ ์์ ์ ๋ค๋ฅธ ์ฒ๋ฆฌ๊ธฐ๋ก ์ ๋ฌํฉ๋๋ค.
์ธ ๊ฐ์ง ์์ ์ ์ฒ๋ฆฌํ๋ ๋์ ๋ณต์กํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฒ๋ฆฌ๊ธฐ 1์ด ์์ ์ ๋ฐ์ ํ ๊ตํ ์ง์ ์ ์๋ฌด ๊ฒ๋ ๋ณด๊ณ ํ ์๊ฐ๋ ์์ด ์ถฉ๋ํ์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ตํ ์ง์ ์ ack ์๊ฐ ์ ํ์ด ๋ง๋ฃ๋ ํ ์์ ์ ๋ค๋ฅธ ์ฒ๋ฆฌ๊ธฐ๋ก ์ ์กํฉ๋๋ค. ์ฒ๋ฆฌ๊ธฐ 3์ ์ด๋ค ์ด์ ๋ก ์์ ์ ํฌ๊ธฐํ๊ณ nack์ ๋ณด๋๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ ๋ค๋ฅธ ์ฒ๋ฆฌ๊ธฐ๋ก ์ ๋ฌ๋์์ต๋๋ค.
์๋น ์์ฝ
์ฐ๋ฆฌ๋ ๋ถ์ฐ ์์คํ ์ ๊ธฐ๋ณธ ๋น๋ฉ ๋ธ๋ก์ ๋ถํดํ๊ณ Erlang/Elixir์์์ ์ฌ์ฉ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ดํด๋ฅผ ์ป์์ต๋๋ค.
๊ธฐ๋ณธ ํ ํ๋ฆฟ์ ๊ฒฐํฉํ์ฌ ๋ณต์กํ ํจ๋ฌ๋ค์์ ๊ตฌ์ถํ์ฌ ์๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ฃผ๊ธฐ์ ๋ง์ง๋ง ๋ถ๋ถ์์๋ ์๋น์ค ๊ตฌ์ฑ, ๋ผ์ฐํ ๋ฐ ๋ฐธ๋ฐ์ฑ์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ๊ณ ์์คํ ์ ํ์ฅ์ฑ ๋ฐ ๋ด๊ฒฐํจ์ฑ์ ์ค์ฉ์ ์ธ ์ธก๋ฉด์ ๋ํด์๋ ์ด์ผ๊ธฐํฉ๋๋ค.
๋ ๋ฒ์งธ ๋ถ๋ถ์ ๋.
ะคะพัะพ
์ฝํ ์ ๊ณต: websequencediagrams.com
์ถ์ฒ : habr.com