RabbitMQ-viestintä ja asynkroniset järjestelmät · Oppitunti

Komento–kysely-vastuun erottelu (CQRS)

Soveltakaa CQRS-mallia luku- ja kirjoitustoimintojen erottamiseen sovelluksessanne RabbitMQ:n avulla. Parantakaa dataintensiivisten järjestelmien skaalautuvuutta ja suorituskykyä.

Oppitunti 3/411 vaihetta

Komento–kysely-vastuun erottelu (CQRS) on ilmainen RabbitMQ-viestintä ja asynkroniset järjestelmät-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu RabbitMQ-viestintä ja asynkroniset järjestelmät-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. RabbitMQ-viestintä ja asynkroniset järjestelmät-kurssilla on yhteensä 4 oppituntia.

Mikä CQRS on?

Oletteko koskaan toivoneet, että sovelluksenne pystyisi käsittelemään valtavan määrän luku- ja kirjoitusoperaatioita hidastumatta? Tähän auttaa CQRS! Lyhenne tulee sanoista Command-Query Responsibility Segregation.

CQRS on arkkitehtuurikuvio, jossa tietojen lukemiseen liittyvät operaatiot erotetaan tietojen päivittämiseen liittyvistä operaatioista. Ajatelkaa sitä kahtena erikoistuneena tiiminä: toinen ottaa vastaan tilauksia ja toinen vastaa kysymyksiin.

Komentojen ymmärtäminen

"Command"-puoli käsittelee kaikki pyynnöt, jotka muuttavat sovelluksen tilaa. Tällaisia toimintoja ovat esimerkiksi "CreateProduct", "UpdateOrderStatus" ja "AddUser".

  • Komennot ovat imperatiivisia: Ne käskevät järjestelmää tekemään tietyn toiminnon.
  • Komennot käsitellään: Ne kulkevat käsittelijöiden läpi, jotka validoivat ja suorittavat pyydetyn muutoksen.
  • Komennot käynnistävät usein tapahtumia: Kun komento on käsitelty onnistuneesti, voidaan julkaista tapahtuma.

Kyselyiden ymmärtäminen

"Query"-puoli keskittyy tietojen hakemiseen. Tällaisia pyyntöjä ovat esimerkiksi "GetProductDetails", "ListAllOrders" ja "FindUsersByLocation".

  • Kyselyt ovat deklaratiivisia: Ne pyytävät tietoja muuttamatta mitään.
  • Kyselyissä käytetään optimoituja malleja: Tiedot tallennetaan usein lukemiseen optimoidussa muodossa, joka soveltuu nopeaan hakuun.
  • Kyselyt palauttavat tietoja: Ne toimittavat käyttöliittymän tai muiden palvelujen pyytämät tiedot.

CQRS:n hyödyt

Komento- ja kyselytoimintojen erottaminen tarjoaa useita etuja erityisesti monimutkaisissa järjestelmissä:

  • Skaalautuvuus: Luku- ja kirjoituspalveluita voidaan skaalata toisistaan riippumatta. Lukumallit saavat usein enemmän liikennettä.
  • Suorituskyky: Lukumallit voidaan optimoida tehokkaasti kyselyitä varten (esimerkiksi denormalisoidut tiedot tai eri tietokannat).
  • Joustavuus: Lukemiseen (esimerkiksi nopeaan NoSQL-tallennukseen) ja kirjoittamiseen (esimerkiksi yhdenmukaisuuden takaavaan SQL-tallennukseen) voidaan käyttää eri tietovarastoja.
  • Yksinkertaisuus: Kukin malli on yksinkertaisempi ja keskittyy omaan tehtäväänsä.

RabbitMQ:n rooli CQRS:ssä

RabbitMQ soveltuu erinomaisesti CQRS:n toteuttamiseen, erityisesti komentopuolella. Kun komento annetaan, se voidaan julkaista viestinä RabbitMQ-jonoihin.

Kuluttajat (komentokäsittelijät) poimivat viestit ja suorittavat liiketoimintalogiikan kirjoitusmallin päivittämiseksi. Näin komentojen käsittelystä tulee asynkronista ja toisistaan riippumatonta.

Tuottaja: tuotteen nimen päivittäminen

Kuvitellaan, että haluamme päivittää tuotteen nimen. Lähetämme RabbitMQ:lle "UpdateProductNameCommand"-viestin. Tässä on yksinkertainen Java-tuottajaesimerkki:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class CommandProducer {
    private final static String QUEUE_NAME = "product_commands";

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

            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            String commandJson = "{\"commandType\":\"UpdateProductName\", \"productId\":\"P123\", \"newName\":\"New Awesome Product\"}";
            channel.basicPublish("", QUEUE_NAME, null, commandJson.getBytes("UTF-8"));
            System.out.println(" [x] Sent command: '" + commandJson + "'");
        }
    }
}

Kuluttaja: tuotepäivityksen käsittely

Toisessa päässä kuluttajapalvelu eli komentokäsittelijämme kuuntelee näitä komentoja. Kun se vastaanottaa "UpdateProductName"-komennon, se päivittää auktoritatiivisen kirjoitusmallin (esimerkiksi SQL-tietokannan).

Tämä kuluttaja edustaa CQRS-arkkitehtuurimme "write"-puolta.

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

public class CommandConsumer {
    private final static String QUEUE_NAME = "product_commands";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for commands. To exit press CTRL+C");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received command: '" + message + "'");
            // In a real app, parse JSON, validate, update write model (e.g., database)
            System.out.println(" [x] Product write model updated for: " + message.split(":")[2].split(",")[0]);
        };
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
    }
}

Lukumallien synkronointi

Kun kirjoitusmalli on päivitetty, miten lukumalli saa uudet tiedot? Tämä tehdään usein julkaisemalla tapahtumia.

Kun tuotteen nimi muuttuu, komentokäsittelijä voi julkaista "ProductNameUpdatedEvent"-tapahtuman toiseen RabbitMQ-vaihtopisteeseen. Erillinen palvelu (projektori tai denormalisoija) tilaa tämän tapahtuman ja päivittää lukemiseen optimoidun tietovaraston.

  • Kirjoitusmalli: Optimoitu tapahtumien yhdenmukaisuutta varten.
  • Lukumalli: Optimoitu kyselyiden suorituskykyä varten.

Nopea tietojen haku

Kun lukumalli on päivitetty, asiakassovellukset voivat tehdä kyselyitä suoraan siihen. Koska tämä malli on suunniteltu erityisesti lukemista varten, kyselyt ovat usein paljon nopeampia ja yksinkertaisempia.

Esimerkiksi tuoteluettelopalvelu voisi hakea tuotetiedot tästä lukumallista koskematta lainkaan monimutkaiseen tapahtumien käsittelyyn optimoituun kirjoitusmalliin.

CQRS:n perusperiaate

Tarkastelkaa käsittelemäämme arkkitehtuuria. Mikä on CQRS:ssä luku- ja kirjoitusmallien erottamisen tärkein hyöty?

CQRS: skaalautuvuus ja suorituskyky

Tässä oppitunnissa opitte Command-Query Responsibility Segregation (CQRS) -kuviosta. Näimme, kuinka siinä tietojen muokkaaminen (komennot) erotetaan tietojen hakemisesta (kyselyt), usein eri tietomalleja käyttämällä.

RabbitMQ on tärkeässä roolissa mahdollistamalla komentojen asynkronisen käsittelyn. Näin sovelluksen luku- ja kirjoitustoimintoja voidaan skaalata ja optimoida toisistaan riippumatta. Tämä kuvio sopii erinomaisesti dataintensiivisiin ja suorituskykyisiin järjestelmiin.

Aloita maksutta

Opi RabbitMQ-viestintä ja asynkroniset järjestelmät tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
11
Oppitunnit
44

Usein kysytyt kysymykset

Onko oppitunti ”Komento–kysely-vastuun erottelu (CQRS)” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa RabbitMQ-viestintä ja asynkroniset järjestelmät-oppimispolun 3 oppituntia, myös oppitunnin “Komento–kysely-vastuun erottelu (CQRS)”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. RabbitMQ-viestintä ja asynkroniset järjestelmät-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Komento–kysely-vastuun erottelu (CQRS)”?

Soveltakaa CQRS-mallia luku- ja kirjoitustoimintojen erottamiseen sovelluksessanne RabbitMQ:n avulla. Parantakaa dataintensiivisten järjestelmien skaalautuvuutta ja suorituskykyä. Harjoittelet RabbitMQ-viestintä ja asynkroniset järjestelmät-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni RabbitMQ-viestintä ja asynkroniset järjestelmät-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin RabbitMQ-viestintä ja asynkroniset järjestelmät-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Komento–kysely-vastuun erottelu (CQRS)”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä RabbitMQ-viestintä ja asynkroniset järjestelmät-oppitunnilla?

Kyllä. Jokainen RabbitMQ-viestintä ja asynkroniset järjestelmät-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Idempotenssi viestien käsittelyssä
  2. Saga-malli RabbitMQ:lla
  3. Komento–kysely-vastuun erottelu (CQRS)
  4. Outbox-malli luotettavaan julkaisemiseen
← Takaisin: RabbitMQ-viestintä ja asynkroniset järjestelmät