Kilpailevien kuluttajien malli
Toteuttakaa kilpailevien kuluttajien malli, jonka avulla useat kuluttajat voivat käsitellä viestejä yhdestä jonosta. Skaalatkaa käsittelykapasiteettia lisäämällä kuluttajia.
Kilpailevien kuluttajien malli on ilmainen RabbitMQ-viestintä ja asynkroniset järjestelmät-oppitunti CoddyKitissä. Tämä on oppitunti 1/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.
Skaalaus kilpailevien kuluttajien avulla
Tervetuloa! Hajautetuissa järjestelmissä on usein tarpeen käsitellä monia tehtäviä tehokkaasti. Competing Consumers -malli on tehokas tapa saavuttaa tämä.
Sen avulla voit kasvattaa viestien käsittelykapasiteettia yksinkertaisesti lisäämällä työntekijöitä.
Miten kilpailevat kuluttajat toimivat
Kuvittele yhtä tehtäväjonoa. Sen sijaan, että yksi työntekijä käsittelisi kaikki tehtävät, useat työntekijät (kuluttajat) kuuntelevat samaa jonoa.
- Kukin viesti toimitetaan vain yhdelle keskenään kilpailevista kuluttajista.
- Kuluttajat "kilpailevat" seuraavan saatavilla olevan viestin vastaanottamisesta.
- Työkuorma jakautuu automaattisesti.
Mallin keskeiset hyödyt
Competing Consumers -malli tarjoaa useita etuja:
- Skaalautuvuus: Käsittelytehoa on helppo lisätä käynnistämällä lisää kuluttaja-instansseja.
- Luotettavuus: Jos yksi kuluttaja vikaantuu, muut voivat käsitellä sen viestiosuuden.
- Kuormantasaus: Viestit jaetaan käytettävissä olevien kuluttajien kesken, jolloin työkuorma tasapainottuu.
- Irrotettu rakenne: Tuottajien ei tarvitse tietää, kuinka monta kuluttajaa on käytössä tai missä ne sijaitsevat.
Tuottaja: tehtävien lähettäminen
Luodaan yksinkertainen tuottaja, joka lähettää viestejä (tehtäviä) jonoon nimeltä task_queue. Kukin viesti on yksinkertainen merkkijono.
Suorittakaa tämä koodi muutaman viestin lähettämiseksi:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class TaskProducer {
private final static String QUEUE_NAME = "task_queue";
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()) {
// Declare a durable queue
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
for (int i = 0; i < 10; i++) {
String message = "Task " + (i + 1);
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
Thread.sleep(100); // Small delay to visualize
}
}
}
}Kuluttaja 1: tehtävien käsittely
Luodaan nyt ensimmäinen kuluttaja. Se muodostaa yhteyden jonoon task_queue ja alkaa käsitellä viestejä. Jokainen viesti kuitataan työn simuloinnin jälkeen.
Suorittakaa tämä kuluttaja terminaalissa:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class TaskConsumer {
private final static String QUEUE_NAME = "task_queue";
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, true, false, false, null);
System.out.println(" [*] Consumer 1 waiting for messages.");
// Basic QoS: Prefetch 1 message at a time to ensure fair dispatch
channel.basicQos(1);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [C1] Received '" + message + "'");
try {
Thread.sleep(1000); // Simulate work
} finally {
System.out.println(" [C1] Done '" + message + "'");
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});
}
}Useiden kuluttajien suorittaminen
Nähdäksenne kilpailevien kuluttajien mallin toiminnassa avatkaa uusi terminaali-ikkuna ja suorittakaa täsmälleen sama TaskConsumer-koodi uudelleen.
Nyt käytössä on kaksi kuluttaja-instanssia, jotka kuuntelevat jonoa task_queue. Suorittakaa tuottajan koodi (skenaariosta 4) vielä kerran. Tarkkailkaa, kuinka viestit jakautuvat nyt molempien kuluttaja-instanssien kesken. Tämä havainnollistaa, kuinka ne kilpailevat viesteistä ja jakavat työkuorman!
RabbitMQ:n lähetyslogiikka
Oletusarvoisesti RabbitMQ käyttää round-robin-lähetysmekanismia, kun samaan jonoon on yhdistetty useita kuluttajia. Tämä tarkoittaa, että viestit lähetetään kuluttajille vuorotellen.
- Kuluttaja 1 saa viestin 1.
- Kuluttaja 2 saa viestin 2.
- Kuluttaja 1 saa viestin 3 ja niin edelleen.
Kuluttajakoodimme basicQos(1)-asetus on tässä ratkaiseva. Se kertoo RabbitMQ:lle, ettei kuluttajalle saa lähettää kerralla enempää kuin yhtä kuittaamatonta viestiä. Näin lähetys pysyy reiluna, vaikka kuluttajat käsittelisivät viestejä eri nopeuksilla.
Yleisiä käyttötapauksia
Competing Consumers -malli sopii erinomaisesti esimerkiksi seuraaviin tilanteisiin:
- Kuvankäsittely: Useat työntekijät muuttavat jonosta haettujen kuvien kokoa.
- Sähköpostien lähettäminen: Joukkosähköpostien lähettäminen ilman yksittäisen palvelun ylikuormittamista.
- Lokien käsittely: Suurten lokimäärien analysointi rinnakkain.
- Taustatyöt: Kaikki tehtävät, jotka useat työntekijät voivat käsitellä toisistaan riippumatta.
Tärkeitä huomioita
Kun käytätte kilpailevia kuluttajia, pitäkää mielessä seuraavat asiat:
- Viestien järjestys: Jos viestien tarkka järjestys on kriittinen, tämä malli ei välttämättä sovellu sellaisenaan, koska eri kuluttajat voivat käsitellä viestejä eri järjestyksessä.
- Idempotenttisuus: Kuluttajien tulisi mielellään olla idempotentteja. Tämä tarkoittaa, että saman viestin käsittely useita kertoja tuottaa saman vaikutuksen kuin sen käsittely kerran. Tämä on olennaista vikasietoisuuden ja uudelleenyritysten kannalta.
Kilpailevien kuluttajien tietovisa
Testatkaa, kuinka hyvin ymmärrätte Competing Consumers -mallin.
Kertaus: kilpailevat kuluttajat
Hienoa työtä! Olette oppineet Competing Consumers -mallista:
- Sen avulla useat kuluttajat voivat käsitellä viestejä yhdestä jonosta.
- Se soveltuu erinomaisesti viestien käsittelyn skaalaamiseen ja kuormantasaamiseen.
- RabbitMQ:n oletusarvoinen round-robin-lähetys ja QoS-asetukset tukevat reilua jakamista.
- Huomioikaa idempotenttisuus ja mahdollinen viestien käsittely väärässä järjestyksessä tietyissä käyttötapauksissa.
Seuraavaksi perehdymme tarkemmin kuluttajien tehokkuuden optimointiin prefetch-määrien avulla!
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 ”Kilpailevien kuluttajien malli” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa RabbitMQ-viestintä ja asynkroniset järjestelmät-oppimispolun 3 oppituntia, myös oppitunnin “Kilpailevien kuluttajien malli”. 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 ”Kilpailevien kuluttajien malli”?
Toteuttakaa kilpailevien kuluttajien malli, jonka avulla useat kuluttajat voivat käsitellä viestejä yhdestä jonosta. Skaalatkaa käsittelykapasiteettia lisäämällä kuluttajia. 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 1/4.
Kuinka kauan ”Kilpailevien kuluttajien malli”-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
- Kilpailevien kuluttajien malli
- Esihakumäärä (QoS)
- Yksinomaiset kuluttajat ja kuluttajien prioriteetti
- Yksi aktiivinen kuluttaja