Uvod u RabbitMQ

1. Pregled

Razdvajanje softverskih komponenata jedan je od najvažnijih dijelova dizajna softvera. Jedan od načina da se to postigne je korištenje sustava za razmjenu poruka koji pružaju asinkroni način komunikacije između komponenata (usluga). U ovom ćemo članku pokriti jedan od takvih sustava: RabbitMQ.

RabbitMQ je posrednik poruka koji implementira napredni protokol čekanja poruka (AMQP). Pruža klijentske knjižnice za glavne programske jezike.

Osim što se koristi za razdvajanje softverskih komponenata, RabbitMQ se može koristiti za:

  • Izvođenje pozadinskih operacija
  • Izvođenje asinkrone operacije

2. Model razmjene poruka

Prvo, hajde da brzo pogledamo kako funkcioniraju razmjene poruka na visokoj razini.

Jednostavno rečeno, postoje dvije vrste aplikacija koje komuniciraju sa sustavom za razmjenu poruka: proizvođači i potrošači. Proizvođači su oni koji brokeru šalju (objavljuju) poruke i potrošači koji primaju poruke od brokera. Obično se ovi programi (softverske komponente) izvode na različitim strojevima i RabbitMQ djeluje kao komunikacijski međuprodukt između njih.

U ovom ćemo članku razgovarati o jednostavnom primjeru s dvije usluge koje komuniciraju pomoću RabbitMQ-a. Jedna od usluga objavit će poruke na RabbitMQ, a druga će ih potrošiti.

3. Postavljanje

Za početak pokrenimo RabbitMQ koristeći službeni vodič za postavljanje ovdje.

Prirodno ćemo koristiti Java klijent za interakciju s RabbitMQ poslužiteljem; ovisnost Mavena za ovog klijenta je:

 com.rabbitmq amqp-klijent 4.0.0 

Nakon pokretanja posrednika RabbitMQ koristeći službeni vodič, moramo se povezati s njim pomoću java klijenta:

ConnectionFactory tvornica = nova ConnectionFactory (); factory.setHost ("localhost"); Priključak veze = factory.newConnection (); Kanal kanala = connection.createChannel (); 

Koristimo ConnectionFactory za postavljanje veze s poslužiteljem brine se i o protokolu (AMQP) i o provjeri autentičnosti. Ovdje se povezujemo na poslužitelj na lokalnihost, možemo izmijeniti ime hosta pomoću setHost funkcija.

Možemo koristiti setPort za postavljanje porta ako RabbitMQ Server ne koristi zadani port; zadani port za RabbitMQ je 15672:

factory.setPort (15678);

Možemo postaviti korisničko ime i lozinku:

factory.setUsername ("user1"); factory.setPassword ("Moja lozinka");

Nadalje, ovu ćemo vezu koristiti za objavljivanje i konzumiranje poruka.

4. Producent

Razmotrite jednostavan scenarij gdje web aplikacija omogućuje korisnicima dodavanje novih proizvoda na web mjesto. Svaki put kad se doda novi proizvod, kupcima moramo poslati e-poštu.

Prvo definirajmo red:

channel.queueDeclare ("products_queue", false, false, false, null);

Svaki put kad korisnici dodaju novi proizvod, objavit ćemo poruku u redu:

String message = "detalji proizvoda"; channel.basicPublish ("", "products_queue", null, message.getBytes ());

Na kraju zatvaramo kanal i vezu:

channel.close (); connection.close ();

Ovu će poruku konzumirati druga služba koja je odgovorna za slanje e-pošte kupcima.

5. Potrošač

Pogledajmo što možemo primijeniti na strani potrošača; proglasit ćemo isti red:

channel.queueDeclare ("products_queue", false, false, false, null);

Evo kako definiramo potrošača koji će asinkrono obrađivati ​​poruke iz reda:

DefaultConsumer potrošač = novi DefaultConsumer (kanal) {@Override public void handleDelivery (String consumerTag, omotnica omotnice, svojstva AMQP.BasicProperties, bajt [] body) baca IOException {String message = new String (body, "UTF-8"); // obradimo poruku}}; channel.basicConsume ("products_queue", true, potrošač);

6. Zaključak

Ovaj jednostavan članak obuhvatio je osnovne koncepte RabbitMQ-a i raspravio jednostavan primjer koji ga koristi.

Potpuna implementacija ovog vodiča može se naći u projektu GitHub.