KonijnMQ. Deel 2. Uitwisselingen begrijpen

Exchange — wisselaar of wisselpunt. Er worden berichten naartoe gestuurd. Exchange verspreidt boodschap in één of meer wachtrijen. Hij stuurt berichten naar een wachtrij op basis van de gemaakte verbindingen (bindings) tussen hem en de wachtrij.

Exchange is niet Erlang-proces. Om schaalbaarheidsredenen exchange - dit is een regel (link naar een module met code waar de routeringslogica ligt) in de ingebouwde database geheugenverlies. Duizend wisselaars verbruiken slechts 1 MB geheugen.

inhoudsopgave

Directe uitwisseling

Direct exchange - gebruikt wanneer dat nodig is bericht bezorgen aan specifieke wachtrijen. Het bericht wordt met een specifieke vermelding naar de uitwisselaar gepubliceerd routeringssleutel en komt in alle wachtrijen die met deze wisselaar zijn verbonden met een vergelijkbare routeringssleutel. De routeringssleutel is een tekenreeks. Matching wordt gevonden met behulp van tekenreeksen controleren op gelijkwaardigheid.

Grafische weergave van de berichtenstroom:

KonijnMQ. Deel 2. Uitwisselingen begrijpen

В rabbitmq er is een concept standaard wisselaar. Het direct exchange geen naam. Als de standaarduitwisselaar wordt gebruikt, wordt het bericht doorgestuurd naar een wachtrij met de naam gelijk aan sleutel voor berichtroutering.

Onderwerp uitwisseling

Topic exchange - vergelijkbaar direct exchange maakt selectieve routering mogelijk door de routeringssleutel te vergelijken. Maar in dit geval is de sleutel gegeven op sjabloon. Gebruik bij het maken van een sjabloon 0 of meer woorden (letters AZ и az en cijfers 0-9), gescheiden door een punt, evenals symbolen * и #.

  • * - kan worden vervangen door exact 1 слово
  • # - kan worden vervangen door 0 of meer woorden

Grafische weergave van de berichtenstroom:

KonijnMQ. Deel 2. Uitwisselingen begrijpen

Sinds versie RabbitMQ 2.4.0 routeringsalgoritme voor topic exchange begon te werken tot 145 keer sneller. Dit hebben ze bereikt door een aanpak te introduceren probeer de implementatie, waarbij patronen worden weergegeven als een boomstructuur. Bijvoorbeeld sjablonen a.b.c, a.*.b.c, a.#.c и b.b.c zal worden weergegeven door de volgende structuur:

KonijnMQ. Deel 2. Uitwisselingen begrijpen

Het zoeken naar het matchen van een patroon wordt uitgevoerd vanaf de wortel en van boven naar beneden.

Features:

  • het gebruik van deze wisselaar kan worden een goede keuze voor de mogelijke toekomstige ontwikkeling van de applicatie, omdat templates kunnen altijd aangepast worden zodat het bericht op dezelfde manier gepubliceerd wordt direct exchange of fanout exchange
  • sjablonen die gebruiken * veel snellerdan sjablonen die gebruiken #.
  • topic exchange langzamer direct exchange

Fanout-uitwisseling

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

Features:

  • RabbitMQ werkt niet met routingsleutels en sjablonen wat een positief effect heeft op de productiviteit. Dit is de snelste exchange;
  • alle consumenten moeten alle berichten kunnen verwerken;

Grafische weergave van de berichtenstroom:

KonijnMQ. Deel 2. Uitwisselingen begrijpen

Uitwisseling van koppen

Headers exchange - routeert berichten naar bijbehorende wachtrijen op basis van vergelijking van (sleutel, waarde) eigenschapsparen headers bindingen en vergelijkbare berichteigenschappen. headers vertegenwoordigen zichzelf Dictionary<ключ, значение>.

Als u een speciale sleutel aan het woordenboek toevoegt x-match met betekenis any, dan wordt het bericht gerouteerd als er een gedeeltelijke match is van (sleutel, waarde) paren. Dit gedrag is vergelijkbaar met dat van de operator or.

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

Standaardsleutel x-match bevat de waarde all. Dit betekent dat het bericht wordt gerouteerd als de (sleutel, waarde)paren exact overeenkomen. Dit gedrag is vergelijkbaar met dat van de operator and.

Grafische weergave van de berichtenstroom:

KonijnMQ. Deel 2. Uitwisselingen begrijpen

Features:

  • extra flexibiliteit
  • extra rekenkundige overhead. Alle (sleutel, waarde) paren van een attribuut headers moet worden gesorteerd op sleutelnaam voordat berichtrouteringswaarden worden berekend. Langzamer dan andere uitwisselingstypen.

Consistente hashing-uitwisseling

Deze wisselaar is inpluggen и niet ingebouwd в RabbitMQ.

Consistent-hashing exchange (uitwisseling met consistente hashing) - gebruikt wanneer er verschillende wachtrijen zijn die potentiële ontvangers van een bericht zijn, en wanneer u de belasting daartussen moet verdelen. De verbinding van een bericht met de wachtrij vindt plaats op basis van gewicht (voorwaardelijke tekenreekswaarde van 0 - n).

Equivalent gewicht van wachtrijen - geeft aan dat elke wachtrij zal ontvangen ongeveer hetzelfde bedrag berichten (elk bericht wordt in slechts één wachtrij geplaatst). Er bestaat geen volledige garantie voor een uniforme verspreiding van berichten.

Grafische weergave van de berichtenstroom:

KonijnMQ. Deel 2. Uitwisselingen begrijpen

Hash berekend op basis van routeringssleutel of eigenschap headers berichten. Als alle gepubliceerde berichten verschillende routeringssleutels hadden of headers, dan zal de verdeling naar gewicht plaatsvinden. Anders wordt de routeringssleutel gebruikt of headers.

Zou moeten helpen wanneer de doorvoer van consumenten hoger moet worden dan een oplossing waarbij meerdere consumenten één wachtrij gebruiken.

Combinatiewisselaars (E2E)

Via communicatie kan het gedrag van alle wisselaars worden gecombineerd Exchange-naar-Exchange (Combinerende wisselaars zijn niet opgenomen in de specificatie AMQP. Dit is een uitbreiding van het protocol vanaf de zijkant RabbitMQ).

Grafische weergave van de berichtenstroom:

KonijnMQ. Deel 2. Uitwisselingen begrijpen

Ten koste van E2E we kunnen de juiste schaalbare configuratie vinden om aan zowel de huidige als de groeiende eisen te voldoen.

Creëer uitwisseling

Het creëren van een wisselaar gebeurt synchroon RPC verzoek aan de server. Het verzoek wordt gedaan met behulp van de methode Exchange.Declareaangeroepen met parameters:

  • naam wisselaar
  • soort wisselaar
  • andere parameters

Voorbeeld van creatie exchange door middel van RabbitMQ.Client:

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

  • exchange — de naam van de wisselaar die we willen maken. De naam moet uniek zijn
  • type — type wisselaar
  • durable - indien geïnstalleerd truedan exchange zal permanent zijn. Het wordt op schijf opgeslagen en kan een herstart van een server/broker overleven. Als de waarde falsedan exchange is tijdelijk en wordt verwijderd wanneer de server/broker opnieuw wordt opgestart
  • autoDelete - automatische verwijdering. Exchange wordt verwijderd wanneer alle bijbehorende wachtrijen worden verwijderd
  • arguments - optionele argumenten. Meestal specificeren ze via argumenten alternative exchange (alternatieve wisselaar). Als een bericht niet langs de oorspronkelijke route kan reizen, kan het naar een alternatieve uitwisselaar worden gestuurd om langs een ander pad te worden gerouteerd.

KonijnMQ. Deel 2. Uitwisselingen begrijpen

Als creatie exchange misschien, dan stuurt de server de client een synchrone RPC beantwoorden Exchange.DeclareOk. Als creatie onmogelijk (verzoek werd afgewezen Exchange.Declare) dan het kanaal zal sluiten server met behulp van een asynchrone opdracht Channel.Close en de klant krijgt een uitzondering OperationInterruptedException, die de foutcode en de beschrijving ervan zal bevatten.

Er moet een uitwisselaar worden aangemaakt voordat berichten kunnen worden geplaatst. Als u een bericht publiceert naar een niet-bestaande uitwisselaar - RabbitMQ zal het stilletjes verwijderen.

Exchange creëren via GUI

Ga naar het beheerderspaneel RabbitMQ onder gebruiker guest (gebruikersnaam: guest en wachtwoord: guest). Houd er rekening mee dat de gebruiker guest kan alleen verbinding maken vanaf localhost. Laten we nu naar het tabblad gaan Exchanges en klik op Add a new exchange. Vul de eigenschappen in:

KonijnMQ. Deel 2. Uitwisselingen begrijpen

De meeste eigenschappen zijn hierboven beschreven. Hier merken we op dat als we instellen Internal, dan kan de exchange alleen gebruikt worden voor E2E. Producer kan geen berichten naar een dergelijke uitwisseling sturen.

Conclusie

Bij het ontwikkelen van een systeem is het handig om de topologie te beschrijven routering met behulp van een grafiek. Maar voordat u een grafiek gaat maken, is het de moeite waard om de paden met veel verkeer te markeren, omdat zij zijn degenen die eisen hogere doorvoer (prestatie). Vervolgens kunt u het verkeer classificeren. En pas dan beginnen met bouwen.

Als er in de geconstrueerde grafiek sprake is van eindige verzameling routeringssleutels, dan is het de moeite waard om naar meerdere te kijken fanout exchange, die 1:1 gerelateerd zijn aan de routeringssleutel. Wij herinneren ons dat fanout exchange de snelste.

Als het aantal routes neigt naar oneindig, dan moet je opletten topic exchange of, als de sjabloon niet nodig is, kunt u selecteren direct exchnge, omdat hij is sneller topic exchange.

Combinaties van verschillende exchange zou u moeten helpen de juiste te vinden schaalbare configuratie, dat voldoet aan zowel de huidige als de groeiende systeemvereisten.

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

In het volgende artikel zullen we wachtrijen en bindingen gedetailleerder gaan begrijpen.

referenties

Bron: www.habr.com

Voeg een reactie