RabbitMQ-berichten en asynchrone systemen · Les

Plugin voor vertraagde berichten

Implementeer vertraagde berichtlevering met de RabbitMQ Delayed Message Exchange-plugin. Plan berichten in voor verwerking op een later tijdstip zonder aangepaste timers.

Les 1 van 411 stappen

Plugin voor vertraagde berichten is een gratis RabbitMQ-berichten en asynchrone systemen-les op CoddyKit. Dit is les 1 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject RabbitMQ-berichten en asynchrone systemen. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus RabbitMQ-berichten en asynchrone systemen bevat in totaal 4 lessen.

Wat zijn vertraagde berichten?

Soms wil je niet dat een bericht onmiddellijk wordt verwerkt. Denk bijvoorbeeld aan het versturen van een herinneringsmail over een uur of het verwerken van een betaling 30 minuten nadat een bestelling is geplaatst.

Met vertraagde berichten kun je een bericht naar RabbitMQ publiceren en de broker opdracht geven het bericht gedurende een bepaalde tijd vast te houden voordat het aan consumenten wordt geleverd.

Planning zonder de plug-in

Zonder een speciale functie kan het plannen van berichten ingewikkeld zijn:

  • Aangepaste timers: je kunt je eigen service met timers bouwen, maar dat maakt het systeem complexer en introduceert één punt van uitval.
  • Databases pollen: berichten in een database opslaan en regelmatig controleren of de geplande tijd is bereikt, is inefficiënt.
  • Externe planners: met CRON-taken of andere externe planners moet je applicatie nog steeds de berichtstatus beheren.

De RabbitMQ Delayed Message Plugin maakt dit veel eenvoudiger!

Maak kennis met de `x-delayed-message`-plug-in

De RabbitMQ Delayed Message Exchange-plugin biedt een speciaal type exchange dat berichten kan vasthouden en na een opgegeven vertraging kan vrijgeven.

De plugin werkt als een buffer en beheert de vertraging intern, zodat je applicatie de berichttijden niet hoeft bij te houden.

Hierdoor wordt het plannen van berichten veel eenvoudiger en robuuster.

Werking van vertraagde exchanges

Wanneer je een bericht publiceert naar een `x-delayed-message`-exchange, voeg je een speciale header toe: x-delay. De waarde van deze header is de vertraging in milliseconden.

De exchange houdt het bericht vast totdat de vertraging is verstreken. Daarna wordt het bericht naar wachtrijen gerouteerd alsof het een normaal bericht was dat naar een exchange van het oorspronkelijke type is gepubliceerd (bijvoorbeeld direct, fanout of topic).

De plug-in inschakelen (beheerder)

Voordat je de plug-in gebruikt, moet deze op je RabbitMQ-server zijn ingeschakeld. Dit doe je meestal via de opdrachtregel:

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

Mogelijk moet je de server opnieuw starten voordat de wijzigingen actief worden. Controleer altijd of de plug-in op je broker is ingeschakeld voordat je deze probeert te gebruiken.

Een vertraagde exchange declareren

Om vertraagde berichten te gebruiken, declareer je eerst een exchange met het type x-delayed-message. Je geeft ook het onderliggende type op (bijvoorbeeld direct, fanout of topic), dat bepaalt hoe berichten na de vertraging worden gerouteerd.

Zo declareer je een vertraagde direct-exchange in Java:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;

public class DeclareDelayedExchange {
    private static final String EXCHANGE_NAME = "my_delayed_exchange";

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

            Map<String, Object> args = new HashMap<>();
            args.put("x-delayed-type", "direct"); // Underlying exchange type

            channel.exchangeDeclare(EXCHANGE_NAME, "x-delayed-message", true, false, args);
            System.out.println("Delayed exchange '" + EXCHANGE_NAME + "' declared.");
        }
    }
}

Verzenden met de header `x-delay`

Wanneer je naar je x-delayed-message-exchange publiceert, voeg je een x-delay-header toe aan de eigenschappen van je bericht. De waarde is een geheel getal dat de vertraging in milliseconden weergeeft.

We versturen een bericht dat na 5 seconden (5000 milliseconden) wordt geleverd.

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;

public class DelayedMessageProducer {
    private static final String EXCHANGE_NAME = "my_delayed_exchange";
    private static final String ROUTING_KEY = "delayed.key";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactoryFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // Ensure the delayed exchange is declared (from previous scene)
            Map<String, Object> args = new HashMap<>();
            args.put("x-delayed-type", "direct");
            channel.exchangeDeclare(EXCHANGE_NAME, "x-delayed-message", true, false, args);
            System.out.println("Exchange declared (if not exists).");

            String message = "Hello, delayed world!";
            int delayInMs = 5000; // 5 seconds

            Map<String, Object> headers = new HashMap<>();
            headers.put("x-delay", delayInMs); // Set the delay header

            AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
                .headers(headers)
                .build();

            channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, props, message.getBytes("UTF-8"));
            System.out.println(" [x] Sent '" + message + "' with delay " + delayInMs + "ms");
        }
    }
}

Vertraagde berichten consumeren

Consumenten hebben geen speciale logica nodig om vertraagde berichten te ontvangen. Zodra de vertraging is verstreken, routeert de x-delayed-message-exchange het bericht naar de gekoppelde wachtrijen en ontvangen consumenten het net als elk ander bericht.

Het belangrijkste is dat het bericht na de opgegeven vertraging bij de consument aankomt. Je moet een wachtrij met de juiste routing key aan je vertraagde exchange koppelen.

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.nio.charset.StandardCharsets;
import java.util.Date;

public class DelayedMessageConsumer {
    private static final String EXCHANGE_NAME = "my_delayed_exchange";
    private static final String QUEUE_NAME = "delayed_queue";
    private static final String ROUTING_KEY = "delayed.key";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // Declare the queue and bind it to the delayed exchange
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
            System.out.println(" [x] Received '" + message + "' at " + new Date());
        };
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
    }
}

Veelgebruikte scenario's

Vertraagde berichten zijn bijzonder nuttig voor:

  • Herinneringen: een melding versturen nadat de proefperiode van een gebruiker is verlopen.
  • Geplande taken: een batchtaak op een specifiek moment in de toekomst verwerken.
  • Mechanismen voor opnieuw proberen: een mislukt bericht opnieuw in de wachtrij plaatsen, zodat het na een vertraging opnieuw wordt geprobeerd.
  • Dripcampagnes: een reeks e-mails verspreid over meerdere dagen versturen.

Ze maken complexe externe planningsservices overbodig.

Korte controle: de basis van vertraagde berichten

Je hebt geleerd hoe je een x-delayed-message-exchange declareert en berichten met een vertraging publiceert. Laten we controleren of je het begrijpt.

Samenvatting: de plug-in voor vertraagde berichten

In deze les heb je kennisgemaakt met de RabbitMQ Delayed Message Exchange-plugin. Hiermee kun je plannen dat berichten op een later moment worden geleverd.

  • Je declareert een exchange met het type x-delayed-message en een onderliggend exchangetype.
  • Je publiceert berichten met een x-delay-header (waarde in milliseconden).
  • Consumenten ontvangen deze berichten op de normale manier, maar pas na de opgegeven vertraging.

Deze krachtige functie vereenvoudigt veel berichtpatronen die op tijd zijn gebaseerd.

Gratis beginnen

Leer RabbitMQ-berichten en asynchrone systemen met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
11
Lessen
44

Veelgestelde vragen

Is de les “Plugin voor vertraagde berichten” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad RabbitMQ-berichten en asynchrone systemen, waaronder “Plugin voor vertraagde berichten”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus RabbitMQ-berichten en asynchrone systemen bevat in totaal 4 lessen.

Wat leer ik in “Plugin voor vertraagde berichten”?

Implementeer vertraagde berichtlevering met de RabbitMQ Delayed Message Exchange-plugin. Plan berichten in voor verwerking op een later tijdstip zonder aangepaste timers. Je oefent met RabbitMQ-berichten en asynchrone systemen door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met RabbitMQ-berichten en asynchrone systemen te beginnen?

Ervaring vooraf is niet nodig. RabbitMQ-berichten en asynchrone systemen op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “Plugin voor vertraagde berichten”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over RabbitMQ-berichten en asynchrone systemen?

Ja. Elke les over RabbitMQ-berichten en asynchrone systemen bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Plugin voor vertraagde berichten
  2. Shovel-plugin voor federatie
  3. Federation-plugin voor clustering
  4. Message deduplication en Consistent Hash Exchange-plugins
← Terug naar RabbitMQ-berichten en asynchrone systemen