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.
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.
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
- Headers-exchange på djupet
- Bindings mellan exchanges
- Dead Letter Exchanges (DLX)
- Alternativa exchanges för oroutningsbara meddelanden