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

Työjonot: tasapuolinen jakelu

Toteuttakaa työjonoja tehtävien jakamiseen useille kuluttajille round-robin-jakelustrategialla. Oppikaa käsittelemään aikaa vieviä tehtäviä asynkronisesti.

Oppitunti 2/411 vaihetta

Työjonot: tasapuolinen jakelu 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.

Tutustuminen työjonoihin

Tervetuloa työjonojen pariin! Hajautetuissa järjestelmissä on usein tehtäviä, joiden suorittaminen vie aikaa, kuten kuvan käsittely tai raportin luominen.

Työjonot ovat malli, jonka avulla tällaiset aikaa vievät tehtävät voidaan jakaa tehokkaasti useille työntekijöille (kuluttajille), jotta yksikään työntekijä ei ylikuormitu.

Miksi työjonoja käytetään?

Kuvittele, että sinulla on paljon töitä mutta vain yksi työntekijä. Jos kaikki työt annetaan hänelle, hän kuormittuu ja tehtävät kasaantuvat.

  • Kuormantasaus: Työjonojen avulla voit lisätä työntekijöitä jakamaan kuormaa.
  • Asynkroninen käsittely: Tuottaja ei odota tehtävän valmistumista, vaan lisää sen jonoon.
  • Luotettavuus: Jos yksi työntekijä epäonnistuu, muut voivat ottaa tehtäviä hoitaakseen.

Miten työjonot toimivat

Työjonon rakenne on yksinkertainen:

  • Yksi tuottaja lähettää viestejä (tehtäviä) yhteen jonoon.
  • Useat kuluttajat kuuntelevat samaa jonoa.
  • RabbitMQ varmistaa, että kukin viesti toimitetaan vain yhdelle odottavista kuluttajista.

Näin tehtäviä ei käsitellä useaan kertaan, vaan niitä voidaan käsitellä rinnakkain.

Reilu jakelu: round-robin

Oletuksena RabbitMQ jakaa viestit kuluttajille round-robin-strategialla. Tämä tarkoittaa, että viestit lähetetään kuluttajille vuorotellen:

  • Kuluttaja 1 saa ensimmäisen viestin.
  • Kuluttaja 2 saa toisen viestin.
  • Kuluttaja 1 saa kolmannen viestin ja niin edelleen.

Tavoitteena on jakaa tehtävät tasaisesti kaikkien aktiivisten kuluttajien kesken.

Tehtävien tuottaja

Luodaan tuottaja, joka lähettää 10 tehtävää jonoomme. Kukin tehtävä on yksinkertainen merkkijono, kuten Processing image 1.

Suorita tämä koodi kerran, jotta jono täyttyy tehtävistä.

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()) {

            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            for (int i = 0; i < 10; i++) {
                String message = "Processing image " + (i + 1);
                channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
                System.out.println(" [x] Sent '" + message + "'");
            }
            System.out.println(" [x] All tasks sent.");
        }
    }
}

Tuottajan koodin erittely

Mitä tuottajakoodissamme tapahtuu?

  • Muodostamme yhteyden ja kanavan RabbitMQ:n kanssa kommunikointia varten.
  • channel.queueDeclare(QUEUE_NAME, false, false, false, null); varmistaa, että jono on olemassa. false-arvot pitävät sen tässä yksinkertaisuuden vuoksi säilymättömänä ja ei-yksinomaisena.
  • Silmukka lähettää 10 viestiä kohteeseen task_queue. Jokainen viesti edustaa erillistä tehtävää.

Ensimmäinen tehtävien kuluttajamme

Luodaan nyt kuluttaja, jota kutsumme työntekijäksi (worker). Tämä työntekijä kuuntelee kohteesta task_queue tulevia tehtäviä.

Simuloimme pitkäkestoista tehtävää käyttämällä Thread.sleep()-kutsua. Suorittakaa tämä koodi yhdessä pääteikkunassa.

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"); // Assuming RabbitMQ is local

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

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
            try {
                // Simulate long-running task
                Thread.sleep(1000); // 1 second per task
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                System.out.println(" [x] Done with '" + message + "'");
            }
        };
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
    }
}

Kuluttajan koodin erittely

Tarkastellaan kuluttajan toimintalogiikkaa:

  • Tuottajan tavoin se muodostaa yhteyden ja ilmoittaa jonon.
  • DeliverCallback määrittää toiminnot, jotka suoritetaan viestin saapuessa.
  • Takaisinkutsun sisällä Thread.sleep(1000) simuloi yhden sekunnin kestävää tehtävää.
  • channel.basicConsume(QUEUE_NAME, true, deliverCallback, ...) käynnistää kulutuksen. true tarkoittaa, että viestit kuitataan automaattisesti niiden toimittamisen jälkeen.

Skaalaus useilla työntekijöillä

Tässä on työjonojen keskeinen esimerkki:

1. Suorittakaa TaskConsumer-koodi kahdessa erillisessä pääteikkunassa (tai instanssissa).

2. Suorittakaa sitten TaskProducer-koodi kerran.

Havaitsette, että 10 tehtävää jaetaan kahden työntekijäinstanssin kesken ja kumpikin käsittelee noin 5 tehtävää RabbitMQ:n round-robin-jakelun ansiosta.

Työjonakysely

Kuvitelkaa, että käytössänne on yksi RabbitMQ-jono ja kaksi sitä kuuntelevaa kuluttajaa (Worker A ja Worker B). Tuottaja lähettää tähän jonoon 4 viestiä (M1, M2, M3, M4).

Mikä väite kuvaa oikein, miten viestit yleensä jaetaan RabbitMQ:n oletusarvoista fair dispatch -jakelua käytettäessä?

Työjonot: tärkeimmät asiat

Olette onnistuneesti toteuttaneet työjonat, joka on keskeinen malli tehtävien jakamiseen useille kuluttajille!

  • Työjonot mahdollistavat asynkronisen käsittelyn ja estävät yksittäisiä vikapisteitä.
  • RabbitMQ:n oletusarvoinen round-robin-jakelustrategia varmistaa tehtävien tasapuolisen jakamisen.
  • Suorittamalla useita kuluttajainstansseja voitte helposti skaalata tehtävien käsittelykapasiteettia.

Seuraavaksi perehdymme siihen, miten viestien käsittelystä tehdään entistä luotettavampaa kuittausten ja viestien säilyvyyden avulla!

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 ”Työjonot: tasapuolinen jakelu” ilmainen?

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

Toteuttakaa työjonoja tehtävien jakamiseen useille kuluttajille round-robin-jakelustrategialla. Oppikaa käsittelemään aikaa vieviä tehtäviä asynkronisesti. 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 ”Työjonot: tasapuolinen jakelu”-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. Hello World: yksinkertainen jono
  2. Työjonot: tasapuolinen jakelu
  3. Viestien kuittaukset ja pysyvyys
  4. Julkaisu ja tilaus fanout-vaihtimilla
← Takaisin: RabbitMQ-viestintä ja asynkroniset järjestelmät