áááºá¹ááá¬ááŸááá±á¬áá±á·áááºáááºážáá« Habr! áá»áœááºáá±á¬áºá
á¯áá±á¬ááºážáá¬ážáá²á·áá±á¬ ááá¯áá¯áá
á¬á¡á¯ááºáá±ážáá
áºá¡á¯ááºááᯠáá»áŸáá±áá±ážáá»ááºáá«áááºá RabbitMQ
á¡ááŒá¶ááŒá¯áá»ááºáá»á¬ážááŸáá·áº áááá¯á¶ážáá»á¯ááºáá»ááºáá»á¬ážá¡ááŒá
Ạáá±á«ááºážá
ááºážáá«á
áá¬áááá¬
- RabbitMQ á¡ááá¯ááºáž áá áááá«ááºážá Erlangá AMQP ááŸáá·áº RPC
- RabbitMQ á¡ááá¯ááºáž 2á áá¬ážáááºááŸá¯áááŸááºááŸá¯áá»á¬áž
- RabbitMQ á¡ááá¯ááºáž áá áááºážá á®ááŒááºážááŸáá·áº á ááºážááŸá±á¬ááºááŒááºážááᯠáá¬ážáááºááŒááºážá
- RabbitMQ á¡ááá¯ááºáž 4á áááºáá±á·áá»áºáá»á¬ážááŸáá·áº áá±á¬ááºáá»á¬ážááᯠáá¬ážáááºááŒááºážá
- RabbitMQ á¡ááá¯ááºáž 5- áá¯ááºáá±ááŒááºážááŸáá·áº á¡áá¯á¶ážááŒá¯ááŒááºáž áááºáá±á·áá»áºá áœááºážáá±á¬ááºáááº
- RabbitMQ á¡ááá¯ááºáž 6á á¡áááºážáá»á¯ááºááŸáá·áº áá±á«áºááŒá¬áž áá±á¬áºáá»á°ážáá»á¬ážá ááŒá¯á¶áá¯á¶áá¯á¶ážáááºáá»ááº
- RabbitMQ á¡ááá¯ááºáž áá áá»áááºáááºááŸá¯ááŸáá·áº Chanel á¡ááŒá±á¬ááºážá¡áá±ážá áááº
- RabbitMQ á¡ááá¯ááºáž áá .NET ááœáẠRabbitMQ
- RabbitMQ á¡ááá¯ááºáž áá á á±á¬áá·áºááŒáá·áºáá±á·áá¬ááŒááºážá
AMQP á¡ááŒá±á¬ááºáž á¡ááá¯áá»á¯ááº
AMQP (Advanced Message Queuing Protocol) ááẠá áá áºá¡á áááºá¡ááá¯ááºážáá»á¬ážá¡ááŒá¬áž áááºáá±á·áá»áºáá»á¬áž ááá¯á·ááœáŸááºááŒááºážá¡ááœáẠá¡ááœáá·áºáááá¯ááá¯áá±á¬áá áºáá¯ááŒá áºáááºá á¡ááŒá±áá¶á¡áá°á¡áááŸá¬ áá áºáŠážáá»ááºážá áá áºááœá²áá»á¬áž (ááá¯á·ááá¯áẠáá®ážááŒá¬ážá¡ááá®áá±ážááŸááºážáá»á¬áž) ááẠáááºážááŒá±á¬ááºážáááºážááŒá±á¬ááºážááá¯áá¯ááºáá±á¬ááºáá±ážááá·áº AMQP ááœá²á á¬ážááŸáá áºááá·áº áááºáá±á·áá»áºáá»á¬ážááᯠááááºáááᯠáááŸááºááá¯ááºáááºá áá±ážááá¯á·ááŸá¯ááᯠá¡á¬ááá¶ááá¯ááºáááºá áá±áá¬á á®ážááŒá±á¬ááºážáá»á¬ážááᯠááŒáá·áºáá±áá±ážááŒá®áž ááá¯áá»ááºáá±á¬áááºáá±á·áá»áºá¡áá»áá¯ážá¡á á¬ážáá»á¬ážááá¯á· á á¬áááºážáá±ážááœááºážááá¯ááºáá«áááºá
protocol ááᯠAMQP
á¡áá°á¡ááá¯á¶ážáá¯ááᯠááááºáááºáá±ážáááº-
exchange
( exchange point or exchange ) - áááºáá±á·áá»áºáá»á¬áž áá±ážááá¯á·áááºá áá²ááŸááºááœáá¯áá·áº ááááºážá áá¬ážááŒáá·áºáá±áááºá áá áºáᯠááá¯á·ááá¯áẠáá áºáá¯áááºááá¯áá±á¬ áááºážá á®ááŒááºážááœáẠáá°á á á¬ááá¯áá»á¬ážááᯠáááºážá á®ááẠáááºážááŒá±á¬ááºážáá±ážáááºá áááºáá®ážáá¬ážáá±á¬ááá·áºááºáá»á¬ážááᯠá¡ááŒá±áá¶á (binding
) áá°áá²á· áá°áááºážááŒá¬ážqueue
(Queue) - áá áºáẠááá¯á·ááá¯áẠRAM ááœáẠáá±áá¬ááœá²á·á ááºážáá¯á¶ áááºáá±á·ááºá»áá»á¬ážááá¯á· ááá·áºááºáá»á¬ážááᯠááááºážáááºážáá¬ážááŒá®áž áááºáá±á·áá»áºáá»á¬ážááᯠáá±á¬áºáá®áá»á¬áž áá±ážáááºáconsumers
(á á¬ážáá¯á¶ážáá°áá»á¬ážá¡ááœááº)binding
(binding) - á ááºážáá»á¥áºážáá áºáᯠá€á á¬ááá¯áá»á¬ážáᶠáááºážá á®áááá·áºáá±áá¬ááᯠáá»áááºážááá¯áááºá
áááá¯ááá¯áá±á¬ááẠá¡áá±á«áºá០áááºáááºáááºá
Erlang á¡ááŒá±á¬ááºáž á¡ááá¯áá»á¯ááº
ááá±á¬áá»ááºá á¡áááºážá¡ááŒá
áºáá¯ááºááẠááá¯ááŸá±á¬ááºáá¬áá±áá¬á ááŸááá±áááºá
Erlang
áá¯áá¹ááá®ááŸáá®ááœááºáááºáEricsson
1980% uptime ááá¯á¡ááºáá±á¬ application áá»á¬ážá¡ááœáẠááŒáá·áºáá±ááŸá¯á á¡ááŸá¬áž-áá¶ááá¯ááºáááºááŸááá±á¬á real-time á áá áºá¡ááŒá Ạ99,999 áá¯ááŸá áºáá»á¬ážá¡áááºááá¯ááºážááœááºáErlang
á ááºááŸá¯áá¯ááºáááºážá¡áá»áá¯ážáá»áá¯ážááŸáá·áº áá±ááºáá®á¡áá¯á¶ážáá»áááá¯ááááºáá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯áá±á¬á á¥ááá¬áFacebook á áá±á«áºáᬠáá áá®áá®áá¶áá²á· áááºáá°áá¬ážáá²á· WhatsApp áááºáá±á¬ááºááŸá¯áá«á
RabbitMQ á¡ááŒá±á¬ááºáž á¡áá»ááºážáá»á¯ááº
RabbitMQ
áááá¯ááá¯áá±á¬ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®áž ááŒáá·áºá
áœááºáá«á AMQP
.
á
á¬ááá¯áá±ážááá¯á·ááŸá¯áá¯á¶á
á¶á á¡ááá á
áááºáá°ážááŒá
áºáááºá RabbitMQ
á¡áá¬ááŒá
áºááẠproducer
(áá¯ááºáá±áá°) ááẠáááºážá
á®ááẠá
á¬ááá¯áá»á¬ážááᯠááá¯ááºááá¯ááºáááá¯á·áá«á ááááºáá±á¬á·á áááŒá¬ááááá¯áááá¯á áá¯ááºáá±áá°ááẠáááºáá±á·áá»áºááᯠáááºááá·áºá
á¬áááºážááá¯á· áá±ážááá¯á·áááºááá¯áááºááá¯ááẠááááá«á
áááºážá¡á á¬ážá áá¯ááºáá±áá°ááẠáááŸááºááŸá¯áá¶ááá¯á· áááºáá±á·áá»áºáá»á¬ážáᬠáá±ážááá¯á·ááá¯ááºáááºá áá áºáááºááœááºá áá²ááŸááºáá°ááẠáá¯ááºáá±áá°áá»á¬ážáá¶á០áááºáá±á·áá»áºáá»á¬ážááᯠáááºáá¶áááŸáááŒá®áž áá áºáááºááœáẠáááºážááá¯á·á¡á¬áž áááºážá á®ááẠáá±ážááá¯á·áááºá áá²ááŸááºáá°ááẠáááºáá¶áááŸááá±á¬ áááºáá±á·áá»áºááŸáá·áº áá¬áá¯ááºááááºááᯠá¡ááá¡áá» ááááá«áááºá áááºááŸááºáá¬ážáá±á¬ áááºážá á®áá áºáá¯ááá¯á· ááá·áºááá·áºáá«ááá¬ážá áááºážááᯠáááºážá á®á¡áá»á¬ážá¡ááŒá¬ážááœáẠááá·áºááá·áºáá«ááá¬ážá ááá¯á·ááá¯áẠáááºáá±á·áá»áºááᯠáá áºáá»á°ááŸá¯ááá·áºáááºá
á¡áá¯ááºá¡áá»ááºáž RabbitMQ
á¡á±á¬ááºáá«á¡ááá¯ááºáž áá±á¬áºááŒááá¯ááºáá«áááºá
- áá¯ááºáá±áá°ááẠáá®ážááŒá¬ážáááŸááºááŸá¯áá áºáá¯áᶠáááºáá±á·áá»áºáá±ážááá¯á·áááºá
- áááºáá±á·áá»áºáááºáá¶áááŸáááŒá®ážáá±á¬áẠáááŸááºááŸá¯áá áºáá¯ááẠáááºážááŸáá·áº áááºážá á®ááŒá¬ážááœáẠá ááºážááŸá±á¬ááºáá¬ážáá±á¬ á ááºážáá»ááºážáá»á¬ážááŸáá·áºá¡áá® áá áºáᯠááá¯á·ááá¯áẠáá áºáá¯áááºááá¯áá±á¬ áááºážá á®áá»á¬ážááá¯á· áááºážááŒá±á¬ááºážáá±ážáááº
- áááºážá á®ááẠá€áááºáá±á·áá»áºá¡ááœáẠáááºááœáŸááºážáá»ááºááᯠááááºážáááºážáá¬ážáááºá áááºáá±á·áá»áºááᯠRAM ááá¯á·ááá¯áẠáá áºááºááœáẠááááºážáááºážáá¬ážáááºá
- á á¬ážáá¯á¶ážáá°ááẠáááºážá á®áá±ááá·áº áááºáá±á·áá»áºááᯠáááºáá¶ááẠá¡áááºááá·áºááŒá áºáá±á¬á¡áá«á áá¬áá¬ááẠááá·áºááºááŸáá áºááá·áº áááºáá±á·áá»áºáá áºá á±á¬ááºááᯠáááºáá®ážááŒá®áž áá±ážááá¯á·áááº
- á á¬ážáá¯á¶ážáá°ááẠáááºáá±á·ááºá»ááᯠáááºáá¶áááŸáááŒá®áž ááœá²á á¬ážáᶠá¡áááºááŒá¯áá»áẠáá±ážááá¯á·áááºá
- ááœá²á á¬ážááẠá¡áááºááŒá¯áá»ááºáááŸáááŒá®ážáá±á¬áẠáááºážá á®ááá¬ážá០á á¬áá áºá á±á¬ááºááᯠáááºááŸá¬ážáááºá ááá¯á·áá±á¬áẠRAM ááŸáá·áº disk ááŸáá»ááºáá áºáááºá
CPR
ááŒá
áºá
áẠRabbitMQ
. á¥ááá¬á¡á¬ážááŒáá·áºá áá±á¬ááºáááºá á¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážááŸáá·áº áááºáááºá áááŠáž ááœá±ážááœá±ážááŸá¯áá»á¬áž RabbitMQ
á¡áá»áá¯á·áá±á¬ áá¯ááºáááºážá
ááºááᯠááá¯ááºááŒáááºá RPC
. á€á¡á
á®á¡á
á¥áºááŒá®ážáááºááŸáá·áºá RabbitMQ
áá±á¬ááºáááºáá¶á០áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠáááºáá¶ááẠá¡áááºááá·áºááŒá
áºáááá·áºáááº-
áááºááŸááºáá»ááºáá²ááŸá¬áááºážáá«áááºá AMQP
client ááŸáá·áº server ááŸá
áºáá¯áá¯á¶ážááẠcommand áá»á¬ážááá¯áá¯ááºáá±ážááá¯ááºáááºá ááá¯ááá¯áááºááŸá¬ client ááẠserver ááŸáá·áº áááºááœááºááẠá
á±á¬áá·áºááá¯ááºážáá±áá«áááºá Command áá»á¬ážááẠclass ááŸáá·áº method áá»á¬ážááŒá
áºáááºá á¥ááá¬á¡á¬ážááŒááºá·, Connection.Start
- áááºážáááºážáá±á«áºááá¯ááŸá¯ Start
клаÑÑа Connection
.
áá»áááºáááºááŸá¯ááŸáá·áº áá»ááºáááºáá»á¬áž
client ááŸáá·áº server á¡ááŒá¬áž ááááºážá¡áá»ááºá¡ááẠáááŸááºáááºá¡ááœááºá ááá¯ááºážáá»á¬áž. áá»ááºáááºáá»á¬ážááᯠá¡ááœááºážááœáẠáááºáá®ážáá¬ážáááºá áá®ážááŒá¬ážáá»áááºáááºááŸá¯. áá»ááºáááºáá áºáá¯á á®ááᯠá¡ááŒá¬ážáá»ááºáááºáá»á¬ážá០áá®ážááŒá¬ážááœá²áá¬ážáááºá synchronous case ááœááºá áá¯á¶á·ááŒááºááŸá¯ááááŸáááá»ááºáž áá±á¬áẠcommand ááᯠexecute áá¯ááºááááá«á
áá»ááºážááŒáá¯ááºáá»á¬áž áá±ážááá¯á·ááá¯ááºáááºá ááá¯ááºážáá»á¬ážá
áœá¬ááᯠááœáá·áºááá«áááºá áá»ááºáááºáá
áºáá¯á
á®ááẠáá®ážááŒá¬ážáááºáá®ážáááºá Erlang
áá¯ááºáááºážá
ááºá áá»áááºáááºááŸá¯áá
áºáá¯ááœáẠáá»ááºáááºáá»á¬ážá
áœá¬ááŸáááá¯ááºááẠ(
áá»áááºáááºááŸá¯ááŸáá·áº áá»ááºáááºááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá ááá¯ážááŸááºážáá±á¬ á¥ááá¬áá
áºáá¯
// ...
private void TryConnect()
{
var factory = new ConnectionFactory()
{
HostName = "host_name",
UserName = "user_name",
Password = "p@ssword",
// ÐклÑÑеМОе авÑПЌаÑОÑекПгП вПÑÑÑаМПвлеМОÑ
// ÑÐŸÐµÐŽÐžÐœÐµÐœÐžÑ Ð¿ÐŸÑле ÑбПев ÑеÑО
AutomaticRecoveryEnabled = true
};
_connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
_channel = _connection.CreateModel();
// other options
}
áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯á á®á¡ááœáẠáá»áááºáááºááŸá¯á¡áá áºáá áºáá¯ááœáá·áºááŒááºážááẠá€á¡áá»ááºááŒá±á¬áá·áº ááŒááºážáááºá áœá¬ á áááºáá¬ááºáá»áá«áááºá ááŒáá·áºáá¬ážáá±á¬áá¯ááºáá»á ááááºáá»á¬ážááŒá áºáá±á«áºá á±áááºá. áá»ááºáááºáá»á¬ážáááºáááºáž áááºááŸááá±ááá·áºáááºá ááá¯á·áá±á¬áº áááá¯ááá¯áá±á¬ á¡ááŸá¬ážá¡ááœááºážáá»á¬ážá áœá¬ááẠáá»ááºáááºááᯠááááºááœá¬ážá á±áááºá ááá¯á·ááŒá±á¬áá·áº áá»ááºáááºááááºáááºážááẠáá»áááºáááºááŸá¯ááẠááá¯ááá¯ááá¯ááºáá«áááºá
RabbitMQ ááᯠáááºááŸá¬áá¯á¶ážáá¬áá²á
microservices áá¡ááŒá±á¡áá±ááœááºá áááá¯ááá¯áá±á¬ AMQP
ááŸáá·áºáááºážáá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á¡ááœáẠRabbitMQ
áááŒá¬ááá¡áá¯á¶ážááŒá¯áááºá á¡ááŒáá¯ááºá¡ááá¯áẠá¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯ áááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááŒá¬ážá
á
áá¬ážá
ááºááááẠIIOT
áááá¯ááá¯áá±á¬ AMQP
ááŸáá·áºáááºážáá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á¡ááœáẠRabbitMQ
áá¬áá¬áá»á¬áž (áá¬áá¬-áá¬áá¬) áá»á¬ážá¡ááŒá¬áž áá±áá¬áááŸááºáááºá¡ááœáẠá¡áá¯á¶ážááŒá¯áááºá ááááºá¡ááºááá¯áááºáž áá¯á¶ážáá«á
áá±á¬ááºáá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááá¯á·ááẠExchanges ááᯠááá¯ááá¯á¡áá±ážá áááºáá¬ážáááºááẠá áááºáá«áááºá
ááá¯ážáá¬áž
source: www.habr.com