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

Yksinomaiset kuluttajat ja kuluttajien prioriteetti

Tutustukaa yksinomaisiin kuluttajiin omistettuun jonokäsittelyyn sekä kuluttajien prioriteettiin painotettua viestien jakelua varten. Hienosäätäkää viestien toimitustapaa kuluttajillenne.

Oppitunti 3/411 vaihetta

Yksinomaiset kuluttajat ja kuluttajien prioriteetti 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.

Dedikoitu viestien käsittely

Viestiohjattuja järjestelmiä suunniteltaessa tarvitaan joskus erityistä hallintaa viestien käsittelyyn. Tämä voi tarkoittaa esimerkiksi sitä, että yksi tietty kuluttaja käsittelee tehtävän tai että tietyt kuluttajat saavat viestejä ennen muita.

Tässä oppitunnissa tutustumme kahteen tehokkaaseen RabbitMQ:n ominaisuuteen: Exclusive Consumers ja Consumer Priority. Niiden avulla viestien toimitusta voidaan hienosäätää.

Exclusive Consumers -kuluttajiin tutustuminen

Exclusive consumer on erityinen kuluttajatyyppi, joka varaa jonon yksinomaiseen käyttöönsä. Kun exclusive consumer alkaa kuluttaa viestejä jonosta, muut kuluttajat (exclusive- tai muut kuluttajat) eivät voi muodostaa yhteyttä tähän jonoon.

  • Taattu yksinoikeus: Vain yksi kuluttaja käsittelee koskaan kyseisen jonon viestejä.
  • Järjestyksen varmistaminen: Hyödyllinen tehtävissä, joissa viestien järjestys on kriittinen ja useiden kuluttajien aiheuttamat kilpailutilanteet halutaan välttää.
  • Ei kilpailua: Jonon käyttöön liittyvää monimutkaista lukitus- tai synkronointilogiikkaa ei tarvita.

Koodi: exclusive consumer -kuluttajan määrittäminen

Kuluttajasta tehdään exclusive consumer yksinkertaisesti asettamalla exclusive-lipun arvoksi true, kun kutsutaan basicConsume-metodia. Kokeilkaa suorittaa tämä koodi ja käynnistäkää sitten toinen saman kuluttajan instanssi. Mitä tapahtuu?

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

public class ExclusiveConsumer {
    private final static String QUEUE_NAME = "exclusive_tasks";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Exclusive Consumer. Waiting for messages.");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
            System.out.println(" [x] Received by EXCLUSIVE: '" + message + "'");
        };

        // Set 'exclusive' flag to true
        channel.basicConsume(QUEUE_NAME, true, "my_unique_consumer_tag", true, true, null, deliverCallback, consumerTag -> {});
    }
}

Exclusive consumer -kuluttaja: hyvät ja huonot puolet

Exclusive consumer -kuluttajilla on ainutlaatuisia etuja, mutta niiden käyttöön liittyy myös huomioitavia seikkoja:

  • Hyvä puoli: Varmistaa viestien tarkan järjestyksen ja estää samanaikaiseen käsittelyyn liittyvät ongelmat.
  • Hyvä puoli: Yksinkertaistaa sovelluslogiikkaa, koska viestien samanaikaista käyttöä ei tarvitse hallita.
  • Huono puoli: Luo yhden vikaantumispisteen. Jos exclusive consumer -kuluttaja lakkaa toimimasta, toinen kuluttaja ei voi ottaa sen tehtäviä, ennen kuin se käynnistetään uudelleen tai yksinoikeus vapautetaan.
  • Huono puoli: Rajoittaa kyseisen jonon skaalautuvuutta, koska kuorman jakamiseen ei voi lisätä kuluttajia.

Käyttäkää niitä kriittisiin, järjestystä edellyttäviin tehtäviin, joissa korkea käytettävyys ei ole tämän tietyn jonon ehdoton tärkein tavoite.

Kuluttajien prioriteetin ymmärtäminen

Kuluttajan prioriteetin avulla voidaan vaikuttaa siihen, mikä kuluttaja vastaanottaa viestin ensin, kun useat kuluttajat kilpailevat saman jonon viesteistä. Se on kuin joillekin kuluttajille annettu "ohituskaista".

  • Painotettu jakelu: Kuluttajat, joiden prioriteetti on suurempi, saavat viestejä ennen kuluttajia, joiden prioriteetti on pienempi.
  • Ei takuu: Kyse on RabbitMQ:lle annettavasta vihjeestä, ei ehdottomasta takuusta. Jos kaikki korkean prioriteetin kuluttajat ovat varattuja, viestejä lähetetään edelleen pienemmän prioriteetin kuluttajille.
  • Round-robin saman prioriteetin sisällä: Jos useilla kuluttajilla on sama korkein prioriteetti, viestit jaetaan niiden kesken vuorotellen.

Koodi: kuluttajan prioriteetin asettaminen

Kuluttajan prioriteetti asetetaan välittämällä argumentti basicConsume-metodille. Argumentin avain on x-priority ja sen arvo on kokonaisluku. Suurempi luku tarkoittaa korkeampaa prioriteettia.

Kokeilkaa suorittaa tämä kuluttaja prioriteetilla 10. Käynnistäkää sitten toinen instanssi prioriteetilla 5. Lähettäkää muutama viesti. Kumpi kuluttaja saa ne?

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class PriorityConsumer {
    private final static String QUEUE_NAME = "priority_queue";
    private final static int CONSUMER_PRIORITY = 10; // This consumer's priority

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Priority Consumer (P=" + CONSUMER_PRIORITY + ") waiting for messages.");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
            System.out.println(" [x] Received by P" + CONSUMER_PRIORITY + ": '" + message + "'");
        };

        Map<String, Object> consumerArgs = new HashMap<>();
        consumerArgs.put("x-priority", CONSUMER_PRIORITY);

        // Pass consumerArgs to basicConsume
        channel.basicConsume(QUEUE_NAME, true, "priority_consumer_tag", false, false, consumerArgs, deliverCallback, consumerTag -> {});
    }
}

Prioriteetin toiminta käytännössä

Kun viesti saapuu jonolle, jolla on useita kuluttajia:

  1. RabbitMQ tarkistaa kuluttajat, joilla on korkein prioriteetti.
  2. Se yrittää toimittaa viestin yhdelle näistä korkeimman prioriteetin kuluttajista.
  3. Jos korkeimman prioriteetin kuluttajia on useita ja ne ovat käytettävissä, RabbitMQ jakaa viestit niiden kesken vuorotellen.
  4. Jos korkean prioriteetin kuluttajia ei ole käytettävissä (esimerkiksi koska ne käsittelevät muita viestejä tai niiden yhteys on tilapäisesti katkennut), RabbitMQ yrittää toimittaa viestin seuraavaksi korkeimman prioriteetin ryhmälle ja jatkaa samalla tavalla.

Näin tärkeimmät kuluttajasi saavat viestit käsiteltävikseen ensisijaisesti.

Eksklusiivisuus vai prioriteetti: milloin kumpaakin käytetään

Nämä kaksi ominaisuutta ratkaisevat eri ongelmia:

  • Eksklusiiviset kuluttajat: Ihanteellisia tilanteissa, joissa jonon käsittely on annettava ehdottomasti yhdelle kuluttajalle, esimerkiksi yksittäisen resurssin hallinnassa tai kriittisten komentojen tiukan järjestyksen varmistamisessa. Skaalautuvuudesta tingitään tiukan hallinnan saavuttamiseksi.
  • Kuluttajien prioriteetti: Sopii parhaiten työmäärän jakamiseen kilpailevien kuluttajien joukolle, jossa jotkin kuluttajat ovat muita tärkeämpiä tai pystyvät käsittelemään viestejä nopeammin. Näin käsittely voidaan järjestää tasoihin ilman, että kokonaisvaltaisesta skaalautuvuudesta tingitään.

Huomautus: Eksklusiivisella kuluttajalla on implisiittisesti korkein prioriteetti, koska se on *ainoa* kuluttaja. Prioriteetin määrittäminen eksklusiiviselle kuluttajalle on tarpeetonta.

Käytännön käyttötapaukset

Tarkastellaan seuraavia esimerkkejä:

  • Eksklusiivinen kuluttaja: Taloustoimintojen käsittelyyn tarkoitettu jono, jossa jokainen tapahtuma on käsiteltävä peräkkäin yhden erillisen työntekijän toimesta kaksoisveloitusten tai kilpailutilanteiden estämiseksi.
  • Kuluttajien prioriteetti: Järjestelmä, jossa on premium- ja perustason käyttäjiä. Korkean prioriteetin kuluttajat määritetään käsittelemään premium-käyttäjien pyynnöt nopeammin, kun taas alemman prioriteetin kuluttajat käsittelevät perustason pyynnöt, kun premium-pyyntöjä ei enää ole jonossa.
  • Kuluttajien prioriteetti (2): Eräkäsittely. Käytettävissä voi olla muutama tehokas, korkean prioriteetin kuluttaja kiireellisiä eriä varten sekä useita alemman prioriteetin kuluttajia tavallisia ja vähemmän kiireellisiä eriä varten.

Pikakertaus

Käytössäsi on RabbitMQ-jono nimeltä important_events. Haluat varmistaa, että vain yksi tietty sovellusinstanssi käsittelee tämän jonon viestejä kerrallaan, jolloin viestien järjestys säilyy tarkasti eikä mikään muu sovellus voi kuluttaa niitä. Mitä ominaisuutta kannattaa käyttää?

Kertaus ja seuraavat vaiheet

Hienoa työtä! Olet oppinut hienosäätämään viestien toimitusta edistyneiden kuluttajasäätimien avulla:

  • Eksklusiiviset kuluttajat antavat yhdelle kuluttajalle yksinoikeuden jonoon ja varmistavat tiukan järjestyksen ilman kilpailua.
  • Kuluttajien prioriteetin avulla voit suosia tiettyjä kuluttajia, kun useat kuluttajat kilpailevat saman jonon viesteistä.

Näiden ominaisuuksien ymmärtäminen auttaa rakentamaan vankempia ja älykkäämpiä viestintäjärjestelmiä sekä mukauttamaan viestien kulun sovelluksesi tarpeisiin. Seuraavaksi voit tutustua siihen, miten viestit varmistetaan säilymään, vaikka välittäjä käynnistyisi uudelleen.

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 ”Yksinomaiset kuluttajat ja kuluttajien prioriteetti” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa RabbitMQ-viestintä ja asynkroniset järjestelmät-oppimispolun 3 oppituntia, myös oppitunnin “Yksinomaiset kuluttajat ja kuluttajien prioriteetti”. 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 ”Yksinomaiset kuluttajat ja kuluttajien prioriteetti”?

Tutustukaa yksinomaisiin kuluttajiin omistettuun jonokäsittelyyn sekä kuluttajien prioriteettiin painotettua viestien jakelua varten. Hienosäätäkää viestien toimitustapaa kuluttajillenne. 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 ”Yksinomaiset kuluttajat ja kuluttajien prioriteetti”-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. Kilpailevien kuluttajien malli
  2. Esihakumäärä (QoS)
  3. Yksinomaiset kuluttajat ja kuluttajien prioriteetti
  4. Yksi aktiivinen kuluttaja
← Takaisin: RabbitMQ-viestintä ja asynkroniset järjestelmät