áá±á¬ááºáá¯á¶ážá
- áá±á¬ááºážááá¯áá»ááº
- áá±á¬ááºážááá¯ááŸá¯-á¡áá¯á¶ážá¡áá² áá¯á¶á·ááŒááºááŸá¯
- áá±á¬ááºážááá¯ááŸá¯ááŒáá·áº áá¯á¶á·ááŒááºááŒááºážá
- áá¯ááºáá±-á á¬áááºážááœááºážáá«á
- ááŒá±á¬ááºážááŒááºáá¯ááºáá±-á á¬áááºážááœááºážáá«á
- áá¬áááºááœá²áá±áá±ážááŒááºáž
SOAá MSA ááŸáá·áº á á¬ááá¯áá±ážááá¯á·ááŒááºážá
SOAá MSA ááẠá áá áºáááºáá±á¬ááºááŸá¯ááá¯ááºáᬠá ááºážáá»ááºážáá»á¬ážááᯠáááºááŸááºáá±ážááá·áº á áá áºáááá¯áá¬áá»á¬ážááŒá áºááŒá®áž á á¬ááá¯áá±ážááá¯á·ááŒááºážááẠáááºážááá¯á·á á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á¡ááœáẠááŸá±ážáŠážá¡á áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá
á€ááá¯á·ááá¯áẠááá¯á áá áºáááºáá±á¬ááºáá¯á¶ááᯠááŒáŸáá·áºáááºááá¯ááŒááºážáááŸááá«á áááá»áá±á¬ááá±á¬áá»ááºáá áºáá¯ááŸáá·áº áá¯ááºáááºážáá áºáá¯á¡ááœáẠá¡áááá±á¬ááºáá¯á¶ážááŸáá·áº á¡áá¯á¶ážáááºáá¯á¶áž á¡áá±á·á¡áá»áá·áºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áááŒááºážááŒá áºáá«áááºá áá»áœááºá¯ááºááá¯á·ááœá±ážáá»ááºááá·áº áááºááá¯á·áááºááá¯á á±áá¬áá° Unix-way- áá áºáá¯áá»ááºážá á®á¡ááœáẠáá¬áááºááŸááá±á¬ áá»áááºáááºááŸá¯á¡áááºážáááºáá¬ááŸááá±á¬ á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠááŒáá·áºááŸá¯ááŒááºážááŒáá·áº á áá áºááá±á¬ááºáá»á¬ážááᯠáááºáá®ážááŒááºážááẠááá¯áá±á¬ááºážáá«áááºá API áááºážáááºážáá»á¬ážááẠentities áá»á¬ážááŸáá·áº á¡ááá¯ážááŸááºážáá¯á¶ážááŒá áºááá¯ááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºá
áááºáá±á·ááºá»ááá¯á·ááŒááºážááẠáá¬ááẠá¡ááŒá¶ááŒá¯áá¬ážááá·áºá¡ááá¯ááºáž áááºáá±á·áá»áºááœá²á
á¬ážááŒá
áºáááºá áááºážá á¡ááá áááºááœááºáá»ááºááŸá¬ áááºáá±á·áá»áºáá»á¬áž áááºáá¶ááŒááºážááŸáá·áº áá±ážááá¯á·ááŒááºáž ááŒá
áºáááºá ááááºážá¡áá»ááºá¡áááºáá±ážááá¯á·ááŒááºážá¡ááœáẠá¡ááºáá¬áá±á·á
áºáá»á¬ážá á
áá
áºá¡ááœááºáž ááááºážá¡áá»ááºá¡áááºááá¯á·ááœáŸááºáááºá¡ááœáẠáá¯áá¹áááááºážááŒá±á¬ááºážáá»á¬ážááœá²á·á
ááºážááŒááºážá áááºážááœááºááŒááºážááŸáá·áº áááºáá»ááºáá®ááŒááºážá¡ááŒáẠá
áá
áºá¡ááá·áºááœáẠá¡ááŸá¬ážá¡ááœááºážáá»á¬ážááᯠááá¯ááºááœááºááŒááºážááá¯á·á¡ááœáẠáááºážááœáẠáá¬áááºááŸááááºá
áá»áœááºá¯ááºááá¯á·áááºáá®ážáá±áá±á¬ á
á¬ááá¯áá±ážááá¯á·ááŸá¯ááẠrabbitmq ááŸáá·áº ááŸááºááŒáá¯ááºááẠááá¯á·ááá¯áẠá¡á
á¬ážááá¯ážááẠááŒáá¯ážá
á¬ážáá±ááŒááºážááá¯ááºáá«á áááºážáá¡áááá¡ááºá¹áá«áááºáá»á¬áž:
- ááŒáá·áºáá±ááŒááºážá
áááºážááá¯á·ááᯠá¡áá¯á¶ážááŒá¯ááá·áº áá¯ááºááŸáá·áº áááºááá¯ááºááá»áŸ áá®ážá ááºááá¯ááºááá»áŸ á¡á á¯á¡áá±ážá¡á¬ážáá¯á¶ážááœáẠáá²ááŸááºá¡ááŸááºáá»á¬ážááᯠáááºáá®ážááá¯ááºáááºá - ááá¯ážááŸááºážá
ááœáá¯ááºáá¬ááŒá¬ážáá¯ááºááᯠáá»áŸá±á¬á·áá»áááºááŸáá·áº á¡áá¯á¶ážááŒá¯áááœááºáá°ááŒááºážá¡áá±á«áº á¡á¬áá¯á¶á áá¯ááºáá«á - ááá¯áá±á¬ááºážáá²á·á
áœááºážáá±á¬ááºáááºá
áá»áœááºá¯ááºááá¯á·ááẠrabbitmq á áá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠáááºáá«ááá²áá²ááẠáááŒáá¯ážá á¬ážáá±á¬áºáááºážá áá»áœááºá¯ááºááá¯á·ááẠOTP ááŸáá·áº ááá¯ááºáá®ááá¯ááºááá»áŸ ááá¯ážááá¯ážááŸááºážááŸááºáž ááá¯ááºáááºáá±á¬ áááá¯áá¬ááŸáá·áº áááºáá°ááá¯á·áá±á¬ááºáá±áž á¡ááœáŸá¬ááá¯áᬠáá®ážáá±á¬ááºážááá¯ážááŒááŒá®áž áá¯ááºáá»á ááááºáá»á¬ážááᯠáááºážáá«ážá á±áááºá - ááŒá±á¬ááºážááœááºááŒááºááœááºá
áááºáá±á¬ááºááŸá¯áá áºáá¯á á®ááẠáá»á¬ážá áœá¬áá±á¬ áááŸááºááŸá¯áá¯á¶á á¶áá»á¬ážááᯠáá±á«ááºážá ááºááá¯ááºáááºá - áá®ááá¯ááºážá¡á¬ážááŒáá·áº áá¶ááá¯ááºáááºááŸáááŒááºážá
- áá»áœááºážáá»ááºááá¯ááºááá¯ááºááŸá¯á
á¡ááá®áá±ážááŸááºážááŸáá·áºá¡áá° á á¬ááá¯áá±ážááá¯á·ááŒááºážááẠááŒá®ážááœá¬ážáá¬áááºá áááºááá¯ážáá¬áááºááŸáá·áºá¡áá»áŸ ááœá±áá²ááŸááºáá»á¬ážááᯠá ááºáá áºáá¯á á®ááá¯á· ááœáŸá±á·ááá¯ááºáááºá
ááŸááºáá»áẠáá¯ááºá¡ááœá²á·á¡á ááºážáá ááºážáááºážáá»ááºáá»á¬ážá¡áá áááºáá¬ááá±á¬áá»ááºáá»á¬ážááẠááŸá¯ááºááœá±ážáá±á¬ Erlang/Elixir á áá áºáá»á¬ážá¡ááœáẠáá±á¬ááºážááœááºááá·áºáá»á±á¬áºáá«áááºá ááá±á¬áá»ááºáá¯ááºá¡á¬ážáá¯á¶ážááẠááá¯ááŸá±á¬ááºáá¯á¶áá áºáᯠ- áá®ážááá±á¬áá»ááºáá áºáá¯ááœáẠáááºááŸááááºá áá áºáá»áááºáááºážááŸá¬áááºá microservices áá»á¬ážááẠáá®ážááŒá¬ážááœá²áá¯ááºáá¬ážááŒá®áž áá®ážááŒá¬áž entity á¡ááœáẠáá¬áááºááŸááá±á¬ ááá¯ážááŸááºážáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá«áááºá á€áá»ááºážáááºááŸá¯ááŒáá·áºá á áá áºáá áºáá¯áá¯á¶ážá API ááᯠááááºážááááºážááẠááœááºáá°áááºá á¡ááŒá±á¬ááºážá¡áá²áá¯ááºááẠááœááºáá°áááºá áá°áá áºááŸáá·áº áá±á«ááºážá ááºá á áºáá±ážááŸá¯áá»á¬ážááᯠáá±ážáá¬ážááẠá¡áááºááŒá±áááºá
á áá áºá¡á áááºá¡ááá¯ááºážáá»á¬ážááẠááá¯ááºááá¯áẠááá¯á·ááá¯áẠááœá²á á¬ážááŸáááá·áº á¡ááŒááºá¡ááŸáẠáá¯á¶á·ááŒááºááŒáááºá áááºáá±á·áá»áºááá¯á·ááŒááºážááŸá¯áá±á¬áá·áºááŸááŒáá·áºáá»áŸáẠáááºáá±á¬ááºááŸá¯áá áºáá¯á á®ááœáẠááá¡ááá·áºáá»á¬ážá áœá¬ááŸááááºá
- áááºáá±á¬ááºááŸá¯ á
áááºááŒááºáž
á€á¡ááá·áºááœááºá áááºáá±á¬ááºááŸá¯ááᯠáá¯ááºáá±á¬ááºááá·áº áá¯ááºáááºážá ááºááŸáá·áº ááŸá®ááá¯ááŸá¯áá»á¬ážááᯠááŒááºáááºáááºááŸááºááŒá®áž á áááºáá±á¬ááºááœááºáá«áááºá - áá²ááŸááºááœáá¯áá·áºáááºáá®ážááŒááºážá
áááºáá±á¬ááºááŸá¯ááẠnode configuration ááœáẠáááºááŸááºáá¬ážáá±á¬ static exchange point ááá¯áá¯á¶ážááá¯ááºáááºá ááá¯á·ááá¯áẠexchange point ááᯠdynamically áááºáá®ážááá¯ááºáááºá - áááºáá±á¬ááºááŸá¯ááŸááºáá¯á¶áááºááŒááºážá
áááºáá±á¬ááºááŸá¯áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá±á¬ááºááœááºáá±ážááá¯ááºáááºá áááºážááᯠááœá±áá²ááœáá¯áá·áºááœáẠááŸááºáá¯á¶áááºááá«áááºá - áá¯á¶ááŸááºáááºáááºááŸá¯á
áááºáá±á¬ááºááŸá¯ááẠá¡áá¯á¶ážáááºáá±á¬ á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá¯ááºáááºá - á¡ááŒá®ážááááºááá¯ááºáááºá
áá¯á¶ááŸáẠááŸáá·áº á¡áá±ážáá±á«áº ááááºááẠá¡áá»áá¯ážá¡á á¬áž á áá»áá¯ážááŸááááºá áá¯á¶ááŸááºáááºáááºáá±á ááºá¡ááœááºáž áááºáá±á¬ááºááŸá¯ááẠááœá±áá²ááœáá¯áá·áºá០áá»áááºáááºááŸá¯ááŒááºáá±á¬ááºááŒá®áž áááºááá·áºááœá¬ážáá«áááºá á¡áá±ážáá±á«áºá¡ááŒá±á¡áá±áá»á¬ážááœáẠá á¬ááá¯áá±ážááá¯á·ááŒááºážááẠáá»ááºááœááºáá±á¬ script áá»á¬ážáá²á០áá áºáá¯ááᯠáá¯ááºáá±á¬ááºáááºá
á¡áá±á¬áºáá±ážááŸá¯ááºááœá±ážáá¯á¶ááááºá ááá¯á·áá±á¬áº áá¯ááºááẠááŒá±á¬ááºá áá¬ááá¯ááºáá±á áááºážáááááºáá»á¬ážá ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááœáẠááŸááºáá»ááºáá»á¬ážáá«áá±á¬ ááá°áá¬áá»á¬ážááᯠá¡áááºážáááºááŒá¬áá±á¬á¡áá«ááœáẠááŒááá«áááºá
áááŸááºááŸá¯
Exchange point ááẠá á¬ááá¯áá±ážááá¯á·ááŒááºáž áá¯á¶á á¶áááááºá¡ááœááºážááŸá á¡á áááºá¡ááá¯ááºážáá»á¬ážááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯á áá¯áá¹ááááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá±ážááá·áº á á¬ááá¯áá±ážááá¯á·ááŒááºáž áá¯ááºáááºážá ááºáá áºáá¯ááŒá áºáááºá á¡á±á¬ááºáá±á¬áºááŒáá« á¥ááá¬áá»á¬ážá¡á¬ážáá¯á¶ážááœáẠá¡á áááºá¡ááá¯ááºážáá»á¬ážááẠá á¬ááá¯áá±ážááá¯á·ááŒááºážáá¯á¶á á¶áá»á¬áž áá±á«ááºážá ááºáá¬ážáá±á¬ áááŸááºááŸá¯á¡ááŸááºáá»á¬ážááŸáá áºááá·áº á¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºáááºá
áááºáá±á·áá»áºáááŸááºááŸá¯áá¯á¶á á¶áá»á¬áž (MEPs)
áá áºááá¹áá¬áá¯á¶ážááœáẠáá²ááŸááºááŸá¯áá¯á¶á á¶áá»á¬ážááᯠááŸá áºáááºážááŸáá·áºáá áºááŒá±á¬ááºáž ááœá²ááŒá¬ážááá¯ááºáááºá áááẠá áááºáá¬ááá·áº áááºáá±á·áá»áºááᯠáá¯á¶á·ááŒááºááŸá¯áᯠá¡áááá¹áá¬ááºááœáá·áºááá¯áá±á¬áºáááºáž áá±á¬ááºááá¯ááºážááœáẠááá¯ááºáá±á¬ááºáá«á client-server áááá¯áá¬ááŸá ááŸá áºáááºážááœá¬ážáá¯á¶á á¶á ááá¹ááááºá¥ááá¬ááŸá¬ áá±á¬ááºážááá¯áá»ááº-áá¯á¶á·ááŒááºááŸá¯áá¯á¶á á¶ááŒá áºáááºá ááá°áá¬áá¯á¶á á¶ááŸáá·áº áááºážáááŒá¯ááŒááºááœááºážáá¶ááŸá¯áá»á¬ážááᯠááŒáá·áºááŒáá«á áá¯á·á
áá±á¬ááºážááá¯áá»ááº-áá¯á¶á·ááŒááºááŸá¯ ááá¯á·ááá¯áẠRPC
áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒá¬ážáá¯ááºáááºážá ááºá០áá¯á¶á·ááŒááºááŸá¯ááᯠáááºáá¶áááŸáááá·áºá¡áá« RPC ááᯠá¡áá¯á¶ážááŒá¯áááºá á€áá¯ááºáááºážá ááºááẠáá°áá®áá±á¬ node áá±á«áºááœáẠáá¯ááºáá±á¬ááºáá±ááá¯ááºááẠááá¯á·ááá¯áẠááá°áá®áá±á¬ ááá¯ááºááŒá®ážáá áºáá¯áá±á«áºááœáẠáááºááŸááááºá á¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáááºááŸá¬ á á¬ááá¯áá±ážááá¯á·ááŒááºážááŸáá áºááá·áº client ááŸáá·áº server á¡ááŒá¬áž á¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯á áá¯á¶ááŒááºážááŒá áºáááºá
áááºáá±á·áá»áºááá¯á·ááŒááºážááẠáá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬áž ááœá²ááœá²áá±áá±á¬ááŒá±á¬áá·áºá áá±á¬ááºáááºá¡ááœáẠáá²ááŸááºááŸá¯ááᯠá¡ááá·áº á ááá·áº ááœá²ááŒá¬ážáá¬ážáááºá
-
áá±á¬áá»ážááá¯ááá»áŒáá±ážááá¯á·ááŒááºáž
messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).
áá²ááŸáẠ- áá²ááŸááºááœáá¯áá·áºááá°ážááŒá¬ážáá±á¬á¡áááº
ResponseMatchingTag - áá¯á¶á·ááŒááºááŸá¯áá¯ááºáá±á¬ááºáááºá¡ááœáẠáá±áááœááºážáá¶ááááºá á¥ááá¬á¡á¬ážááŒáá·áºá ááá°áá®áá±á¬á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááá¯ááºááá¯ááºááá·áº áááºáá°áááºáá»áŸáá±á¬ááºážááá¯ááŸá¯áá»á¬áž áá±ážááá¯á·ááŒááºážááá á¹á ááœááºá
áá±á¬ááºážááá¯áá»áẠ- áá±á¬ááºážááá¯ááá¹áá¬ááá¯ááº
HandlerProcess - ááá¯ááºááœááºáá°á PIDá á€áá¯ááºáááºážá ááºááẠáá¬áá¬áá¶á០áá¯á¶á·ááŒááºááŸá¯ááᯠáááºáá¶áááŸááááºááŒá áºáááºá -
áá¯á¶á·ááŒááºááŸá¯ááᯠáá¯ááºáá±á¬ááºáá±áááºá
handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)
ResponsePayload - áá¬áá¬áá¯á¶á·ááŒááºááŸá¯á
áá¬áá¬á¡ááœááºá áá¯ááºáááºážá ááºááẠá¡ááá·áº á ááá·áºáá«áááºáááº-
- áá²ááŸááºááœáá¯áá·áºááᯠá¡á ááŒá¯ááŒááºážá
- áááºáá¶áááŸááá¬ážáá±á¬ áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒááºážá
áá® template ááᯠáá¯ááºáá²á· áá¯á¶áá±á¬áºááŒáá·áºáá¡á±á¬ááºá á¡áá»áááºá¡ááá¡áá»áá áºáá¯áááºážááᯠáá±ážáá±á¬ááºááá·áº ááá¯ážááŸááºážáá±á¬áááºáá±á¬ááºááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠááá¯á¡ááºáááºááá¯áá«á áá¯á·á
áá¬áá¬áá¯ááº
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 ááœáẠservice controller ááᯠáááºááŸááºááŒáá«á áá¯á·
%% РпÑОЌеÑе пПказаМ ÑПлÑкП зМаÑОЌÑй кПЎ. ÐÑÑавОв егП в ÑаблПМ 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};
áá±á¬ááºážááá¯ááŸá¯-á¡áá¯á¶ážá¡áá² áá¯á¶á·ááŒááºááŸá¯
ááŒá®ážáá¬ážáá±á¬ áááºáá±á·áá»áºáá»á¬áž áá±ážááá¯á·ááŒááºážááᯠááŸá±á¬ááºááŒááºááŒááºážááẠá¡áá±á¬ááºážáá¯á¶ážááŒá áºáááºá á áá áºáá áºáá¯áá¯á¶ážá áá¯á¶á·ááŒááºááá¯ááºá áœááºážááŸáá·áº áááºááŒáááºáá±á¬áá¯ááºáá±á¬ááºááŸá¯ááẠá€á¡áá±á«áºáá°áááºáá«áááºá á¡áááºá áá±ážááœááºážáá áºáá¯á¡ááœáẠáá¯á¶á·ááŒááºááŸá¯ááẠmemory á¡áá»á¬ážá¡ááŒá¬ážáá°áá«áá áááºážááᯠá¡ááá¯ááºážááá¯ááºážááœá²ááẠáááŒá áºááá±ááá¯á¡ááºáá«áááºá
ááá¯ááá¯á·áá±á¬ááá á¹á áááºá¡áá»áá¯á·ááᯠá¥ááá¬áá±ážáá«áá á±á
- á¡á áááºá¡ááá¯ááºážáá»á¬ážááẠááá¯ááºáá»á¬ážáá²á·ááá¯á·áá±á¬ binary data áá»á¬ážááᯠáááŸááºáááºá áá¯á¶á·ááŒááºááŸá¯ááᯠáá±ážáááºáá±á¬ á¡á áááºá¡ááá¯ááºážáá»á¬ážá¡ááŒá Ạááœá²ááŒááºážááŒááºážááŒáá·áº ááá·áºá¡á¬áž áááºááá·áºá¡ááœááºá¡á á¬ážááŸá ááá¯ááºáá»á¬ážááŸáá·áº áááááá±á¬ááºáá±á¬áẠáá¯ááºáá±á¬ááºááá¯ááºá á±ááŒá®áž ááŸááºáá¬ááºááŒáá·áºáá»áŸá¶ááŒááºážááᯠááŸá±á¬ááºááŸá¬ážááẠáá°áá®áá±ážáááºá
- á á¬áááºážáá»á¬ážá á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬áá±á·á áºááŸá ááá¬ážááŒá®ážáá áºáá¯á០ááŸááºáááºážá¡á¬ážáá¯á¶ážááᯠááœá±ážááŒá®áž áááºážááá¯á·ááᯠá¡ááŒá¬ážá¡á áááºá¡ááá¯ááºážááá¯á· ááœáŸá²ááŒá±á¬ááºážááẠááá¯á¡ááºáááºá
áá®áá¯á¶á·ááŒááºááŸá¯ááœá±ááᯠá ááºáá±á«ááºážááá¯á· áá±á«áºáá«áááºá áááºááá¯á·áááºááá¯á á±áá¬áá° 1024 MB á 1 áááºáá±á·áá»áºáá»á¬ážááẠ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).
áá²ááŸáẠ- ááœá±áá²ááœáá¯áá·áºá¡áááºá
áá±á¬á· - áááºážááŒáá±á¬á·
ááŒá±á¬ááá¯ááá·áºá¡ááŒá±á¬ááºážá¡áᬠ[Message] - áááºáá±á¬ááºá
ááŒá±á¬ááºážááŒááºáá¯ááºáá±-á á¬áááºážááœááºážáá«á
á¡áááºááá¯ááºááœá²ááᯠáá»á²á·ááœááºááŒááºážááŒáá·áºá áááºááẠááŸááºáááºážá¡ááœáẠá¡áááºááŒá±áá±á¬ áá¯á¶á á¶áá áºáá¯ááᯠáááá¯ááºáááºá áááºážááŒá áºáá»á¬ážááŸáá·áº á á¬ážáá¯á¶ážáá°á¡á á¯á¡áá±ážááẠáá¯á¶ážáááœá²ááŒá¬ážááá¯ááºáááºá ááááºážááááºážááẠá á¬ážáá¯á¶ážáá°áá áºáŠážááŸáá·áº áááºážááŒá áºáá»á¬ážá áœá¬áá«áá±á¬ á¡ááŸá¯áá áºáá¯ááᯠááŒááá¬ážáááºá
á¡áá¯ááºááŒáá·áºáá±ááŸá¯áá¯á¶á á¶
ááá±á¬áá»ááºááá¯ááºážáá®ážáá«ážááœáẠá¡á á®áááºáá¶á á¬áá»á¬ážáá¯ááºáá±ážááŒááºážá á¡ááŒá±á¬ááºážááŒá¬ážáá»ááºáá»á¬ážáá±ážááá¯á·ááŒááºážááŸáá·áº ááŒááºáá¡ááœá²á·á¡á ááºážá áá áºáá»á¬ážá០áá±áá¬ááá°ááŒááºážáá²á·ááá¯á·áá±á¬ ááœáŸá±á·ááá¯ááºážáá¬ážáá±á¬ áá¯ááºáá±á¬ááºááŒááºážáá¯ááºáááºážáá»á¬áž áá«áááºáá«áááºá á€áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá·áºá áá áºá ááŒááºáááºážááŸá¯á¡á¬áž ááá¯ááºááœááºáá°áá»á¬ážááᯠáá±á«ááºážááá·áºááŒááºážááŒáá·áº á¡ááœááºááá° áá»áááºááŸáááá¯ááºáááºá áá»áœááºá¯ááºááá¯á·á¡ááœáẠáá»ááºááŸááá±áá±ážáááºááŸá¬ áááá¯áááºáá¬á¡á á¯á¡áá±ážáá áºáá¯ááœá²á·á ááºážáᬠáááºážááá¯á·ááŒá¬ážááœáẠáá¯ááºáá±á¬ááºá áá¬áá»á¬ážááᯠá¡áá®á¡áá»áŸ ááŒáá·áºáá±áááºááŒá áºáááºá
ááá¯ááºááœááºáá° 3 áŠážá á¥ááá¬ááᯠá¡áá¯á¶ážááŒá¯á ááŒá áºáá±á«áºáá¬ááá·áº á¡ááŒá±á¡áá±áá»á¬ážááᯠááŒáá·áºááŒáá«á áá¯á·á áá¯ááºáááºážáá¬áááºááœá²áá±ááŒááºážá¡ááá·áºááœááºáááºá ááŒáá·áºááŒá°ážááŸá¯áááá¬ážáá»áŸáááŸá¯ááŸáá·áº ááá¯ááºááœááºáá°áá»á¬ážááŒá¬ážááŒááºážááá¯ááºáᬠáá±ážááœááºážáá»á¬áž áá±á«áºáá±á«ááºáá¬áááºá Round-robin ááŒáá·áºááŒá°ážááŸá¯ááẠááá¬ážáá»áŸáááŸá¯á¡ááœáẠáá¬áááºááŸááááºááŒá áºááŒá®ážá ááá¯ááºááœááºáá°áá»á¬áž ááŒáá·áºáá»áŸá¶áá±ááá·áºá¡ááŒá±á¡áá±ááᯠááŸá±á¬ááºááŸá¬ážáááºá¡ááœáẠááá·áºáááºáá»ááºáá áºáá¯ááᯠááááºáááºáá±ážáá«áááºá prefetch_limit. áá¬áá®á¡ááŒá±á¡áá±áá»á¬ážááœáẠprefetch_limit ááá¯ááºááœááºáá° áá áºáŠážááẠá¡áá¯ááºá¡á¬ážáá¯á¶ážááᯠáááºáá¶ááŒááºážá០áá¬ážáá®ážáá«áááºá
á á¬ááá¯áá±ážááá¯á·ááŒááºážááẠáááºážá á®ááŒááºážááŸáá·áº áŠážá á¬ážáá±ážáá¯ááºáá±á¬ááºááŒááºážááᯠá á®áá¶ááá·áºááœá²áá«áááºá áááá¯áááºáá¬áá»á¬ážááẠáááºážááá¯á·áá±á¬ááºááŸááá»áááºááœáẠá¡áá¯ááºáá»á¬ážááᯠáááºáá¶áááŸáááŒáááºá áá¯ááºáá±á¬ááºá áá¬ááᯠá¡á±á¬ááºááŒááºá áœá¬ ááŒá®ážááŒá±á¬ááºááá¯ááºááẠááá¯á·ááá¯áẠáá¡á±á¬ááºááŒááºááá¯ááºáááº-
messaging:ack(Tack)
- áááºáá±á·áá»áºááᯠá¡á±á¬ááºááŒááºá áœá¬ áá¯ááºáá±á¬ááºááŒá®ážáá«á áá±á«áºáááºámessaging:nack(Tack)
- á¡áá±ážáá±á«áºá¡ááŒá±á¡áá±á¡á¬ážáá¯á¶ážááœáẠáá±á«áºáááºá áá¯ááºáá±á¬ááºá áá¬ááᯠááŒááºááŒá®ážáááºááŸáá·áºá áááºáá±á·áá»áºááá¯á·ááŒááºážááẠáááºážááᯠá¡ááŒá¬ážááá¯ááºááœááºáá°áᶠáá±ážááá¯á·áááºááŒá áºáááºá
á¡áá¯ááºáá¯á¶ážáá¯ááá¯áá¯ááºáá±á¬ááºáá±á ááºááœáẠááŸá¯ááºááœá±ážáá±á¬áá»áá¯á·ááœááºážáá»ááºáá áºáᯠááŒá áºááœá¬ážáá²á·áááºááá¯áá«á áá¯á·- áááá¯áááºáᬠ1á áá¯ááºáááºážáá¬áááºááá¯áááºáá¶áááŸáááŒá®ážáá±á¬ááºá áá²ááŸááºááá·áºáá±áá¬ááá¯á· áááºááá·áºá¡áá¬ááá¯áá»áŸ ááááºážááá¯á·áááºá¡áá»áááºáááŸááá² áá»ááºáá»ááœá¬ážáááºááá¯áá«á áá¯á·á á€ááá á¹á ááœááºá ack timeout áá¯ááºáá¯á¶ážááŒá®ážáá±á¬áẠááœá±áá²ááœáá¯áá·áºááẠá¡áá¯ááºá¡á¬áž á¡ááŒá¬ážááá¯ááºááœááºáá°áᶠááœáŸá²ááŒá±á¬ááºážáá±ážáááºááŒá áºáááºá á¡ááŒá±á¬ááºážáá áºáá¯áá¯ááŒá±á¬áá·áº handler 3 ááẠá¡áá¯ááºá¡á¬áž á áœáá·áºááœáŸááºááŒá®áž nack ááá¯á·ááá¯ááºáááºá ááááºá¡áá±ááŒáá·áº áááºážááᯠá¡á±á¬ááºááŒááºá áœá¬ááŒá®ážááŒá±á¬ááºáá²á·áá±á¬ á¡ááŒá¬ážááá¯ááºááœááºáá°áá¶ááá¯á·áááºáž ááœáŸá²ááŒá±á¬ááºážáá±ážáá²á·áá«áááºá
ááá¬áá¡áá»ááºážáá»á¯ááº
áá»áœááºá¯ááºááá¯á·ááẠááŒáá·áºáá±ááá·áºá áá áºáá»á¬ážá á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠáá¯á¶ážáá»á¬ážááᯠáá¯á¶ážá¡á¯ááºáá¬ážááŒá®áž Erlang/Elixir ááœáẠáááºážááá¯á·áá¡áá¯á¶ážááŒá¯ááŸá¯ááá¯ááºáᬠá¡ááŒá±áá¶áá¬ážáááºááŸá¯ááᯠáááŸááá²á·áá«áááºá
á¡ááŒá±áá¶áá¯á¶á á¶áá»á¬ážááᯠáá±á«ááºážá ááºááŒááºážááŒáá·áº áá±á«áºáá±á«ááºáá¬áá±á¬ ááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážááẠááŸá¯ááºááœá±ážáá±á¬ áá«áá¬ááá¯ááºážáá»á¬ážááᯠáááºáá±á¬ááºááá¯ááºáááºá
á á®ážáá®ážááá±á¬ááºáá¯á¶ážá¡ááá¯ááºážááœááºá á ááºážáá¯á¶ážáá±ážáááºáá±á¬ááºááŸá¯áá»á¬ážá áááºážááŒá±á¬ááºážáááºááŸááºááŒááºážááŸáá·áº áá»áááºááœááºáá»áŸá¬ááŸáááŒááºážááá¯ááºáᬠá¡ááœá±ááœá±ááŒá¿áá¬áá»á¬ážááᯠááŒáá·áºááŸá¯áááºááŒá áºááŒá®áž á áá áºáá»á¬ážá á¡ááá¯ááºážá¡áá¬ááŸáá·áº á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááᯠáá¶ááá¯ááºáááºááŸáááŒááºážá áááºááœá±á·áá»áá±á¬áááºááŒááºážááá¯áááºáž ááœá±ážááœá±ážáá«áááºá
áá¯áááááá¯ááºáž ááŒá®ážáá«ááŒá®á
áá¬ááºáá¯á¶
websequencediagrams.com ááᯠá¡áá¯á¶ážááŒá¯á ááŒááºáááºáá¬ážáá±á¬ áá¯á¶áá»á¬áž
source: www.habr.com