Publisher Confirms för tillförlitlighet
Implementera publisher confirms för att säkerställa att meddelanden har tagits emot och bearbetats av brokern. Bygg tillförlitliga producenter som kan återhämta sig efter nätverks- eller brokerproblem.
Publisher Confirms för tillförlitlighet ä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 Publisher Confirms?
När Ni skickar ett meddelande till RabbitMQ, hur vet Ni att det faktiskt kom fram säkert till förmedlaren?
Som standard skickar producenter meddelanden utan att invänta någon uttrycklig bekräftelse från RabbitMQ. Det går snabbt, men innebär att meddelanden kan gå förlorade på grund av nätverksproblem eller fel hos förmedlaren direkt efter att de har skickats.
Publisher Confirms är en mekanism som gör det möjligt för producenter att ta emot bekräftelser (ACK) från RabbitMQ när meddelanden har tagits emot och bearbetats av förmedlaren.
Den osynliga luckan i leveransen
Föreställ Er att Ni skickar en viktig beställning till en behandlingskö. Utan publisher confirms skickar Ert program helt enkelt meddelandet och går vidare.
- Vad händer om nätverksanslutningen tappar meddelandet under leveransen?
- Vad händer om RabbitMQ-servern kraschar strax efter att meddelandet tagits emot, men innan det har sparats?
Utan en bekräftelse skulle producenten anta att allt lyckades, vilket potentiellt kan leda till dataförlust eller inkonsekventa tillstånd i systemet.
Så fungerar bekräftelseläget
För att använda publisher confirms aktiverar Ni ”confirm mode” på en kanal. När läget har aktiverats tilldelas varje meddelande som publiceras på kanalen en unik delivery tag.
- ACK (Acknowledgement): Förmedlaren skickar en ACK tillbaka till producenten när ett meddelande har tagits emot, dirigerats till dess köer och sparats (om kön är beständig).
- NACK (Negative Acknowledgement): Förmedlaren skickar en NACK om den inte kunde bearbeta meddelandet (till exempel om routningen misslyckades eller ett internt fel inträffade).
Denna återkoppling stänger ”leveransluckan” mellan producenten och förmedlaren.
Aktivera bekräftelseläge
Innan Ni publicerar meddelanden måste Ni tala om för RabbitMQ att Ni vill använda publisher confirms på kanalen. Detta behöver konfigureras en gång för varje kanal.
Kör detta exempel för att se hur Ni aktiverar bekräftelseläget:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class ConfirmSetup {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // Assumes RabbitMQ is running locally
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.confirmSelect(); // This line enables confirm mode
System.out.println("Channel is now in confirm mode.");
// Further publishing code would go here
}
}
}Synkrona bekräftelser: `waitForConfirms`
Ett sätt att använda publisher confirms är synkront. När ett eller flera meddelanden har publicerats kan producenten anropa channel.waitForConfirms() eller channel.waitForConfirmsOrDie().
- Metoden blockerar producenten tills alla meddelanden som har publicerats sedan det senaste anropet har fått en ACK eller NACK.
- Den är enkel att implementera, men kan sänka genomströmningen avsevärt eftersom producenten väntar på varje meddelandebatch.
- Den passar bra för meddelanden med låg volym men hög kritisk betydelse, där omedelbar bekräftelse är avgörande.
Kodexempel med synkrona bekräftelser
Detta exempel visar en producent som skickar ett enda meddelande och sedan väntar på dess bekräftelse. Om meddelandet inte bekräftas inom 5 sekunder uppstår en timeout.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class SyncConfirmPublisher {
private static final String QUEUE_NAME = "sync_confirm_queue";
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.confirmSelect(); // Enable confirm mode
String message = "Hello, reliable world!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
// Wait for confirmation for up to 5 seconds
if (channel.waitForConfirms(5000)) {
System.out.println("Message confirmed by broker!");
} else {
System.out.println("Message not confirmed within timeout! It might be lost or delayed.");
}
}
}
}Asynkrona bekräftelser: Lyssnare
För högre genomströmning kan Ni använda asynkrona publisher confirms. I stället för att blockera registrerar Ni en ConfirmListener på kanalen.
- Lyssnaren har två metoder:
handleAck()för lyckade bekräftelser ochhandleNack()för negativa bekräftelser. - RabbitMQ levererar ACK och NACK till denna lyssnare, så att producenten kan fortsätta publicera meddelanden utan att vänta.
- Detta kräver mer komplex logik för att hålla reda på obekräftade meddelanden, men ger bättre prestanda vid publicering av stora mängder meddelanden.
Kodexempel med asynkrona bekräftelser
Detta exempel demonstrerar en asynkron producent. Den registrerar en lyssnare som hanterar ACK och NACK utan att blockera huvudtråden.
Lägg märke till Thread.sleep(), som håller programmet igång tillräckligt länge för att ta emot bekräftelser.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmListener;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.ConcurrentNavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;
public class AsyncConfirmPublisher {
private static final String QUEUE_NAME = "async_confirm_queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.confirmSelect(); // Enable confirm mode
// Store unconfirmed messages by their delivery tag
ConcurrentNavigableMap<Long, String> outstandingConfirms = new ConcurrentSkipListMap<>();
channel.addConfirmListener(new ConfirmListener() {
@Override
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
if (multiple) {
// Remove all messages up to this deliveryTag
outstandingConfirms.headMap(deliveryTag + 1).clear();
} else {
outstandingConfirms.remove(deliveryTag);
}
System.out.println(" [x] Message with deliveryTag " + deliveryTag + " ACKed! Remaining: " + outstandingConfirms.size());
}
@Override
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
String message = outstandingConfirms.get(deliveryTag);
System.out.println(" [!] Message '" + message + "' (deliveryTag " + deliveryTag + ") NACKed! Re-sending or logging error.");
// Handle NACK: re-publish, log, etc.
if (multiple) {
outstandingConfirms.headMap(deliveryTag + 1).clear();
} else {
outstandingConfirms.remove(deliveryTag);
}
}
});
String message = "Hello, async reliable world!";
long nextPublishSeqNo = channel.getNextPublishSeqNo();
outstandingConfirms.put(nextPublishSeqNo, message);
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "' (deliveryTag: " + nextPublishSeqNo + ")");
// Keep main thread alive for a moment to receive confirms
Thread.sleep(2000);
}
}
}Synkront eller asynkront: välj med omsorg
Valet mellan synkrona och asynkrona bekräftelser beror på programmets behov:
- Synkrona (
waitForConfirms):- Enklare att implementera.
- Lägre genomströmning eftersom de blockerar.
- Passar bra för meddelanden med låg volym men hög kritisk betydelse, där omedelbar bekräftelse är nödvändig.
- Asynkrona (
ConfirmListener):- Mer komplex implementering (kräver att obekräftade meddelanden spåras).
- Högre genomströmning eftersom de inte blockerar.
- Passar bra för publicering av stora mängder meddelanden där prestanda är avgörande.
Bekräftelsekontroll
Ni har lärt Er om publisher confirms. Låt oss se om Ni kan svara på den här frågan.
Sammanfattning: Tillförlitlig publicering
Grattis! Ni har lärt Er hur Ni gör Era RabbitMQ-producenter verkligt tillförlitliga med publisher confirms.
- Publisher confirms säkerställer att meddelanden som skickas av en producent tas emot och bearbetas av RabbitMQ-förmedlaren.
- Ni aktiverar bekräftelseläget på en kanal med
channel.confirmSelect(). - Synkrona bekräftelser (
waitForConfirms()) är enkla men blockerar, och passar därför för låg volym. - Asynkrona bekräftelser (
addConfirmListener()) ger högre genomströmning i scenarier med stora volymer, men kräver mer komplex spårning av meddelanden.
Genom att implementera publisher confirms kan Ni bygga robusta system som minimerar meddelandeförlust och säkerställer integriteten hos kritiska data.
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 ”Publisher Confirms för tillförlitlighet” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen RabbitMQ-meddelanden och asynkrona system, inklusive ”Publisher Confirms för tillförlitlighet”, 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 ”Publisher Confirms för tillförlitlighet”?
Implementera publisher confirms för att säkerställa att meddelanden har tagits emot och bearbetats av brokern. Bygg tillförlitliga producenter som kan återhämta sig efter nätverks- eller brokerproble… 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 ”Publisher Confirms för tillförlitlighet”?
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
- Beständiga meddelanden och köer
- Publisher Confirms för tillförlitlighet
- Consumerbekräftelser och köläggning igen
- Transaktioner eller publisher confirms