RabbitMQ: meddelelser og asynkrone systemer · Lektion

Mønsteret med konkurrerende consumere

Implementér mønsteret med konkurrerende consumere, så flere consumere kan behandle meddelelser fra én kø. Skalér behandlingskapaciteten ved at tilføje flere consumere.

Lektion 1 af 411 trin

Mønsteret med konkurrerende consumere er en gratis RabbitMQ: meddelelser og asynkrone systemer-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i RabbitMQ: meddelelser og asynkrone systemer, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. RabbitMQ: meddelelser og asynkrone systemer-kurset indeholder 4 lektioner i alt.

Skalering med konkurrerende forbrugere

Velkommen! I distribuerede systemer har du ofte brug for at behandle mange opgaver effektivt. Mønstret Competing Consumers er en effektiv måde at opnå dette på.

Det giver dig mulighed for at skalere din kapacitet til beskedbehandling ved blot at tilføje flere arbejdere.

Sådan fungerer konkurrerende forbrugere

Forestil dig en enkelt kø med opgaver. I stedet for at én arbejder tager sig af alle opgaverne, lytter flere arbejdere (forbrugere) til denne samme kø.

  • Hver meddelelse leveres kun til én af de konkurrerende forbrugere.
  • Forbrugerne "konkurrerer" om at modtage den næste tilgængelige meddelelse.
  • Det fordeler automatisk arbejdsbyrden.

Vigtigste fordele ved mønstret

Mønstret med konkurrerende forbrugere har flere fordele:

  • Skalerbarhed: Øg nemt behandlingskapaciteten ved at tilføje flere forekomster af forbrugere.
  • Pålidelighed: Hvis en forbruger svigter, kan andre overtage dens andel af meddelelserne.
  • Belastningsfordeling: Meddelelser fordeles mellem de tilgængelige forbrugere, så arbejdsbyrden balanceres.
  • Afkobling: Producenter behøver ikke vide, hvor mange forbrugere der findes, eller hvor de befinder sig.

Producent: Afsendelse af opgaver

Lad os opsætte en grundlæggende producent, der sender meddelelser (opgaver) til en kø med navnet task_queue. Hver meddelelse er en simpel streng.

Kør denne kode for at sende nogle få meddelelser:

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
            }
        }
    }
}

Forbruger 1: Behandling af opgaver

Lad os nu oprette vores første forbruger. Den opretter forbindelse til task_queue og begynder at behandle meddelelser. Hver meddelelse bekræftes efter simulering af arbejdet.

Kør denne forbruger i en terminal:

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 -> {});
    }
}

Kørsel af flere forbrugere

Hvis du virkelig vil se mønstret med konkurrerende forbrugere i praksis, skal du åbne et nyt terminalvindue og køre præcis den samme TaskConsumer-kode igen.

Nu har du to forekomster af forbrugere, der lytter til task_queue. Kør producentkoden (fra Scene 4) én gang til. Se, hvordan meddelelserne nu fordeles mellem de to forekomster af forbrugere, hvilket viser, hvordan de konkurrerer om meddelelserne og deler arbejdsbyrden!

RabbitMQ's fordelingslogik

Som standard bruger RabbitMQ en round-robin-mekanisme til fordeling, når flere forbrugere er forbundet til den samme kø. Det betyder, at meddelelser sendes til forbrugerne efter tur.

  • Forbruger 1 får meddelelse 1.
  • Forbruger 2 får meddelelse 2.
  • Forbruger 1 får meddelelse 3, og så videre.

Indstillingen basicQos(1) i vores forbrugerkode er afgørende her. Den fortæller RabbitMQ, at der ikke må sendes mere end én ubekræftet meddelelse ad gangen til en forbruger, så fordelingen bliver retfærdig, selv hvis forbrugerne behandler meddelelser med forskellig hastighed.

Almindelige anvendelsesområder

Mønstret med konkurrerende forbrugere er velegnet til scenarier som:

  • Billedbehandling: Flere arbejdere ændrer størrelsen på billeder fra en kø.
  • Afsendelse af e-mails: Masseudsendelse af e-mails uden at overbelaste én enkelt tjeneste.
  • Logbehandling: Analyse af store mængder logfiler parallelt.
  • Baggrundsjob: Alle opgaver, der kan behandles uafhængigt af flere arbejdere.

Vigtige overvejelser

Husk følgende, når du bruger konkurrerende forbrugere:

  • Rækkefølge af meddelelser: Hvis en streng meddelelsesrækkefølge er afgørende, er dette mønster måske ikke direkte egnet, fordi forskellige forbrugere kan behandle meddelelserne i en anden rækkefølge.
  • Idempotens: Forbrugere bør helst være idempotente. Det betyder, at behandling af den samme meddelelse flere gange skal have samme effekt som behandling af den én gang. Det er afgørende for fejltolerance og gentagne forsøg.

Quiz om konkurrerende forbrugere

Test din forståelse af mønstret med konkurrerende forbrugere.

Opsummering: Konkurrerende forbrugere

Godt gået! Du har lært om mønstret med konkurrerende forbrugere:

  • Det gør det muligt for flere forbrugere at behandle meddelelser fra en enkelt kø.
  • Det er fremragende til skalering og belastningsfordeling ved behandling af meddelelser.
  • RabbitMQ's standardfordeling med round-robin og QoS-indstillinger bidrager til en retfærdig fordeling.
  • Tag højde for idempotens og mulig behandling i forkert rækkefølge i bestemte anvendelsesscenarier.

Nu går vi videre med at optimere forbrugernes effektivitet ved hjælp af forhåndshentningsantal!

Gratis at komme i gang

Lær RabbitMQ: meddelelser og asynkrone systemer med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
11
Lektioner
44

Ofte stillede spørgsmål

Er lektionen “Mønsteret med konkurrerende consumere” gratis?

Ja — alle 3 lektioner i læringssporet RabbitMQ: meddelelser og asynkrone systemer, inklusive “Mønsteret med konkurrerende consumere”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. RabbitMQ: meddelelser og asynkrone systemer-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Mønsteret med konkurrerende consumere”?

Implementér mønsteret med konkurrerende consumere, så flere consumere kan behandle meddelelser fra én kø. Skalér behandlingskapaciteten ved at tilføje flere consumere. Du øver dig i RabbitMQ: meddelelser og asynkrone systemer med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på RabbitMQ: meddelelser og asynkrone systemer?

Der kræves ingen tidligere erfaring. RabbitMQ: meddelelser og asynkrone systemer på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Mønsteret med konkurrerende consumere”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne RabbitMQ: meddelelser og asynkrone systemer-lektion?

Ja. Alle RabbitMQ: meddelelser og asynkrone systemer-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Mønsteret med konkurrerende consumere
  2. Prefetch-antal (QoS)
  3. Eksklusive consumere og consumer-prioritet
  4. Single Active Consumer
← Tilbage til RabbitMQ: meddelelser og asynkrone systemer