Förklara Apache Kafka som om jag är fem år

Permalänk
Moderator
Testpilot

Förklara Apache Kafka som om jag är fem år

Mors.

Är det någon av er skarpa sinnen på forumet som kan förklara hur Apache Kafka fungerar på ett enkelt sätt? Mina kunskaper kring detta är i det närmaste obefintligt.

Tack på förhand.

Visa signatur

ASrock x470 Taichi Ultimate - AMD Ryzen R9 3900x - G.Skill Ripjaws@3.6GHz 16GB RAM - RTX 3080 Ti - Super Flower Leadex Gold 1000W - Phanteks Enthoo Pro - AOC AG35UCG 34" 3440x1440p@100Hz - kalaset vattenkylt

Permalänk
Medlem
Skrivet av Dinoman:

Mors.

Är det någon av er skarpa sinnen på forumet som kan förklara hur Apache Kafka fungerar på ett enkelt sätt? Mina kunskaper kring detta är i det närmaste obefintligt.

Tack på förhand.

Kafka är ett system som används för att program ska kunna dela med sig av information utan att för den sakens skull veta vilka andra program som skulle vilja ta del av informationen. En enhet information kallas "meddelande" och kategoriseras under ett ämne (i Kafkavärlden kallat "topic").

Ett program som delar information kallas "producer" och skriver som sagt till en topic, från vilken andra program ("consumers") sedan kan läsa informationen. Consumers håller själva koll på hur långt de har läst en topic, och raderar aldrig meddelanden till skillnad från klassiska kösystem. Detta innebär att nya consumers senare kan koppla upp sig mot samma topic och börja läsa meddelanden från start.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Moderator
Testpilot
Skrivet av Teknocide:

Kafka är ett system som används för att program ska kunna dela med sig av information utan att för den sakens skull veta vilka andra program som skulle vilja ta del av informationen. En enhet information kallas "meddelande" och kategoriseras under ett ämne (i Kafkavärlden kallat "topic").

Ett program som delar information kallas "producer" och skriver som sagt till en topic, från vilken andra program ("consumers") sedan kan läsa informationen. Consumers håller själva koll på hur långt de har läst en topic, och raderar aldrig meddelanden till skillnad från klassiska kösystem. Detta innebär att nya consumers senare kan koppla upp sig mot samma topic och börja läsa meddelanden från start.

Tack för den förklaringen, mycket enkelt och bra.

Varför ska man då köra något som kafka istället för att t.ex. direktintegrera via API?

Visa signatur

ASrock x470 Taichi Ultimate - AMD Ryzen R9 3900x - G.Skill Ripjaws@3.6GHz 16GB RAM - RTX 3080 Ti - Super Flower Leadex Gold 1000W - Phanteks Enthoo Pro - AOC AG35UCG 34" 3440x1440p@100Hz - kalaset vattenkylt

Permalänk
Medlem
Skrivet av Dinoman:

Tack för den förklaringen, mycket enkelt och bra.

Varför ska man då köra något som kafka istället för att t.ex. direktintegrera via API?

Direktanrop:

  • är riktade: Ett anrop går till en enskild mottagare. För att distribuera ett meddelande måste N anrop göras till N mottagare;

  • är synkrona: I anropskedjan A->B->C—där A, B och C är fristående program—väntar B på att C ska svara, och A väntar på att B(->C) ska svara. Långa anropskedjor ökar felkänsligheten då den yttersta anroparen blir påverkad av svar från efterföljande tjänster;

Meddelandesystem:

  • är oriktade: Det som skrivs till en topic kan läsas av andra program med tillgång till meddelandesystemet. Producenten kontrollerar inte konsumenten;

  • är asynkrona: A skriver till topic ATopic; B lyssnar på ATopic, behandlar datan och skriver till BTopic; C lyssnar på BTopic och skriver till CTopic; A läser från CTopic;

Ett meddelandesystem passar bra för kommunikation mellan program där man inte kan eller vill skapa täta beroenden mellan tjänster. Då enskilda program konsumerar meddelanden i sin egen takt minimeras risken att man råkar DDOS:a sig själv. Man kan ta ner en tjänst utan att meddelanden går förlorade: när den startar igen kan det ha trillat in nya meddelanden som den kan behandla. osv.

Nackdelen är att det inte alltid passar med asynkron kommunikation: Besökare på en webbplats vill troligtvis ha ett direkt svar—t ex en webbsida eller en bild på något gulligt djur—och inte ett meddelande i stil med "Servern behandlar ditt ärende. Gå till /dittsvar och ladda om tills det du efterfrågade är färdigställt"

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Moderator
Testpilot
Skrivet av Teknocide:

Direktanrop:

  • är riktade: Ett anrop går till en enskild mottagare. För att distribuera ett meddelande måste N anrop göras till N mottagare;

  • är synkrona: I anropskedjan A->B->C—där A, B och C är fristående program—väntar B på att C ska svara, och A väntar på att B(->C) ska svara. Långa anropskedjor ökar felkänsligheten då den yttersta anroparen blir påverkad av svar från efterföljande tjänster;

Meddelandesystem:

  • är oriktade: Det som skrivs till en topic kan läsas av andra program med tillgång till meddelandesystemet. Producenten kontrollerar inte konsumenten;

  • är asynkrona: A skriver till topic ATopic; B lyssnar på ATopic, behandlar datan och skriver till BTopic; C lyssnar på BTopic och skriver till CTopic; A läser från CTopic;

Ett meddelandesystem passar bra för kommunikation mellan program där man inte kan eller vill skapa täta beroenden mellan tjänster. Då enskilda program konsumerar meddelanden i sin egen takt minimeras risken att man råkar DDOS:a sig själv. Man kan ta ner en tjänst utan att meddelanden går förlorade: när den startar igen kan det ha trillat in nya meddelanden som den kan behandla. osv.

Nackdelen är att det inte alltid passar med asynkron kommunikation: Besökare på en webbplats vill troligtvis ha ett direkt svar—t ex en webbsida eller en bild på något gulligt djur—och inte ett meddelande i stil med "Servern behandlar ditt ärende. Gå till /dittsvar och ladda om tills det du efterfrågade är färdigställt"

Tack så mycket. Kristallklart.

Så detta skulle alltså innebära att man kan ha ett producerande system med (master data) som med hjälp av Kafka kan hålla information tillgänglig 24/7 utan att för den delen vara ett system som ligger uppe och är tillgänglig för massor av anrop 24/7?

Visa signatur

ASrock x470 Taichi Ultimate - AMD Ryzen R9 3900x - G.Skill Ripjaws@3.6GHz 16GB RAM - RTX 3080 Ti - Super Flower Leadex Gold 1000W - Phanteks Enthoo Pro - AOC AG35UCG 34" 3440x1440p@100Hz - kalaset vattenkylt

Permalänk
Medlem
Skrivet av Dinoman:

Tack så mycket. Kristallklart.

Så detta skulle alltså innebära att man kan ha ett producerande system med (master data) som med hjälp av Kafka kan hålla information tillgänglig 24/7 utan att för den delen vara ett system som ligger uppe och är tillgänglig för massor av anrop 24/7?

Om du med "master data" menar meddelanden som systemet har producerat så skulle de finnas tillgängliga på Kafka under en eller flera topics, trots att systemet som producerade meddelandena inte är uppe och snurrar. Notera att Kafka inte är en databas eller ett "fönster" för att kika på data som finns i "master system".

Kanske är enklare med ett konkret exempel. Säg att du har en webbshop där du tar emot beställningar som ska faktureras och paketeras. Fakturan ska skickas ut med mejl och sedan ska en paketeringsinstruktion gå vidare till lagret.

System A: Tar emot beställning System B: Visar ordrar som ska paketeras och vart de ska skickas System C: Skickar mejl med faktura System A skriver ett meddelande: order-id: 42 beställare: kalle@torpet.se varor: hammare + spik adress: Torpvalla 12 34567 Sverige till topic "mottagna_beställningar" System B läser från "mottagna_beställningar" och visar datan på en skärm. När en lagerarbetare skickat iväg en order klickar hen på en knapp och ett meddelande: order-id: 42 status: levererad <beställare + varor osv.> skickas till topic "hanterade_ordrar" System C läser från "hanterade_ordrar" och skickar iväg ett mejl. Om mejlet går iväg skrivs ett meddelande: order-id: 42 till topic "utskickade_fakturor" System A kan läsa "hanterade_ordrar" och "utskickade_fakturor" för att se hur långt i förloppet en beställning har kommit.

Om systemet hade byggts med direktanrop behöver System A kontakta System B och lägga till en paketeringsförfrågan. Om System B är nere för underhåll måste System A avfärda hela beställningen ("Beställningen misslyckades, vi har tekniska problem"). Om System C av någon anledning inte är tillgängligt kan System B inte skicka ett direktmeddelande när allt är färdigpaketerat och man kan sålunda inte skicka beställningen på frakt, eller så får man skicka ut det ändå och hantera fakturautskicket manuellt.

Om System A gör direktanrop till System B och System C parallellt skulle det kunna uppstå en situation där en faktura skickats utan att lagret fått någon information om att beställningen ska paketeras. (ifall System B är nere och System C uppe)

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Moderator
Testpilot
Skrivet av Teknocide:

Om du med "master data" menar meddelanden som systemet har producerat så skulle de finnas tillgängliga på Kafka under en eller flera topics, trots att systemet som producerade meddelandena inte är uppe och snurrar. Notera att Kafka inte är en databas eller ett "fönster" för att kika på data som finns i "master system".

Kanske är enklare med ett konkret exempel. Säg att du har en webbshop där du tar emot beställningar som ska faktureras och paketeras. Fakturan ska skickas ut med mejl och sedan ska en paketeringsinstruktion gå vidare till lagret.

System A: Tar emot beställning System B: Visar ordrar som ska paketeras och vart de ska skickas System C: Skickar mejl med faktura System A skriver ett meddelande: order-id: 42 beställare: kalle@torpet.se varor: hammare + spik adress: Torpvalla 12 34567 Sverige till topic "mottagna_beställningar" System B läser från "mottagna_beställningar" och visar datan på en skärm. När en lagerarbetare skickat iväg en order klickar hen på en knapp och ett meddelande: order-id: 42 status: levererad <beställare + varor osv.> skickas till topic "hanterade_ordrar" System C läser från "hanterade_ordrar" och skickar iväg ett mejl. Om mejlet går iväg skrivs ett meddelande: order-id: 42 till topic "utskickade_fakturor" System A kan läsa "hanterade_ordrar" och "utskickade_fakturor" för att se hur långt i förloppet en beställning har kommit.

Om systemet hade byggts med direktanrop behöver System A kontakta System B och lägga till en paketeringsförfrågan. Om System B är nere för underhåll måste System A avfärda hela beställningen ("Beställningen misslyckades, vi har tekniska problem"). Om System C av någon anledning inte är tillgängligt kan System B inte skicka ett direktmeddelande när allt är färdigpaketerat och man kan sålunda inte skicka beställningen på frakt, eller så får man skicka ut det ändå och hantera fakturautskicket manuellt.

Om System A gör direktanrop till System B och System C parallellt skulle det kunna uppstå en situation där en faktura skickats utan att lagret fått någon information om att beställningen ska paketeras. (ifall System B är nere och System C uppe)

Tack,

nu är jag mycket klokare.

Med "master data" så menar jag en bärare av information. Till exempel ett tekniskt material typ en polymer, som har klassifikationer och attribut kopplade till sig. Tekniskt namn, kundnamn, översättningar av kundnamn, teknisk specifikation samt andra "triggers" som skall läsas av konsumerande system för att påverka deras funktion på olika sätt.

Vet inte om det förändrar på något sätt hur en teknologi som Kafka kan implementeras.

Visa signatur

ASrock x470 Taichi Ultimate - AMD Ryzen R9 3900x - G.Skill Ripjaws@3.6GHz 16GB RAM - RTX 3080 Ti - Super Flower Leadex Gold 1000W - Phanteks Enthoo Pro - AOC AG35UCG 34" 3440x1440p@100Hz - kalaset vattenkylt