NSQ

@igor: A jel znaš ti kako radi NSQ?

by Quille and friends

Što je NSQ?

New Simple Queue

A realtime distributed messaging platform

http://nsq.io/

Dokumentacija http://nsq.io/overview/design.html

Source https://github.com/nsqio/nsq

Terminologija

  • Producer - klijent koji šalje poruke
  • Subscriber - klijent koji prima poruke
  • Message - poruka koju razmjenjuju Producer i Subscriber
  • Topic - queue poruka koje je poslao klijent
  • Channel - queue poruka na Topic-u koje konzumira Subscriber

Poruka (message)

  • Poruka je niz byte-ova
  • NSQ garantira isporuku poruke barem jednom, ne garantira redoslijed
  • NSQ čuva poruku dok klijent ne potvdi primitak FIN
  • U slučaju timeouta isporuke ponavlja poruku REQ (re-queue)
  • Poruke stoje u memoriji do limita nakon čega se snimaju na disk

Topic

  • Topic se kreira prilikom slanja prve poruke
  • Svaki Topic ima određeno ime, koje postavlja klijent
  • Sve poruke koje kijent pošalje prvo ulaze u Topic
  • Poruke stoje u Topic-u sve dok se ne stvori Channel
  • Producer uvijek piše na Topic

Channel

  • Channel se kreira kad klijent želi čitati poruke iz Topica
  • Svaki Channel ima određeno ime, koje postavlja klijent
  • Poruke se iz Topica prebacuju u Channel(e) koje klijent čita
  • Poruke stoje u Channel-u ako ih klijent ne čita
  • Subscriber uvijek čita iz Channel-a

Ephemeral

  • Topic/Channel može biti ephemeral
  • Iz ephemeral-a poruke se ne snimanju na disk prilkom overflow-a
  • Ephemeral Topic/Channel se brišu kad više nema spojenih klijenata
  • Ephemeral Channel je zgodan za snifanje poruka

NSQ Komponente

  • nsqd - daemon koji prima, queue-ove, i isporučuje poruke klijentima.
  • nsqlookupd - daemon koji čuva informacije o topologiji clustera.
  • nsqadmin - Web UI za pregled cluster-a, statistika i administraciju.

NSQD

Dokumentacija http://nsq.io/components/nsqd.html

prima poruke od producera, isporučuje subscriber-u

kreira Topic-e i Channele na zahtjev klijenta

može raditi standalone ili u cluster-u s nsqlookup-om

kad je u cluster-u oglašava topic-e i channel-e nsqlookup-u

preporučeno je pokrenuti jednu instancu po serveru s producerima

NSQLOOKUPD

Dokumentacija http://nsq.io/components/nsqlookupd.html

nsqd oglašava topic-e i channel-e na nsqlookupd-u

klijenti pronalaze nsqd-ove s topic-ima i channel-ima pomoću nsqlookupd-a

nsqd oglašava topic-e i channel-e na nsqlookupd-u

preporučeno je pokrenuti više instanci u datacentru

NSQADMIN

Dokumentacija http://nsq.io/components/nsqadmin.html

prikuplja informacije sa nsqlookupd-ova

kroz WEB UI omogućuje nadzor i adminstraciju channel-a i topic-a

dovoljna je jedna instanca u clusteru

Kako putuju poruke kroz NSQ

Izbjegavanje SPOF

Kako izbjeći Single Point Of Failure?

  • Klijenti se spajaju na sve NSQD-ove koji imaju određeni Topic/Channel
  • NSQLOOKUPD-ovi ne razgovaraju međusobno, ali će u određenom trenutku imati sve podatke
  • Zanimljivo je pitanje kako imati više od jednog NSQD-a sa istim Topic/Channel-ima

NSQ Utility

  • nsq_stat prikazuje agregirane statistike svih Producera za neki Topic/Channlel
  • nsq_tail čita Topic/Channel i prikazuje na stdout-u
  • nsq_to_file čita Topic/Channel i snima u file
  • nsq_to_http čita Topic/Channel radi POST/GET na neki endpoint
  • nsq_to_nsq čita Topic/Channel i radi republish u NSQ
  • to_nsq čita stdin i publish-a na Topic

NSQ Client-i

Postoji implementacija NSQ klijenta za različite jezike.

Mi koristimo klijente:

Kako se NSQ koristi?

Treba nam Poruka koju želimo poslati

Dobro je imati Producera koji šalje poruke

Producer će kreirati Topic kad pošalje prvu Poruku

Subsciber će otvoriti Channel kad želi primiti Poruku

Ali kako ?????

Super Mario pomaže!

On NSQ koristi već godinama!

Kako poslati poruku?


// Producer
nsqtopic := "super.mario"
producer := nsq.MustNewProducer(nsqtopic)
defer producer.Close()
....
// Posalji
msg := "Poruka koju saljem!"
producer.Publish([]byte(msg))
						

Kako primiti poruku?


// Consumer
nsqtopic := "super.mario"
consumer = nsq.MustNewConsumer(nsqtopic, onNSQMsg)
defer consumer.Close()
....
func onNSQMsg(msg *nsq.Message) error {
	fmt.Println(string(msg.Body))
	return nil
}
						

Primjeri distribucije poruka

Distribucija poruka se definira pomoću naziva Topic-a i Channel-a

  • Ista poruka na više klijenata
  • Paralelna obrada poruka
  • Više producera šalje poruke na jednog ili više klijenata

Ista poruka na više klijenata (distribucija)

Producer kreira Topic npr porukeTopic i šalje poruke

Subscriber 1 se spaja na Topic porukeTopic i kreira Channel npr subscriber-1

Subscriber 2 se spaja na Topic porukeTopic i kreira Channel npr subscriber-2

Oba Subscribera primaju istu poruku poslanu na porukeTopic

Distribucija kod nas

backend_api šalje listice na Listici.svc i nsq_to_mongo

Paralelna obrada poruka (balansiranje)

Producer kreira Topic npr porukeTopic i šalje poruke

Subscriber 1 se spaja na Topic porukeTopic i kreira/spaja na Channel npr subscriber

Subscriber 2 se spaja na Topic porukeTopic i kreira/spaja na Channel npr subscriber

Subscriberi ovisno o brzini obrade naizmjence dobivanju poruke poslane na porukeTopic

Paralelna obrada kod nas

Upis listića s backend_api-a prema na DBI-u

Više producera šalje poruke na jednog ili više klijenata

Producer 1 kreira topic npr porukeTopic i šalje poruke

Producer 2 spaja se na topic npr porukeTopic i šalje poruke

Sve poruke završavaju u istom topicu, o imenu channel-a subscribera ovisi distribucija

Različita imena channela omogućuju distribuciju na više klijenata, isto ime channela paralelna obrada.

Više Producera, jedan ili više klijenta kod nas

Upis listića s web_app_api-a prema backend_api-u

Nagradna igra

Pravila nagradne igre

  • Najbrži sudionik dobiva pravo na odgovor
  • Prijave za odgovore počinju kad predavač kaže
    Vrijeme SAD!
  • Najtočniji odgovor dobiva nagradu

Pitanje za Kraš Torticu

Koja je razlika između nsqd i nsqlookupd?

Nemoj misliti na Torticu!

nsqd prima poruke od publishera i šalje ih subscriberima, kreira topic-e i channel-e oglašava ih na nsqlookupd-u koji čuva podatke na kojem nsqd-u gde se nalaze topic-i i channel-i

Pitanje za Kraš Torticu ponovo

Što će se dogoditi s porukama poslanim na Topic ako nema Subscribera?

Ponovo nemoj misliti na Torticu!

Gomilati će se u Topic-u dok Subscriber ne stvori Channel, zatim će se prebaciti u Channel iz kojeg će ih Subscriber pročitati

Koliko će tada ostati poruka u topic-u a koliko u channel-u ako ih subscriber više ne šalje?

Točno nula, nada ili baš ništa!

Pitanje za Raspberry PI 1 B

Koliko ima vrata na ormaru u Minus5 konferencijskoj?

Nemoj misliti na Raspberry PI!

Točno: 16 ili 0x10 ili %10000

NSQ The End

@igor: A jel ti SAD znaš kako radi NSQ?

Hvala! @Quille over and out..

@moni: Ako je Bicko za 5 ocjenite današnju prezentaciju