RabbitMQ-meddelanden och asynkrona system · Lektion

Headers-exchange på djupet

Upptäck Headers-exchange för att routa meddelanden baserat på headerattribut i stället för routingnycklar. Implementera mer komplexa och dynamiska routningsregler.

Lektion 1 av 411 steg

Headers-exchange på djupet är en gratis lektion i RabbitMQ-meddelanden och asynkrona system på CoddyKit. Detta är lektion 1 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.

Headers exchange: ny routing

Möt Headers exchange! Till skillnad från Direct eller Topic exchanges, som använder en enkel sträng i routing_key, dirigerar Headers exchanges meddelanden baserat på deras header-attribut.

Se det som ett mer flexibelt sätt att filtrera meddelanden med hjälp av nyckel-värde-par som är kopplade till själva meddelandet.

Routing via meddelandeheaders

När en producent skickar ett meddelande innehåller det en uppsättning nyckel-värde-par (headers). En konsument binder sin kö till en Headers exchange med en egen uppsättning headerregler.

Exchange-instansen jämför sedan meddelandets headers med bindningsreglerna för att avgöra vart meddelandet ska levereras.

Matchningslogik: 'all' eller 'any'

Headers exchanges använder ett särskilt argument kallat x-match i bindningen för att ange matchningslogiken:

  • "all": Meddelandets headers måste innehålla alla nyckel-värde-par som anges i bindningen.
  • "any": Meddelandets headers måste innehålla minst ett av nyckel-värde-paren som anges i bindningen.

Det ger Er kraftfull kontroll över meddelandeleveransen!

Skapa meddelanden med anpassade headers

Vi ska se hur en producent lägger till anpassade headers i ett meddelande. Vi skickar ett enkelt textmeddelande med headers för format: json och type: report.

Kör den här koden för att skicka ett meddelande:

import com.rabbitmq.client.*;
import java.util.HashMap;
import java.util.Map;

public class HeadersProducer {
    private static final String EXCHANGE = "my_headers_exchange";

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

            channel.exchangeDeclare(EXCHANGE, "headers");

            Map<String, Object> headers = new HashMap<>();
            headers.put("format", "json");
            headers.put("type", "report"); // Add headers

            String msg = "Report Data (JSON)";
            AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
                                            .headers(headers)
                                            .build();
            channel.basicPublish(EXCHANGE, "", props, msg.getBytes("UTF-8"));
            System.out.println(" [x] Sent: '" + msg + "' with headers: " + headers);
        }
    }
}

Exempel på konsument med matchning av 'all'

Den här konsumenten tar endast emot meddelanden om alla angivna headers (format: json OCH type: report) finns i det inkommande meddelandet.

Kör den här konsumenten först och därefter producenten från föregående scen.

import com.rabbitmq.client.*;
import java.util.HashMap;
import java.util.Map;

public class HeadersConsumerAll {
    private static final String EXCHANGE = "my_headers_exchange";

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

        channel.exchangeDeclare(EXCHANGE, "headers");
        String queueName = channel.queueDeclare().getQueue();

        Map<String, Object> bindHeaders = new HashMap<>();
        bindHeaders.put("x-match", "all");
        bindHeaders.put("format", "json");
        bindHeaders.put("type", "report"); // Requires both

        channel.queueBind(queueName, EXCHANGE, "", bindHeaders);
        System.out.println(" [*] Waiting for msgs with ALL: " + bindHeaders);

        DeliverCallback dc = (ct, delivery) -> {
            String msg = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + msg + "' Headers: " + delivery.getProperties().getHeaders());
        };
        channel.basicConsume(queueName, true, dc, ct -> {});
    }
}

Exempel på konsument med matchning av 'any'

Nu skapar vi en konsument som tar emot meddelanden om någon av de angivna headerarna (format: xml ELLER priority: high) finns.

Kör den här konsumenten. Prova sedan att skicka meddelanden med olika kombinationer av headers.

import com.rabbitmq.client.*;
import java.util.HashMap;
import java.util.Map;

public class HeadersConsumerAny {
    private static final String EXCHANGE = "my_headers_exchange";

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

        channel.exchangeDeclare(EXCHANGE, "headers");
        String queueName = channel.queueDeclare().getQueue();

        Map<String, Object> bindHeaders = new HashMap<>();
        bindHeaders.put("x-match", "any");
        bindHeaders.put("format", "xml"); // Matches if format is xml
        bindHeaders.put("priority", "high"); // OR if priority is high

        channel.queueBind(queueName, EXCHANGE, "", bindHeaders);
        System.out.println(" [*] Waiting for msgs with ANY: " + bindHeaders);

        DeliverCallback dc = (ct, delivery) -> {
            String msg = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + msg + "' Headers: " + delivery.getProperties().getHeaders());
        };
        channel.basicConsume(queueName, true, dc, ct -> {});
    }
}

Mer om värdena för `x-match`

Även om "all" och "any" är de primära värdena för x-match kan Ni även utelämna x-match. Om x-match inte anges används "all" som standard.

Kom ihåg att headervärdena måste matcha exakt. "type": "report" matchar till exempel inte "type": "Report".

När ska Headers exchange användas

Headers exchanges passar utmärkt för:

  • Dynamisk routing: När routinglogiken ofta ändras utan koddistributioner.
  • Komplex filtrering: Routing baserad på flera icke-hierarkiska attribut.
  • Policybaserad routing: Till exempel att dirigera högprioriterade meddelanden till en dedikerad kö.

Det ger flexibilitet när routingnycklar blir för begränsande.

Headers jämfört med andra exchanges

Hur står sig Headers i jämförelse?

  • Direct: Dirigerar genom exakt matchning av routing_key.
  • Topic: Dirigerar genom mönster i routing_key (wildcards).
  • Headers: Dirigerar genom godtyckliga nyckel-värde-par i meddelandeheaders, vilket ger större flexibilitet baserad på attribut.

Välj den exchangetyp som bäst passar Era behov av meddelanderouting!

Frågor om Headers exchange

En producent skickar ett meddelande med headers {"color": "red", "size": "large"}.

Vilken eller vilka konfigurationer av konsumentbindningar tar emot detta meddelande?

Sammanfattning av lektionen

I den här lektionen utforskade vi den kraftfulla Headers exchange. Ni lärde Er:

  • Den dirigerar meddelanden baserat på nyckel-värde-par i headers.
  • Argumentet x-match ("all" eller "any") styr matchningslogiken.
  • Hur den kan användas för flexibel, attributbaserad meddelanderouting.

Den här exchangen erbjuder ett robust alternativ till routingnycklar i scenarier som kräver komplex filtrering.

Gratis att börja

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 ”Headers-exchange på djupet” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen RabbitMQ-meddelanden och asynkrona system, inklusive ”Headers-exchange på djupet”, 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 ”Headers-exchange på djupet”?

Upptäck Headers-exchange för att routa meddelanden baserat på headerattribut i stället för routingnycklar. Implementera mer komplexa och dynamiska routningsregler. 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 1 av 4.

Hur lång tid tar lektionen ”Headers-exchange på djupet”?

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

  1. Headers-exchange på djupet
  2. Bindings mellan exchanges
  3. Dead Letter Exchanges (DLX)
  4. Alternativa exchanges för oroutningsbara meddelanden
← Tillbaka till RabbitMQ-meddelanden och asynkrona system