Topic-exchange joustavaan reititykseen
Ottakaa Topic-exchange haltuun monimutkaisiin reititysmalleihin wildcard-hakujen avulla. Suunnitelkaa joustavia ja skaalautuvia viestien reititystopologioita.
Topic-exchange joustavaan reititykseen on ilmainen RabbitMQ-viestintä ja asynkroniset järjestelmät-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.
Topic Exchange: joustava reititys
Tervetuloa tutustumaan Topic Exchangeen! Tämä exchangetyyppi tarjoaa joustavimman tavan reitittää viestejä ja mahdollistaa viestien lähettämisen jonoihin monimutkaisten mallien perusteella.
Toisin kuin yksinkertainen Fanout tai täsmälliseen vastaavuuteen perustuva Direct Exchange, Topic exchanget käyttävät reititysavaimissa erityisiä jokerimerkkejä viestien dynaamiseen täsmäyttämiseen.
Topic-reititysavainten ymmärtäminen
Topic exchangessa reititysavainten ei tarvitse täsmätä tarkasti. Ne ovat pisteillä (.) eroteltuja sanoja sisältäviä merkkijonoja, aivan kuten tiedostonimen tai URL-osoitteen osat.
- Esimerkki:
animal.rabbit.fast - Esimerkki:
log.error.database
Jokainen sana ilmaisee yhden yksityiskohtaisuustason, mikä mahdollistaa hierarkkisen reitityksen.
Yhden sanan jokerimerkki: `*`
Asteriskijokerimerkki (*) vastaa reititysavaimen osassa täsmälleen yhtä sanaa.
- Sidonta-avain:
animal.*.fastvastaa avaintaanimal.rabbit.fast - Sidonta-avain:
animal.*.fastei vastaa avaintaanimal.dog.lazy.fast(liikaa sanoja) - Sidonta-avain:
*.error.*vastaa avaintalog.error.database
Se sopii erinomaisesti tietyn kohdan täsmäyttämiseen avaimessa.
Nolla tai useampi -jokerimerkki: `#`
Ruutujokerimerkki (#) vastaa reititysavaimessa nollaa tai useampaa sanaa. Se on paljon tehokkaampi kuin *.
- Sidonta-avain:
log.#vastaa avaimialog.error,log.info.webjalog.debug.cache.entry - Sidonta-avain:
animal.#vastaa avaimiaanimal.rabbitjaanimal.cat.sleepy
Käyttäkää #-merkkiä kaikkien tietyn mallin alulla alkavien viestien vastaanottamiseen.
Tuottaja: Topic Exchangen ilmoittaminen
Ensin tuottajan on ilmoitettava Topic Exchange. Tyypiksi määritetään yksinkertaisesti "topic".
Suorittakaa tämä koodinpätkä exchangen määrittämiseksi:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class TopicProducerSetup {
private static final String EXCHANGE_NAME = "topic_logs";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // Connect to local RabbitMQ
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
System.out.println("Topic exchange '" + EXCHANGE_NAME + "' declared.");
}
}
}Tuottaja: viestien lähettäminen
Lähetetään nyt viestejä eri reititysavaimilla. Exchange käyttää näitä avaimia päättäessään, mitkä jonot vastaanottavat viestit.
Huomaatte, että avaimet on erotettu pisteillä, mikä mahdollistaa yksityiskohtaiset luokat.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;
public class TopicMessageSender {
private static final String EXCHANGE_NAME = "topic_logs";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
sendMessage(channel, "animal.rabbit.fast", "A fast rabbit runs.");
sendMessage(channel, "animal.cat.sleepy", "A sleepy cat naps.");
sendMessage(channel, "log.error.db", "Database connection failed!");
sendMessage(channel, "log.info.web", "User logged in.");
System.out.println("Sent various topic messages.");
}
}
private static void sendMessage(Channel channel, String routingKey, String message) throws Exception {
channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + routingKey + ":'" + message + "'");
}
}Kuluttaja: sitominen merkillä `*`
Kuluttajat sitovat jononsa Topic Exchangeen käyttämällä sidonta-avaimia, jotka voivat sisältää jokerimerkkejä. Tämä kuluttaja käyttää avainta *.orange.*.
Se vastaanottaa esimerkiksi viestin animal.orange.fast, mutta ei viestejä fruit.apple.sweet tai animal.orange.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class TopicConsumerOrange {
private static final String EXCHANGE_NAME = "topic_logs";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
String queueName = channel.queueDeclare().getQueue();
String bindingKey = "*.orange.*"; // Matches e.g., 'animal.orange.fast'
channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);
System.out.println(" [x] Waiting for messages matching: '" + bindingKey + "'");
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 -> {});
}
}Kuluttaja: sitominen merkillä `#`
Tämä kuluttaja käyttää sidonta-avainta log.#. Se tarkoittaa, että kuluttaja vastaanottaa kaikki viestit, joiden reititysavain alkaa merkkijonolla log., riippumatta seuraavien sanojen määrästä.
Tämä on erittäin hyödyllistä esimerkiksi lokijärjestelmissä, joissa tietylle luokalle voidaan tarvita kaiken vastaanottava kuuntelija.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class TopicConsumerLogs {
private static final String EXCHANGE_NAME = "topic_logs";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
String queueName = channel.queueDeclare().getQueue();
String bindingKey = "log.#"; // Matches e.g., 'log.error.db', 'log.info.web'
channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);
System.out.println(" [x] Waiting for messages matching: '" + bindingKey + "'");
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 -> {});
}
}Topic Exchangen käyttötapaukset
Topic exchanget ovat parhaimmillaan tilanteissa, joissa tarvitaan joustavaa ja hierarkkista reititystä:
- Lokijärjestelmät: Lokien reitittäminen vakavuuden, lähteen ja komponentin perusteella (esim.
app.error.auth,app.info.payment). - Reaaliaikaiset tietovirrat: Sensoritietojen suodattaminen (esim.
sensor.room1.temp,sensor.room2.humidity). - Sisällön jakelu: Uutisartikkeleiden toimittaminen tilaajille, joita kiinnostavat tietyt luokat tai alueet.
Ne tarjoavat tarkan hallinnan viestien kulkuun.
Topic-reitityshaaste
Tarkastellaan seuraavia viestejä ja sidonta-avaimia. Mitkä viestit toimitetaan jonoon, joka on sidottu avaimella animal.*.#.fast?
Kertaus: Topic Exchangen teho
Olette nyt hallinnut Topic Exchangen käytön! Se on erittäin tehokas työkalu joustavien ja skaalautuvien viestintäarkkitehtuurien rakentamiseen.
- Käyttää pisteillä eroteltuja reititysavaimia.
*vastaa täsmälleen yhtä sanaa.#vastaa nollaa tai useampaa sanaa.- Sopii erinomaisesti lokitukseen, reaaliaikaiseen analytiikkaan ja sisällön suodattamiseen.
Jokerimerkkejä käyttämällä voitte luoda kehittyneitä reitityssääntöjä ja varmistaa, että viestit päätyvät juuri oikeisiin kohteisiin.
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 ”Topic-exchange joustavaan 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 “Topic-exchange joustavaan 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 ”Topic-exchange joustavaan reititykseen”?
Ottakaa Topic-exchange haltuun monimutkaisiin reititysmalleihin wildcard-hakujen avulla. Suunnitelkaa joustavia ja skaalautuvia viestien reititystopologioita. 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 3/4.
Kuinka kauan ”Topic-exchange joustavaan 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
- Fanout-exchange pub/sub-viestintään
- Direct-exchange reititykseen
- Topic-exchange joustavaan reititykseen
- Oletusvaihdin ja implisiittiset sidonnat