RabbitMQ-viestintä ja asynkroniset järjestelmät · Oppitunti

Direct-exchange reititykseen

Oppikaa käyttämään Direct-exchangea viestien täsmälliseen reititykseen routing keyn perusteella. Reitittäkää viestit tiettyihin jonoihin kohdennettua käsittelyä varten.

Oppitunti 2/411 vaihetta

Direct-exchange reititykseen on ilmainen RabbitMQ-viestintä ja asynkroniset järjestelmät-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu RabbitMQ-viestintä ja asynkroniset järjestelmät-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. RabbitMQ-viestintä ja asynkroniset järjestelmät-kurssilla on yhteensä 4 oppituntia.

Johdatus Direct-exchangeen

Tervetuloa! Tässä oppitunnissa tutustumme RabbitMQ:n Direct-exchangeen. Se on tehokas väline viestien lähettämiseen tiettyihin jonoihin routing key -avaimen perusteella.

Ajatelkaa sitä postipalveluna, joka toimittaa kirjeet vain kirjekuoreen merkittyyn täsmälliseen osoitteeseen.

Mikä on routing key?

Routing key on merkkijonomuotoinen attribuutti, jonka tuottajat liittävät viesteihin. Se on viestin "osoite".

  • Tuottajat määrittävät routing keyn julkaisemisen yhteydessä.
  • Jonot sidotaan exchangeen yhden tai useamman routing keyn avulla.
  • Viestit toimitetaan jonoihin, joiden sidonta-avain vastaa täsmälleen viestin routing keytä.

Miten Direct-exchange toimii

Kun viesti saapuu Direct-exchangeen, se tarkistaa viestin routing keyn. Tämän jälkeen exchange toimittaa viestin kaikkiin jonoihin, jotka on sidottu siihen täsmälleen samalla routing keyllä.

Jos kyseisellä routing keyllä ei ole sidottu yhtään jonoa, exchange yksinkertaisesti hylkää viestin.

Tuottajan rooli: lähettäminen avainten avulla

Tuottajana päätätte jokaisen lähettämänne viestin reititysavaimen. Tämä avain määrittää, mikä kuluttaja (sidotun jononsa kautta) vastaanottaa viestin.

Näin voitte hallita viestien toimitusta tarkasti ja varmistaa, että vain asiaankuuluvat kuluttajat saavat tietyntyyppiset viestit.

Kuluttajan rooli: sitominen avaimilla

Kuluttajat määrittävät kiinnostuksensa viesteihin sitomalla jononsa Direct Exchangeen tiettyjen reititysavainten avulla.

Yksi jono voidaan sitoa useilla reititysavaimilla, jolloin se vastaanottaa viestejä, jotka vastaavat mitä tahansa näistä avaimista.

Koodi: tuottajan määritys ja ilmoitus

Määritetään perustuottaja, joka käyttää Direct Exchangea. Ilmoitetaan exchange nimeltä "direct_logs" tyypillä "direct".

Tämä koodi muodostaa yhteyden ja kanavan ja ilmoittaa sitten exchangen.

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class DirectProducerSetup {
    private static final String EXCHANGE_NAME = "direct_logs";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost"); // Assuming RabbitMQ is local

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            channel.exchangeDeclare(EXCHANGE_NAME, "direct");
            System.out.println("Exchange '" + EXCHANGE_NAME + "' declared.");

            // In a real app, you'd send messages here
            // For this setup example, we just declare.
        }
    }
}

Koodi: tuottajan lähettämä viesti

Lähetetään nyt viesti exchangeen "direct_logs". Määritetään reititysavain, esimerkiksi "error".

Suorittakaa tämä koodi, kun RabbitMQ-palvelin on käynnissä. Se julkaisee viestin määritetyllä avaimella.

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;

public class DirectProducerSend {
    private static final String EXCHANGE_NAME = "direct_logs";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost"); // Assuming RabbitMQ is local

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            channel.exchangeDeclare(EXCHANGE_NAME, "direct"); // Ensure exchange exists

            String routingKey = "error";
            String message = "A critical error occurred!";

            channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes(StandardCharsets.UTF_8));
            System.out.println(" [x] Sent '" + routingKey + ":'" + message + "'");
        }
    }
}

Koodi: kuluttajan määritys ja sitominen

Kuluttajan puolella luodaan jono ja sidotaan se exchangeen "direct_logs" reititysavaimella "error".

Tämä kuluttaja vastaanottaa vain viestejä, jotka on julkaistu reititysavaimella "error". Suorittakaa tämä kuluttaja ensin ja tuottaja sen jälkeen.

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

public class DirectConsumerError {
    private static final String EXCHANGE_NAME = "direct_logs";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost"); // Assuming RabbitMQ is local

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.exchangeDeclare(EXCHANGE_NAME, "direct");

        String queueName = channel.queueDeclare().getQueue(); // Create a non-durable, exclusive, auto-delete queue
        String bindingKey = "error";
        channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);

        System.out.println(" [*] Waiting for messages with routing key '" + bindingKey + "'. To exit press CTRL+C");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + delivery.getEnvelope().getRoutingKey() + ":'" + message + "'");
        };
        channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {});
    }
}

Useat sidonnat ja käyttötapaukset

Yksi jono voidaan sitoa samaan Direct Exchangeen useilla reititysavaimilla. Esimerkiksi "kriittisten hälytysten" jono voidaan sitoa sekä avaimella "error" että avaimella "warning", jolloin se vastaanottaa molemmat viestityypit.

Direct exchanget sopivat erinomaisesti esimerkiksi seuraaviin tilanteisiin:

  • Lokien jakaminen vakavuuden perusteella (esim. info, warn, error).
  • Sisäisten järjestelmätapahtumien reitittäminen tiettyihin käsittelymoduuleihin.
  • Päivitysten kohdistaminen tiettyihin käyttäjäsegmentteihin.

Pikatarkistus: suora reititys

Tarkastellaan Direct Exchangea nimeltä "my_exchange".

  • Jono A on sidottu reititysavaimella "report".
  • Jono B on sidottu reititysavaimella "alert".
  • Jono C on sidottu reititysavaimilla "report" ja "update".

Tuottaja lähettää exchangeen "my_exchange" viestin, jonka reititysavain on "report".

Kertaus: Direct Exchange

Hienoa! Olette oppineet, miten RabbitMQ:n Direct Exchange toimii.

  • Se reitittää viestit reititysavaimen tarkan täsmäytyksen perusteella.
  • Tuottajat liittävät jokaiseen viestiin reititysavaimen.
  • Kuluttajat sitovat jononsa exchangeen tiettyjen reititysavainten avulla vastaanottaakseen asiaankuuluvat viestit.
  • Tämä malli mahdollistaa viestien tarkan ja kohdennetun toimituksen.

Seuraavaksi tutustumme Fanout Exchangeen, joka lähettää viestit kaikkiin sidottuihin jonoihin reititysavaimesta riippumatta!

Aloita maksutta

Opi RabbitMQ-viestintä ja asynkroniset järjestelmät tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
11
Oppitunnit
44

Usein kysytyt kysymykset

Onko oppitunti ”Direct-exchange reititykseen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa RabbitMQ-viestintä ja asynkroniset järjestelmät-oppimispolun 3 oppituntia, myös oppitunnin “Direct-exchange reititykseen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. RabbitMQ-viestintä ja asynkroniset järjestelmät-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Direct-exchange reititykseen”?

Oppikaa käyttämään Direct-exchangea viestien täsmälliseen reititykseen routing keyn perusteella. Reitittäkää viestit tiettyihin jonoihin kohdennettua käsittelyä varten. Harjoittelet RabbitMQ-viestintä ja asynkroniset järjestelmät-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni RabbitMQ-viestintä ja asynkroniset järjestelmät-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin RabbitMQ-viestintä ja asynkroniset järjestelmät-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Direct-exchange reititykseen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä RabbitMQ-viestintä ja asynkroniset järjestelmät-oppitunnilla?

Kyllä. Jokainen RabbitMQ-viestintä ja asynkroniset järjestelmät-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Fanout-exchange pub/sub-viestintään
  2. Direct-exchange reititykseen
  3. Topic-exchange joustavaan reititykseen
  4. Oletusvaihdin ja implisiittiset sidonnat
← Takaisin: RabbitMQ-viestintä ja asynkroniset järjestelmät