Felsökning av meddelandeflöden
Använd verktyg och tekniker för att felsöka meddelandeflöden genom exchanges och köer. Spåra meddelanden för att förstå deras väg och lokalisera leveransproblem.
Felsökning av meddelandeflöden är en gratis lektion i RabbitMQ-meddelanden och asynkrona system på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för RabbitMQ-meddelanden och asynkrona system, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i RabbitMQ-meddelanden och asynkrona system innehåller totalt 4 lektioner.
Varför felsöka meddelandeflödet?
När du bygger system med meddelandeköer som RabbitMQ hamnar meddelanden inte alltid där du förväntar dig. De kan försvinna, inte levereras eller samlas på hög i köer.
Det är viktigt att förstå felsökning av meddelandeflöden. Det hjälper dig att följa ett meddelandes väg från producent till konsument och exakt fastställa var problemen uppstår.
Din felsökningspanel: Mgmt-plugin
RabbitMQ Management Plugin är ditt främsta verktyg för att felsöka meddelandeflöden. Det erbjuder ett webbaserat UI för att inspektera brokern.
- Översikt: Övergripande statistik.
- Anslutningar/kanaler: Se aktiva klientanslutningar.
- Exchanges: Visa exchange-typer och bindningar.
- Köer: Inspektera antal meddelanden och konsumenter samt hämta och publicera meddelanden.
Inspektera och mata in meddelanden i UI:t
Med management-pluginet kan du interagera direkt med meddelandeflödet:
- Publicera meddelanden: På en exchanges sida använder du panelen 'Publish message' för att skicka testmeddelanden. Det hjälper dig att verifiera routingnyckeln och bindningslogiken.
- Hämta meddelanden: På en kö-sida använder du panelen 'Get messages' för att hämta meddelanden från kön. Det bekräftar om meddelanden anländer och vilket innehåll och vilka egenskaper de har.
Meddelandets ID-kort: Egenskaper
Varje meddelande i RabbitMQ innehåller viktig information. Var särskilt uppmärksam på följande vid felsökning:
- Routingnyckel: Nyckeln som exchanges använder för att routa meddelandet.
- Headers: Anpassade nyckel-värde-par som kan användas för routning (Headers Exchange) eller metadata.
- Leveransläge: Anger om meddelandet är persistent.
Dessa egenskaper avgör hur ett meddelande hanteras och routas.
Felaktiga routingnycklar
Ett vanligt problem är att ett meddelande inte når den avsedda kön på grund av en felaktig routingnyckel eller en saknad bindning.
En Direct exchange som förväntar sig routingnyckeln 'errors' slänger till exempel meddelanden som skickas med 'info' om ingen kö är bunden till 'info'. Kontrollera alltid att producentens routingnyckel överensstämmer med köernas bindningar.
Insikter från producenten med loggning
Det är viktigt att lägga till loggning i producentapplikationen. Det bekräftar om applikationen lyckades försöka skicka ett meddelande och vilken routingnyckel den använde.
Prova att köra det här Java-exemplet. Observera konsolutdata.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class DebugProducer {
private final static String QUEUE_NAME = "debug_queue_log";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // Assumes local RabbitMQ
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello, debug world!";
String routingKey = QUEUE_NAME; // Using queue name as routing key
System.out.println(" [Producer] Sending message to queue: " + QUEUE_NAME);
System.out.println(" [Producer] With routing key: '" + routingKey + "'");
channel.basicPublish("", routingKey, null, message.getBytes("UTF-8"));
System.out.println(" [Producer] Sent message: '" + message + "'");
} catch (Exception e) {
System.err.println(" [Producer] Failed to send: " + e.getMessage());
}
}
}Diagnostik på konsumentsidan
Loggning i konsumenten bekräftar om meddelanden tas emot och bearbetas. Det hjälper dig att skilja mellan meddelanden som inte når kön och meddelanden som inte hämtas av konsumenterna.
Kör den här konsumenten och kör sedan producenten från föregående scen.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class DebugConsumer {
private final static String QUEUE_NAME = "debug_queue_log";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // Assumes local RabbitMQ
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [Consumer] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [Consumer] Received message: '" + message + "'");
// Simulate processing
try {
Thread.sleep(500); // Simulate work
} catch (InterruptedException _e) {
Thread.currentThread().interrupt();
}
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); // Manual ack
System.out.println(" [Consumer] Processed & acknowledged: '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});
}
}Köansamlingar och flaskhalsar
Om meddelanden samlas i en kö (vilket syns i management UI) tyder det på en flaskhals. Möjliga orsaker är:
- Inga konsumenter: Ingen applikation lyssnar på kön.
- Långsamma konsumenter: Konsumenterna kan inte bearbeta meddelanden lika snabbt som de anländer.
- Konsumentfel: Konsumenterna kraschade eller stoppades utan att bekräfta meddelandena.
- Prefetch-antal: Konsumenterna tar emot för många meddelanden samtidigt, vilket leder till långsam bearbetning.
Hamnar meddelanden i DLQ?
Om meddelanden verkar försvinna från den förväntade kön bör du kontrollera dina Dead Letter Queues (DLQ:er). Meddelanden skickas till dead letter när:
- De avvisas (
basic.rejectellerbasic.nack) och inte läggs tillbaka i kön. - De löper ut på grund av TTL (Time-To-Live).
- Köns längdgräns överskrids.
Genom att övervaka DLQ:er kan du upptäcka meddelanden som inte kan levereras.
Din felsökningschecklista
Följ dessa steg när ett problem med meddelandeflödet uppstår:
- 1. Producentloggar: Bekräftade producenten att meddelandet skickades?
- 2. Exchange-bindningar: Är kön korrekt bunden till exchange:n med rätt routingnyckel?
- 3. Management UI (kö): Samlas meddelanden i kön? Använd 'Get messages'.
- 4. Konsumentloggar: Tar konsumenten emot och bekräftar meddelanden?
- 5. DLQ:er: Kontrollera om meddelanden hamnade i en Dead Letter Queue.
- 6. Testa med UI: Använd 'Publish message' i management UI för att isolera routningsproblem.
Följ meddelandets väg
En producent skickar meddelanden till en direct exchange med namnet 'logs' och routingnyckeln 'error'. En kö med namnet 'error_logs' är bunden till exchangen 'logs' med routingnyckeln 'warning'.
Om meddelanden med routingnyckeln 'error' inte visas i kön 'error_logs', vad är den MEST sannolika omedelbara orsaken?
Sammanfattning: Bemästra meddelandeflödet
I den här lektionen har du fått viktiga kunskaper för att felsöka meddelandeflöden i RabbitMQ.
- Du har lärt dig att använda Management Plugin för inspektion och testning.
- Du har sett hur viktigt det är med loggning i både producenter och konsumenter.
- Du kan nu identifiera vanliga problem som felaktiga routingnycklar och köansamlingar.
- Du förstår vilken roll Dead Letter Queues har när det gäller att fånga upp meddelanden som inte kan levereras.
Med dessa tekniker kan du effektivt diagnostisera och lösa problem med meddelandeleveranser!
Lär dig RabbitMQ-meddelanden och asynkrona system med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 11
- Lektioner
- 44
Vanliga frågor
Är lektionen ”Felsökning av meddelandeflöden” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen RabbitMQ-meddelanden och asynkrona system, inklusive ”Felsökning av meddelandeflöden”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i RabbitMQ-meddelanden och asynkrona system innehåller totalt 4 lektioner.
Vad lär jag mig i ”Felsökning av meddelandeflöden”?
Använd verktyg och tekniker för att felsöka meddelandeflöden genom exchanges och köer. Spåra meddelanden för att förstå deras väg och lokalisera leveransproblem. Ni övar på RabbitMQ-meddelanden och asynkrona system med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig RabbitMQ-meddelanden och asynkrona system?
Du behöver inga förkunskaper. Utbildningen i RabbitMQ-meddelanden och asynkrona system på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Felsökning av meddelandeflöden”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här RabbitMQ-meddelanden och asynkrona system-lektionen?
Ja. Varje RabbitMQ-meddelanden och asynkrona system-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Vanliga RabbitMQ-problem
- Felsökning av meddelandeflöden
- Bästa praxis för produktionssystem
- Kapacitetsplanering och lasttestning