RabbitMQ. Deel 2. Laten we Exchanges verkennen

Exchange — wisselaar of uitwisselingspunt. Hierin worden berichten verzonden. Exchange verdeelt het bericht in ƩƩn of meerdere wachtrijen. Hij routet berichten naar de wachtrij op basis van de gemaakte verbindingen (bindings) tussen hem en de wachtrij.

Exchange niet is Erlang-proces. Vanuit schaalbaarheidsoptiek exchange — dit is een string (link naar de module met code waarin de routeringslogica ligt) in de ingebouwde database mnesia. 1 duizend wisselaars verbruiken slechts 1MB geheugen.

Inhoudsopgave

  • RabbitMQ. Deel 1. Introductie. Erlang, AMQP en RPC
  • RabbitMQ. Deel 2. Laten we Exchanges verkennen
  • RabbitMQ. Deel 3. Laten we kijken naar Queues en Bindings
  • RabbitMQ. Deel 4. Laten we kijken wat berichten en frames zijn
  • RabbitMQ. Deel 5. Prestatie van het publiceren en consumeren van berichten
  • RabbitMQ. Deel 6. Overzicht van de modules Federation en Shovel
  • RabbitMQ. Deel 7. Gedetailleerd over Connection en Channel
  • RabbitMQ. Deel 8. RabbitMQ in .NET
  • RabbitMQ. Deel 9. Monitoring

Direct Exchange

Direct exchange — wordt gebruikt wanneer het nodig is om een bericht aan specifieke wachtrijen te bezorgen. Het bericht wordt gepubliceerd in de wisselaar met een bepaalde routeringssleutel en komt in alle wachtrijen die met deze wisselaar zijn verbonden met dezelfde routeringssleutel. Routeringssleutel — dit is een string. Het zoeken naar overeenstemming gebeurt door middel van stringvergelijkingen.

Grafische weergave van de berichtenstroom:

RabbitMQ. Deel 2. Laten we Exchanges verkennen

In rabbitmq er is het begrip standaardwisselaar. Dit is direct exchange zonder naam. Als de standaardwisselaar wordt gebruikt, zal het bericht worden gerouteerd naar de wachtrij met de naam gelijk aan de routeringssleutel van het bericht.

Topic Exchange

Topic exchange – soortgelijk direct exchange biedt de mogelijkheid om geselecteerde routering uit te voeren door de routeringssleutel te vergelijken. Maar in dit geval wordt de sleutel ingesteld door een patroon. Bij het maken van een patroon worden 0 ƩƩn of meer woorden (letters AZ en az en cijfers 0-9), gescheiden door punten, evenals symbolen * en #.

  • * — kan worden vervangen door precies 1 woord
  • # — kan worden vervangen door 0 ƩƩn of meer woorden

Grafische weergave van de berichtenstroom:

RabbitMQ. Deel 2. Laten we Exchanges verkennen

Beginnend vanaf versie RabbitMQ 2.4.0 de routeringsalgoritme voor topic exchange werkte tot 145 tien keer sneller. Ze hebben dit bereikt door de aanpak trie implementation, die de representatie van patronen in de vorm van een boomstructuur inhoudt. Bijvoorbeeld de patronen a.b.c, a.*.b.c, a.#.c en b.b.c zullen als volgt worden gepresenteerd:

RabbitMQ. Deel 2. Laten we Exchanges verkennen

Het zoeken naar overeenstemming met het patroon begint vanaf de wortel en gaat van boven naar beneden.

Kenmerken:

  • het gebruik van deze wisselaar kan een goede keuze zijn voor mogelijke toekomstige ontwikkeling van de applicatie, aangezien patronen altijd kunnen worden geconfigureerd om het bericht op vergelijkbare wijze te publiceren. direct exchange of fanout exchange
  • patronen die gebruiken * veel sneller, dan patronen die gebruiken #.
  • topic exchange trager direct exchange

Fanout Exchange

Fanout exchange – alle berichten worden afgeleverd aan alle wachtrijen zelfs als er een routeringssleutel in het bericht is opgegeven.

Kenmerken:

  • RabbitMQ werkt niet met routeringssleutels en patronen wat een positieve invloed heeft op de prestaties. Dit is de snelste exchange;
  • alle gebruikers moeten in staat zijn om alle berichten te verwerken;

Grafische weergave van de berichtenstroom:

RabbitMQ. Deel 2. Laten we Exchanges verkennen

Headers Exchange

Headers exchange stelt berichten in staat om naar gerelateerde wachtrijen te worden gestuurd op basis van het vergelijken van paren (sleutel, waarde) eigenschappen headers bindingen en een soortgelijke eigenschap van het bericht. headers is Dictionary<sleutel, waarde>.

Als een speciale sleutel aan de woordenlijst wordt toegevoegd x-match met de waarde any, dan wordt het bericht gerouteerd bij gedeeltelijke overeenstemming van paren (sleutel, waarde). Dit gedrag is vergelijkbaar met de operator or.

var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");

Standaard bevat de sleutel x-match de waarde all. Dit betekent dat het bericht wordt gerouteerd bij volledige overeenstemming van paren (sleutel, waarde). Dit gedrag is vergelijkbaar met de operator en.

Grafische weergave van de berichtenstroom:

RabbitMQ. Deel 2. Laten we Exchanges verkennen

Kenmerken:

  • extra flexibiliteit
  • aanvullende rekenkosten. Alle paren (sleutel, waarde) van het attribuut headers moeten op naam van de sleutel worden gesorteerd vóór het berekenen van de routering van het bericht. Langzamer dan andere soorten exchange.

Consistent-Hashing Exchange

Deze exchange is een plugin en niet ingebouwd in RabbitMQ.

Consistent-hashing exchange (exchange met consistente hashing) – wordt gebruikt wanneer er verschillende wachtrijen zijn die potentiĆ«le ontvangers van het bericht zijn, en wanneer de belasting tussen hen moet worden gebalanceerd. De verbinding van het bericht met de wachtrij gebeurt op basis van gewicht (een voorwaardelijke tekenreekswaarde van 0 - n).

Equivalent gewicht van de wachtrijen – geeft aan dat elk van de wachtrijen ongeveer hetzelfde aantal berichten zal ontvangen (elk bericht zal slechts in ƩƩn wachtrij worden geplaatst). Er is geen volledige garantie voor een gelijkmatige verdeling van berichten Hash.

Grafische weergave van de berichtenstroom:

RabbitMQ. Deel 2. Laten we Exchanges verkennen

wordt berekend op basis van de routeringssleutel of eigenschap van het bericht. Als alle gepubliceerde berichten verschillende routeringssleutels hadden of headers , dan zal de verdeling op basis van gewicht plaatsvinden. Anders zal de routeringssleutel of headersMoet helpen wanneer de bandbreedte van de consument meer moet groeien dan de oplossing met meerdere consumenten die dezelfde wachtrij gebruiken. headers.

Combinatie van exchanges (E2E)

Het gedrag van alle exchanges kan worden gecombineerd met behulp van verbinding

Exchange-to-Exchange (de combinatie van exchanges valt niet onder de specificatie . Dit is een protocoluitbreiding aan de zijde van AMQPDoor middel van RabbitMQ).

Grafische weergave van de berichtenstroom:

RabbitMQ. Deel 2. Laten we Exchanges verkennen

E2E E2E we kunnen de juiste schaalbare configuratie vinden die voldoet aan zowel de huidige als de groeiende eisen.

Exchange creƫren

Het creƫren van een exchange gebeurt via een synchronisatie RPC verzoek aan de server. Het verzoek wordt gedaan met behulp van de methode Exchange.Declare, aangeroepen met de parameters:

  • naam van de exchange
  • type exchange
  • andere parameters

Voorbeeld van aanmaak exchange met behulp van RabbitMQ.Client:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • exchange — de naam van de exchange die we willen creĆ«ren. De naam moet uniek zijn
  • type — type exchange
  • duurable — als ingesteld true, dan exchange zal permanent zijn. Het zal op de schijf worden opgeslagen en kan een server/broker herstart overleven. Als de waarde false, dan exchange tijdelijk is, wordt het verwijderd wanneer de server/broker opnieuw opstart
  • autoDelete — automatische verwijdering. Exchange het wordt verwijderd wanneer alle gerelateerde wachtrijen worden verwijderd
  • arguments — optionele argumenten. Meestal worden via argumenten alternative exchange (alternatieve exchange). Als een bericht niet via de oorspronkelijke route kan, kan het naar de alternatieve exchange worden gestuurd voor routering via een andere weg.

RabbitMQ. Deel 2. Laten we Exchanges verkennen

Als het creƫren exchange mogelijk, zal de server een synchronisatie RPC op de kritiek van het gebruik van advertentieblokker als middel om persoonlijke conflicten op te lossen en druk uit te oefenen op gebruikers, verklaarde ontwikkelaar dimisa Exchange.DeclareOkverzenden. Als het creƫren onmogelijk is (er was een fout bij het verzoek Exchange.Declare), dan zal de kanaal sluiten door de server met behulp van een asynchrone opdracht Channel.Close en de client ontvangt een uitzondering OperationInterruptedException, die de foutcode en de omschrijving zal bevatten.

De exchange moet zijn aangemaakt voordat berichten worden gepubliceerd. Als je een bericht publiceert naar een niet-bestaande exchange — RabbitMQ zult het stil worden verwijderd.

Exchange creƫren via de grafische interface

Ga naar het beheerderspaneel RabbitMQ onder gebruikersnaam gast; (username: gast; en password: gast;). Let op dat de gebruiker gast; alleen vanaf de lokale host kan verbinden. Laten we nu naar het tabblad Exchanges gaan en op de Add a new exchange. Vul de eigenschappen in:

RabbitMQ. Deel 2. Laten we Exchanges verkennen

Het merendeel van de eigenschappen is hierboven beschreven. Hier moeten we opmerken dat als je Intern, de exchange alleen gebruikt kan worden voor E2E. Producer kan geen berichten naar zo'n exchange sturen.

Conclusie

Bij het ontwikkelen van een systeem is het handig de topologie van routering te beschrijven met behulp van een grafiek. Maar voordat je begint met het bouwen van de grafiek, is het het beste om de drukke paden te identificeren, aangezien zij hogere doorvoer vereisen. (prestaties). Vervolgens kan het verkeer gecategoriseerd worden. En pas daarna kan begonnen worden met de opbouw.

Als er in de gebouwde grafiek een eindige hoeveelheid routeringssleutels bestaat, dan is het de moeite waard om naar meerdere fanout exchange, die 1:1 gekoppeld zijn aan de routeringssleutel, te kijken. Onthoud dat fanout exchange de snelste is.

Als het aantal routes naar oneindigheid neigt, is het de moeite waard om aandacht te besteden aan topic exchange of, als het sjabloon niet nodig is, kan men kiezen voor directe uitwisseling, aangezien deze sneller is. topic exchange.

Combinaties van verschillende exchange moeten helpen om de juiste schaalbare configuratie, die voldoet aan zowel de huidige als de groeiende vereisten van het systeem, te vinden.

Aantal exchange en wachtrijen moet minimaal zijn in vergelijking met het aantal routes.

In het volgende artikel beginnen we dieper in te gaan op Queues en Bindings.

Links

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster