Nkag siab cov lus brokers. Kawm cov tshuab ntawm kev xa xov nrog ActiveMQ thiab Kafka. Tshooj 3. Kafka

Txuas ntxiv ntawm kev txhais phau ntawv me me:
Nkag siab Cov Lus Qhia Brokers
sau: Jakub Korab, Publisher: O'Reilly Media, Inc., Hnub tim luam tawm: Lub Rau Hli 2017, ISBN: 9781492049296.

Previous translation part: Nkag siab cov lus brokers. Kawm cov tshuab ntawm kev xa xov nrog ActiveMQ thiab Kafka. Tshooj 1 Kev Taw Qhia

Tshooj 3

Kafka

Kafka tau tsim los ntawm LinkedIn kom tau txais ib ncig ntawm qee qhov kev txwv ntawm cov neeg xa xov xwm ib txwm muaj thiab zam kom tsis txhob teeb tsa ntau tus neeg xa xov xwm rau qhov sib txawv ntawm cov ntsiab lus sib txawv, uas tau piav qhia hauv phau ntawv no hauv qab "Scaling up and out" ntawm nplooj 28. . Siv cov xwm txheej LinkedIn tau tso siab rau ib txoj kev noj cov ntaub ntawv ntau heev, xws li nplooj ntawv nyem thiab nkag mus, thaum tseem tso cai rau cov ntaub ntawv ntawd siv los ntawm ntau lub tshuab yam tsis muaj kev cuam tshuam cov khoom tsim tawm lossis lwm tus neeg siv khoom. Qhov tseeb, yog vim li cas Kafka tshwm sim yog kom tau txais hom kev xa ntawv architecture uas Universal Data Pipeline piav qhia.

Muab lub hom phiaj kawg no, lwm yam kev xav tau tshwm sim. Kafka yuav tsum:

  • Ua nrawm heev
  • Muab ntau bandwidth thaum ua haujlwm nrog cov lus
  • Txhawb Publisher-Subscriber thiab Point-to-Point qauv
  • Tsis txhob qeeb nrog ntxiv cov neeg siv khoom. Piv txwv li, kev ua tau zoo ntawm ob qho tib si kab thiab cov ncauj lus hauv ActiveMQ degrades raws li tus naj npawb ntawm cov neeg siv khoom ntawm qhov chaw loj hlob.
  • Ua horizontally scalable; Yog hais tias ib tug broker uas txuas ntxiv cov lus tsuas yog ua li ntawd ntawm qhov siab tshaj plaws disk ceev, ces nws ua rau kev nkag siab mus dhau ib tus broker piv txwv kom nce kev ua tau zoo.
  • Txwv tsis pub nkag mus khaws cia thiab rov muab cov lus

Txhawm rau ua tiav tag nrho cov no, Kafka tau txais ib qho kev tsim kho uas rov txhais lub luag haujlwm thiab kev lav phib xaub ntawm cov neeg siv khoom thiab cov neeg xa xov. Tus qauv JMS yog tus broker taw qhia heev, qhov twg tus broker yog lub luag haujlwm rau kev xa xov thiab cov neeg siv khoom tsuas yog txhawj xeeb txog kev xa thiab txais cov lus. Kafka, ntawm qhov tod tes, yog cov neeg siv khoom nruab nrab, nrog rau cov neeg siv khoom siv ntau yam ntawm cov yam ntxwv ntawm tus neeg ua haujlwm ib txwm muaj, xws li kev faib ncaj ncees ntawm cov lus cuam tshuam rau cov neeg siv khoom, sib pauv rau tus broker ceev heev thiab scalable. Rau cov neeg uas tau ua haujlwm nrog cov kab lus ib txwm muaj, ua haujlwm nrog Kafka yuav tsum muaj kev hloov pauv ntawm lub siab.
Qhov kev taw qhia engineering no tau coj mus rau kev tsim cov txheej txheem kev xa xov uas muaj peev xwm nce ntxiv los ntawm ntau qhov kev txiav txim ntawm qhov loj dua piv rau ib tus neeg ua lag luam. Raws li peb yuav pom, txoj hauv kev no los nrog kev lag luam tawm, uas txhais tau tias Kafka tsis haum rau qee hom kev ua haujlwm thiab nruab software.

Unified Destination Model

Txhawm rau ua kom tiav cov kev xav tau piav qhia saum toj no, Kafka tau ua ke tshaj tawm-sau npe thiab xa mus rau taw tes rau hauv qab ib hom ntawm qhov chaw - lub ntsiab lus. Qhov no yog qhov tsis meej pem rau cov neeg uas tau ua haujlwm nrog kev xa xov, qhov twg lo lus "lub ncauj lus" yog hais txog kev tshaj tawm xov xwm uas (los ntawm lub ncauj lus) kev nyeem ntawv tsis zoo. Kafka cov ncauj lus yuav tsum raug suav hais tias yog hom hom phiaj sib txuas, raws li tau hais tseg hauv kev taw qhia rau phau ntawv no.

Rau qhov seem ntawm tshooj no, tshwj tsis yog peb qhia meej meej, lo lus "lub ntsiab lus" yuav xa mus rau lub ntsiab lus Kafka.

Txhawm rau kom nkag siab meej tias cov ntsiab lus coj li cas thiab qhov kev lees paub uas lawv muab, peb yuav tsum xub saib seb lawv tau ua li cas hauv Kafka.
Txhua lub ntsiab lus hauv Kafka muaj nws tus kheej lub cav.
Cov neeg tsim khoom xa cov lus rau Kafka sau rau lub cav no, thiab cov neeg siv khoom tau nyeem los ntawm lub cav siv cov taw qhia uas tas li mus tom ntej. Ib ntus, Kafka tshem tawm qhov qub tshaj plaws ntawm lub cav, txawm tias cov lus hauv cov ntawv no tau nyeem lossis tsis tau. Ib qho tseem ceeb ntawm Kafka tus tsim yog tias tus broker tsis saib xyuas yog tias cov lus tau nyeem lossis tsis yog - qhov no yog tus neeg siv khoom lub luag haujlwm.

Cov ntsiab lus "log" thiab "pointer" tsis tshwm nyob rau hauv Kafka cov ntaub ntawv. Cov lus paub zoo no tau siv ntawm no los pab kev nkag siab.

Cov qauv no txawv kiag li ntawm ActiveMQ, qhov twg cov lus los ntawm tag nrho cov queues khaws cia rau hauv tib lub cav, thiab tus broker khij cov lus raws li deleted tom qab lawv tau nyeem.
Tam sim no cia peb khawb me ntsis tob dua thiab saib lub ntsiab lus nkag mus kom ntxaws ntxiv.
Lub Kafka cav muaj ntau qhov sib faib (Daim duab 3-1). Kafka lav nruj kev txiav txim hauv txhua qhov kev faib tawm. Qhov no txhais tau hais tias cov lus sau rau qhov muab faib rau hauv ib qho kev txiav txim yuav raug nyeem tib yam. Txhua qhov kev faib tawm yog siv los ua cov ntaub ntawv rub tawm uas muaj ib subset (subset) ntawm tag nrho cov lus xa mus rau lub ncauj lus los ntawm nws cov neeg tsim khoom. Lub ntsiab lus tsim muaj, los ntawm lub neej ntawd, ib qho kev faib tawm. Lub tswv yim ntawm partitions yog lub hauv paus tswv yim ntawm Kafka rau kab rov tav scaling.

Nkag siab cov lus brokers. Kawm cov tshuab ntawm kev xa xov nrog ActiveMQ thiab Kafka. Tshooj 3. Kafka
Daim duab 3-1. Kafka Partitions

Thaum tus neeg tsim khoom xa xov mus rau lub ntsiab lus Kafka, nws txiav txim siab seb qhov twg yuav xa cov lus rau. Peb yuav saib qhov no hauv kev nthuav dav ntxiv tom qab.

Nyeem cov lus

Tus neeg siv uas xav nyeem cov lus tswj hwm lub npe pointer hu ua pab pawg neeg siv khoom, uas taw tes rau offset cov lus hauv qhov muab faib. Ib qho offset yog ib txoj haujlwm nce ntxiv uas pib ntawm 0 thaum pib ntawm kev faib. Pab pawg neeg siv khoom no, hais txog hauv API ntawm tus neeg siv-txhais group_id, sib raug rau ib tug logical neeg siv los yog system.

Feem ntau cov tshuab xa xov nyeem cov ntaub ntawv los ntawm qhov chaw uas siv ntau qhov xwm txheej thiab xov los ua cov lus sib luag. Yog li, feem ntau yuav muaj ntau tus neeg siv khoom sib koom tib pab pawg neeg siv khoom.

Qhov teeb meem ntawm kev nyeem ntawv tuaj yeem sawv cev raws li hauv qab no:

  • Lub ntsiab lus muaj ntau qhov sib faib
  • Ntau pawg ntawm cov neeg siv khoom tuaj yeem siv lub ntsiab lus tib lub sijhawm
  • Ib pawg ntawm cov neeg siv khoom tuaj yeem muaj ntau qhov sib txawv

Qhov no yog ib qho teeb meem tsis tseem ceeb ntau-rau-ntau yam teeb meem. Yuav kom nkag siab tias Kafka tswj kev sib raug zoo ntawm pawg neeg siv khoom, cov neeg siv khoom siv, thiab kev faib tawm li cas, cia peb saib cov xwm txheej ntawm kev nyeem ntawv nyuaj dua.

Cov neeg siv khoom thiab pab pawg neeg siv khoom

Cia peb ua qhov pib lub ntsiab lus nrog ib qho kev faib (Daim duab 3-2).

Nkag siab cov lus brokers. Kawm cov tshuab ntawm kev xa xov nrog ActiveMQ thiab Kafka. Tshooj 3. Kafka
Daim duab 3-2. Cov neeg siv khoom nyeem los ntawm kev faib tawm

Thaum tus neeg siv khoom siv txuas nrog nws tus kheej group_id rau cov ncauj lus no, nws tau muab faib ua cov ntawv nyeem thiab qhov offset hauv qhov kev faib ntawd. Txoj hauj lwm ntawm qhov offset no tau teeb tsa hauv tus neeg siv khoom raws li tus taw qhia rau txoj haujlwm tsis ntev los no (cov lus tshiab tshaj plaws) lossis txoj haujlwm ntxov tshaj plaws (cov lus qub tshaj plaws). Cov neeg siv khoom thov (tso tawm) cov lus los ntawm cov ncauj lus, uas ua rau lawv tau nyeem los ntawm lub cav.
Txoj haujlwm offset tsis tu ncua rov qab mus rau Kafka thiab khaws cia raws li cov lus hauv cov ncauj lus sab hauv _consumer_offsets. Nyeem cov lus tseem tsis tau muab tshem tawm, tsis zoo li tus broker ib txwm muaj, thiab tus neeg siv khoom tuaj yeem rov thim rov qab rau kev rov ua dua cov lus uas twb pom lawm.

Thaum tus neeg siv khoom siv logical thib ob txuas nrog siv qhov sib txawv group_id, nws tswj tus taw tes thib ob uas tsis muaj kev ywj pheej ntawm thawj (Daim duab 3-3). Yog li, lub ntsiab lus Kafka ua zoo li ib kab uas muaj ib tus neeg siv khoom thiab zoo li ib txwm tshaj tawm-sau npe (pub-sub) cov ncauj lus uas ntau tus neeg siv khoom sau npe, nrog cov txiaj ntsig ntxiv uas txhua cov lus khaws cia thiab tuaj yeem ua tiav ntau zaus.

Nkag siab cov lus brokers. Kawm cov tshuab ntawm kev xa xov nrog ActiveMQ thiab Kafka. Tshooj 3. Kafka
Daim duab 3-3. Ob tus neeg tau txais kev pab hauv cov neeg siv khoom sib txawv tau nyeem los ntawm tib qhov kev faib tawm

Cov neeg siv khoom hauv ib pawg neeg siv khoom

Thaum ib tus neeg siv khoom siv nyeem cov ntaub ntawv los ntawm kev faib tawm, nws muaj kev tswj hwm tag nrho ntawm tus taw tes thiab ua cov lus raws li tau piav qhia hauv ntu dhau los.
Yog tias ntau zaus ntawm cov neeg siv khoom tau txuas nrog tib pawg_id mus rau ib lub ntsiab lus nrog ib qho kev faib tawm, ces qhov piv txwv uas txuas nrog kawg yuav raug tswj hwm tus taw tes thiab txij li lub sijhawm ntawd nws yuav tau txais tag nrho cov lus (Daim duab 3-4).

Nkag siab cov lus brokers. Kawm cov tshuab ntawm kev xa xov nrog ActiveMQ thiab Kafka. Tshooj 3. Kafka
Daim duab 3-4. Ob tus neeg siv khoom hauv tib pab pawg neeg siv tau nyeem los ntawm tib qho kev faib tawm

Hom kev ua no, nyob rau hauv uas tus naj npawb ntawm cov neeg siv khoom ntau tshaj li tus naj npawb ntawm partitions, tuaj yeem xav tias yog ib hom ntawm cov neeg siv khoom tshwj xeeb. Qhov no tuaj yeem pab tau yog tias koj xav tau "active-passive" (lossis "kub-sov") pawg ntawm koj cov neeg siv khoom, txawm hais tias khiav ntau tus neeg siv khoom sib txuas ("active-active" lossis "kub-kub") yog ntau dua li cov neeg siv khoom. cov neeg siv khoom. Nyob rau hauv standby.

Qhov kev faib tawm cov lus no tau piav qhia saum toj no tuaj yeem xav tsis thoob piv rau qhov JMS ib txwm ua haujlwm li cas. Hauv cov qauv no, cov lus xa mus rau cov kab yuav raug muab faib sib npaug ntawm ob tus neeg siv khoom.

Feem ntau, thaum peb tsim ntau zaus ntawm cov neeg siv khoom, peb ua qhov no los ua cov lus sib dhos, lossis ua kom nrawm ntawm kev nyeem ntawv, lossis ua kom muaj kev ruaj ntseg ntawm kev nyeem ntawv. Txij li tsuas yog ib qho piv txwv ntawm cov neeg siv khoom tuaj yeem nyeem cov ntaub ntawv los ntawm kev faib tawm ib zaug, qhov no ua tiav hauv Kafka li cas?

Ib txoj hauv kev ua qhov no yog siv ib qho piv txwv ntawm cov neeg siv khoom los nyeem tag nrho cov lus thiab xa mus rau lub xov tooj. Thaum txoj hauv kev no nce kev ua tiav, nws nce qhov nyuaj ntawm cov neeg siv khoom xav tau thiab tsis muaj dab tsi los ua kom muaj zog ntawm kev nyeem ntawv. Yog tias ib daim qauv ntawm cov neeg siv khoom poob qis vim yog lub zog tsis ua haujlwm lossis qhov xwm txheej zoo sib xws, ces qhov kev rho tawm nres.

Txoj kev canonical los daws qhov teeb meem no hauv Kafka yog siv bОntau partitions.

Kev faib tawm

Partitions yog lub ntsiab mechanism rau parallelizing nyeem ntawv thiab scaling ib lub ncauj lus tshaj lub bandwidth ntawm ib tug broker piv txwv. Yuav kom nkag siab zoo dua qhov no, cia peb xav txog qhov xwm txheej uas muaj lub ntsiab lus nrog ob qhov kev faib tawm thiab ib tus neeg siv khoom siv rau lub ncauj lus no (Daim duab 3-5).

Nkag siab cov lus brokers. Kawm cov tshuab ntawm kev xa xov nrog ActiveMQ thiab Kafka. Tshooj 3. Kafka
Daim duab 3-5. Ib tus neeg siv khoom nyeem los ntawm ntau qhov sib faib

Hauv qhov xwm txheej no, tus neeg siv khoom tau txais kev tswj hwm ntawm tus taw tes sib raug rau nws pawg_id hauv ob qho tib si thiab pib nyeem cov lus los ntawm ob qho kev faib tawm.
Thaum ib tus neeg siv khoom ntxiv rau tib pawg_id tau ntxiv rau cov ncauj lus no, Kafka muab ib qho ntawm cov faib los ntawm thawj tus neeg siv khoom thib ob. Tom qab ntawd, txhua qhov piv txwv ntawm cov neeg siv khoom yuav nyeem los ntawm ib qho kev faib ntawm cov ncauj lus (Daim duab 3-6).

Txhawm rau kom ntseeg tau tias cov lus tau ua tiav nyob rau hauv qhov sib npaug hauv 20 xov, koj xav tau yam tsawg kawg 20 partitions. Yog tias muaj kev faib tsawg dua, koj yuav raug tso tseg nrog cov neeg siv khoom uas tsis muaj dab tsi ua haujlwm, raws li tau piav qhia ua ntej hauv kev sib tham ntawm cov neeg siv khoom tshwj xeeb.

Nkag siab cov lus brokers. Kawm cov tshuab ntawm kev xa xov nrog ActiveMQ thiab Kafka. Tshooj 3. Kafka
Daim duab 3-6. Ob tus neeg siv khoom hauv tib pab pawg neeg siv tau nyeem los ntawm ntau qhov sib faib

Cov tswv yim no zoo heev txo qhov nyuaj ntawm Kafka tus broker piv rau cov lus xa tawm yuav tsum tau tswj hwm JMS kab. Ntawm no koj tsis tas yuav txhawj txog cov ntsiab lus hauv qab no:

  • Cov neeg siv khoom twg yuav tsum tau txais cov lus tom ntej, raws li kev faib tawm ib puag ncig, lub peev xwm tam sim no ntawm kev khaws cov buffers, lossis cov lus dhau los (xws li JMS pawg lus).
  • Cov lus twg yog xa mus rau cov neeg siv khoom thiab seb lawv puas yuav tsum tau xa rov qab thaum tsis ua haujlwm.

Txhua tus Kafka broker yuav tsum ua yog xa cov lus sib txuas mus rau cov neeg siv khoom thaum kawg thov lawv.

Txawm li cas los xij, cov kev cai rau kev sib piv cov ntawv pov thawj thiab rov xa cov lus tsis ua tiav tsis ploj mus - lub luag haujlwm rau lawv tsuas yog dhau los ntawm tus broker mus rau tus neeg siv khoom. Qhov no txhais tau tias lawv yuav tsum raug coj mus rau hauv tus account hauv koj cov cai.

Xa lus

Nws yog lub luag haujlwm ntawm tus tsim khoom ntawm cov lus ntawd los txiav txim siab seb qhov twg yuav xa cov lus rau. Txhawm rau kom nkag siab txog cov txheej txheem uas qhov no ua tiav, peb yuav tsum xub xav txog qhov peb xa mus tiag tiag.

Whereas hauv JMS peb siv cov qauv lus nrog metadata (headers thiab cov khoom) thiab lub cev uas muaj cov payload (payload), hauv Kafka cov lus yog khub "key-value". Cov lus payload yog xa raws li tus nqi. Qhov tseem ceeb, ntawm qhov tod tes, feem ntau yog siv rau kev faib thiab yuav tsum muaj kev lag luam logic tshwj xeeb tseem ceebmuab cov lus hais nyob rau hauv tib qhov muab faib.

Hauv Tshooj 2, peb tau tham txog qhov xwm txheej twv txiaj hauv online uas muaj feem xyuam nrog cov xwm txheej yuav tsum tau ua kom tiav los ntawm ib tus neeg siv khoom:

  1. Tus neeg siv tus account yog configured.
  2. Cov nyiaj tau muab tso rau hauv tus account.
  3. Ib tug thawj koom ruam yog ua kom rho nyiaj los ntawm tus account.

Yog tias txhua qhov xwm txheej yog cov lus tshaj tawm rau lub ncauj lus, ces tus yuam sij ntuj yuav yog tus lej ID.
Thaum cov lus xa mus siv Kafka Producer API, nws tau dhau mus rau qhov muab faib ua haujlwm uas, muab cov lus thiab lub xeev tam sim no ntawm Kafka pawg, rov qab ID ntawm kev faib tawm uas cov lus yuav tsum xa. Qhov no feature yog siv nyob rau hauv Java los ntawm Partitioner interface.

Qhov no interface zoo li no:

interface Partitioner {
    int partition(String topic,
        Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
}

Kev siv Partitioner siv lub hom phiaj dav dav ntawm lub hom phiaj hashing algorithm hla tus yuam sij los txiav txim siab qhov muab faib, lossis round-robin yog tias tsis muaj tus yuam sij tau teev tseg. Tus nqi qub no ua haujlwm zoo nyob rau hauv feem ntau. Txawm li cas los xij, yav tom ntej koj yuav xav sau koj tus kheej.

Sau koj tus kheej kev faib tawm tswv yim

Cia peb saib ib qho piv txwv uas koj xav xa metadata nrog rau cov lus them nyiaj. Kev them nyiaj hauv peb qhov piv txwv yog kev qhia kom tso nyiaj rau hauv tus account game. Ib qho kev qhia yog ib yam uas peb xav kom lav tsis tau hloov kho ntawm kev sib kis thiab xav kom paub tseeb tias tsuas yog ib qho kev ntseeg siab tuaj yeem pib qhov kev qhia ntawd. Hauv qhov no, lub tshuab xa thiab txais tau pom zoo rau kev siv kos npe los lees paub cov lus.
Nyob rau hauv ib txwm JMS, peb tsuas txhais tau tias "xov xwm kos npe" khoom thiab ntxiv rau cov lus. Txawm li cas los xij, Kafka tsis muab peb cov txheej txheem rau kev hla metadata, tsuas yog tus yuam sij thiab tus nqi.

Txij li thaum tus nqi yog lub txhab nyiaj hloov pauv payload uas nws txoj kev ncaj ncees peb xav khaws cia, peb tsis muaj kev xaiv tab sis los txhais cov ntaub ntawv qauv siv rau hauv tus yuam sij. Piv txwv tias peb xav tau tus lej ID rau kev faib tawm, txij li txhua cov lus hais txog tus lej yuav tsum tau ua tiav raws li kev txiav txim, peb yuav los nrog JSON qauv hauv qab no:

{
  "signature": "541661622185851c248b41bf0cea7ad0",
  "accountId": "10007865234"
}

Vim hais tias tus nqi ntawm kos npe yuav txawv nyob ntawm seb lub payload, lub neej ntawd hashing lub tswv yim ntawm Partitioner interface yuav tsis cia siab rau pab pawg neeg cov lus. Yog li ntawd, peb yuav tsum tau sau peb tus kheej lub tswv yim uas yuav txheeb xyuas qhov tseem ceeb no thiab muab faib tus nqi accountId.

Kafka suav nrog checksums txhawm rau txheeb xyuas kev noj nyiaj txiag ntawm cov lus hauv khw thiab muaj tag nrho cov txheej txheem kev nyab xeeb. Txawm li ntawd los, cov kev cai tshwj xeeb hauv kev lag luam, xws li ib qho saum toj no, qee zaum tshwm sim.

Tus neeg siv lub tswv yim muab faib yuav tsum xyuas kom meej tias tag nrho cov lus cuam tshuam xaus rau hauv tib qhov kev faib tawm. Txawm hais tias qhov no zoo li yooj yim, qhov yuav tsum tau muaj tuaj yeem nyuaj los ntawm qhov tseem ceeb ntawm kev xaj cov lus cuam tshuam thiab yuav ua li cas kho tus naj npawb ntawm cov partitions hauv ib lub ntsiab lus.

Tus naj npawb ntawm cov partitions hauv ib lub ntsiab lus tuaj yeem hloov pauv raws sijhawm, raws li lawv tuaj yeem ntxiv yog tias kev khiav mus dhau qhov kev cia siab pib. Yog li, cov lus yuam sij tuaj yeem cuam tshuam nrog qhov muab faib uas lawv tau xa mus rau thawj zaug, txhais tau hais tias ib feem ntawm lub xeev yuav tsum tau sib koom ntawm cov neeg tsim khoom.

Lwm qhov tseem ceeb uas yuav tau xav txog yog qhov kev faib tawm ntawm cov lus hla kev faib tawm. Feem ntau, cov yuam sij tsis raug faib sib npaug ntawm cov lus, thiab cov haujlwm hash tsis lav qhov kev faib ncaj ncees ntawm cov lus rau ib pawg me me ntawm cov yuam sij.
Nws yog ib qho tseem ceeb kom nco ntsoov tias txawm li cas los xij koj xaiv cais cov lus, tus cais nws tus kheej yuav tsum tau rov qab siv dua.

Xav txog qhov yuav tsum tau rov ua dua cov ntaub ntawv ntawm Kafka pawg hauv thaj chaw sib txawv. Rau lub hom phiaj no, Kafka los nrog cov kab hais kom ua hu ua MirrorMaker, uas yog siv los nyeem cov lus los ntawm ib pawg thiab hloov mus rau lwm qhov.

MirrorMaker yuav tsum nkag siab txog cov yuam sij ntawm lub ntsiab lus rov qab txhawm rau txhawm rau tswj hwm kev sib raug zoo ntawm cov lus thaum rov ua dua ntawm pawg, txij li tus naj npawb ntawm kev faib rau cov ncauj lus ntawd yuav tsis zoo ib yam hauv ob pawg.

Kev cai muab faib cov tswv yim kuj tsis tshua muaj, raws li lub neej ntawd hashing los yog round robin ua haujlwm zoo nyob rau hauv feem ntau scenarios. Txawm li cas los xij, yog tias koj xav tau kev lees paub muaj zog lossis xav tau tshem tawm cov metadata los ntawm kev them nyiaj, ces kev faib tawm yog ib yam uas koj yuav tsum tau ua tib zoo saib.

Qhov kev ua tau zoo thiab kev ua tau zoo ntawm Kafka los ntawm kev hloov qee lub luag haujlwm ntawm tus neeg ua haujlwm ib txwm muaj rau tus neeg siv khoom. Hauv qhov no, kev txiav txim siab raug txiav txim siab los faib cov lus muaj feem cuam tshuam nrog ntau tus neeg siv khoom ua haujlwm sib luag.

JMS brokers kuj yuav tsum tau ua raws li cov cai no. Interestingly, lub mechanism rau xa cov lus muaj feem xyuam rau tib neeg siv, siv los ntawm JMS Message Groups (ib tug variation ntawm lub nplaum load balancing (SLB) lub tswv yim), kuj yuav tsum tau tus sender cim cov lus raws li muaj feem xyuam. Nyob rau hauv cov ntaub ntawv ntawm JMS, tus broker yog lub luag hauj lwm rau xa cov pab pawg neeg ntawm cov lus muaj feem xyuam rau ib tug neeg tau txais kev pab los ntawm ntau, thiab hloov cov tswv cuab ntawm pab pawg neeg yog hais tias tus neeg siv poob.

Cov Ntawv Pom Zoo Tus tsim tawm

Kev faib tawm tsis yog tib yam uas yuav tsum xav txog thaum xa cov lus. Cia wb mus saib qhov xa() txoj hauv kev ntawm Chav Tsim Khoom hauv Java API:

Future < RecordMetadata > send(ProducerRecord < K, V > record);
Future < RecordMetadata > send(ProducerRecord < K, V > record, Callback callback);

Nws yuav tsum raug sau tseg tam sim ntawd tias ob txoj hauv kev rov qab los Yav Tom Ntej, uas qhia tau tias kev xa tawm tsis ua tiav tam sim ntawd. Qhov tshwm sim yog tias cov lus (ProducerRecord) tau sau rau qhov xa tsis tau rau txhua qhov kev faib ua haujlwm thiab xa mus rau tus broker ua cov xov keeb kwm yav dhau los hauv Kafka cov tsev qiv ntawv neeg siv khoom. Thaum qhov no ua rau cov khoom nrawm heev, nws txhais tau hais tias daim ntawv thov tsis muaj kev paub tuaj yeem poob cov lus yog tias nws cov txheej txheem raug tso tseg.

Raws li ib txwm muaj, muaj ib txoj hauv kev los ua kom cov haujlwm xa tuaj yeem txhim khu kev qha ntawm cov nqi ntawm kev ua haujlwm. Qhov loj ntawm qhov tsis tuaj yeem raug teeb tsa rau 0, thiab xa daim ntawv thov xov yuav raug yuam kom tos kom txog thaum cov lus hloov mus rau tus broker tiav, raws li hauv qab no:

RecordMetadata metadata = producer.send(record).get();

Xav paub ntau ntxiv txog kev nyeem cov lus

Nyeem cov lus muaj qhov nyuaj ntxiv uas yuav tsum tau xav txog. Tsis zoo li JMS API, uas tuaj yeem khiav cov lus mloog hauv cov lus teb rau cov lus, qhov Consumer Kafka tsuas yog xaiv tsa. Cia peb ua tib zoo saib ntawm txoj kev xaiv tsa()siv rau lub hom phiaj no:

ConsumerRecords < K, V > poll(long timeout);

Tus nqi rov qab ntawm txoj kev yog lub thawv ntim khoom uas muaj ntau yam khoom cov ntaub ntawv neeg siv khoom los ntawm tej zaum yuav muaj ntau partitions. cov ntaub ntawv neeg siv khoom nws tus kheej yog ib tug tuav khoom rau ib tug tseem ceeb-tus nqi khub nrog txuam metadata, xws li cov muab faib los ntawm uas nws yog muab los.

Raws li tau tham hauv Tshooj 2, peb yuav tsum nco ntsoov tias muaj dab tsi tshwm sim rau cov lus tom qab lawv tau ua tiav lossis tsis ua tiav, piv txwv li, yog tias tus neeg siv khoom tsis tuaj yeem ua cov lus lossis yog tias nws rho tawm. Hauv JMS, qhov no tau daws los ntawm hom kev lees paub. Tus broker yuav tshem tawm cov lus ua tiav, lossis rov xa cov lus nyoos lossis cov lus cuav (xws li kev lag luam tau siv).
Kafka ua haujlwm txawv heev. Cov lus tsis raug muab tshem tawm hauv tus broker tom qab kev nyeem ntawv pov thawj, thiab dab tsi tshwm sim ntawm qhov tsis ua haujlwm yog lub luag haujlwm ntawm cov ntawv pov thawj nws tus kheej.

Raws li peb tau hais, pawg neeg siv khoom yog txuam nrog kev sib txawv hauv lub cav. Lub cav txoj hauj lwm cuam tshuam nrog qhov offset sib raug rau cov lus tom ntej uas yuav tsum tau muab los teb rau xaiv tsa(). Lub ntsiab lus nyob rau hauv lub sij hawm thaum no offset nce yog txiav txim siab rau kev nyeem ntawv.

Rov qab mus rau tus qauv nyeem tau tham ua ntej, kev ua cov lus muaj peb theem:

  1. Rov qab tau cov lus rau kev nyeem ntawv.
  2. Txheej txheem cov lus.
  3. Paub cov lus.

Cov neeg siv khoom Kafka tuaj nrog kev xaiv kev teeb tsa enable.auto.commit. Qhov no yog ib qho kev siv ntau zaus, raws li feem ntau nrog cov chaw uas muaj lo lus "auto".

Ua ntej Kafka 0.10, tus neeg siv khoom siv qhov kev xaiv no yuav xa cov offset ntawm cov lus kawg uas tau nyeem ntawm kev hu tom ntej xaiv tsa() tom qab ua tiav. Qhov no txhais tau hais tias txhua cov lus uas twb tau txais lawm tuaj yeem rov ua dua yog tias tus neeg siv khoom tau ua tiav lawv tab sis tau npaj txhij txog kev puas tsuaj ua ntej hu. xaiv tsa(). Vim tias tus broker tsis khaws ib lub xeev txog pes tsawg zaus cov lus tau nyeem, cov neeg siv khoom tom ntej uas khaws cov lus ntawd yuav tsis paub dab tsi phem tshwm sim. Qhov kev coj cwj pwm no yog pseudo-transactional. Qhov offset tsuas yog cog lus yog tias cov lus tau ua tiav, tab sis yog tias tus neeg siv khoom rho tawm, tus broker yuav xa cov lus qub rau lwm tus neeg siv khoom. Tus cwj pwm no tau ua raws li cov lus xa tuaj lav "tsawg kawg ib zaug".

Hauv Kafka 0.10, tus neeg siv code tau hloov pauv kom qhov kev cog lus tau tshwm sim raws sijhawm los ntawm cov neeg siv khoom tsev qiv ntawv, raws li tau teeb tsa auto.commit.interval.ms. Qhov kev coj cwj pwm no nyob ntawm qhov chaw ntawm JMS AUTO_ACKNOWLEDGE thiab DUPS_OK_ACKNOWLEDGE hom. Thaum siv autocommit, cov lus tuaj yeem cog lus tsis hais seb lawv puas tau ua tiav - qhov no tuaj yeem tshwm sim hauv cov neeg siv khoom qeeb. Yog tias tus neeg siv khoom rho tawm, cov lus yuav raug coj los ntawm cov neeg siv khoom tom ntej, pib ntawm txoj haujlwm tau cog lus, uas tuaj yeem ua rau cov lus tsis raug. Nyob rau hauv cov ntaub ntawv no, Kafka tsis poob cov lus, cov kev nyeem ntawv cia li tsis ua lawv.

Hom no muaj cov lus cog tseg zoo ib yam li hauv version 0.9: cov lus tuaj yeem ua tiav, tab sis yog tias nws ua tsis tiav, qhov offset yuav tsis raug cog lus, uas yuav ua rau kev xa khoom tuaj yeem ua ob npaug. Ntau cov lus koj nqa thaum ua tiav xaiv tsa(), ntau qhov teeb meem no.

Raws li tau tham nyob rau hauv "Nyeem Cov Lus los ntawm Queue" ntawm nplooj ntawv 21, tsis muaj ib qho kev xa ib zaug ntawm cov lus hauv kev xa xov thaum cov qauv tsis ua haujlwm raug coj mus rau hauv tus account.

Hauv Kafka, muaj ob txoj hauv kev rau kev cog lus (kev cog lus) kev tawm tsam (offset): txiav thiab manually. Hauv ob qho tib si, cov lus tuaj yeem ua tiav ntau zaus yog tias cov lus tau ua tiav tab sis ua tsis tiav ua ntej kev cog lus. Koj tuaj yeem xaiv tsis ua cov lus txhua yog tias qhov kev cog lus tshwm sim hauv keeb kwm yav dhau thiab koj cov cai tau ua tiav ua ntej nws tuaj yeem ua tiav (tej zaum hauv Kafka 0.9 thiab ntxov dua).

Koj tuaj yeem tswj hwm cov txheej txheem kev ua txhaum cai hauv Kafka tus neeg siv khoom API los ntawm kev teeb tsa qhov ntsuas enable.auto.commit kom cuav thiab qhia meej meej hu rau ib qho ntawm cov hauv qab no:

void commitSync();
void commitAsync();

Yog tias koj xav ua cov lus "tsawg kawg ib zaug", koj yuav tsum ua qhov offset manually nrog commitSync()los ntawm kev ua tiav cov lus txib tam sim ntawd tom qab ua cov lus.

Cov txheej txheem no tsis tso cai rau cov lus lees paub ua ntej lawv tau ua tiav, tab sis lawv tsis ua dab tsi los tshem tawm cov kev ua haujlwm qeeb thaum muab cov tsos ntawm kev hloov pauv. Tsis muaj kev hloov pauv hauv Kafka. Tus neeg siv khoom tsis muaj peev xwm ua tau raws li hauv qab no:

  • Automatically yob rov qab cov lus cuav. Cov neeg siv khoom lawv tus kheej yuav tsum daws cov kev zam uas tshwm sim los ntawm cov teeb meem them nyiaj thiab cov khoom siv rov qab, vim lawv tsis tuaj yeem cia siab rau tus broker kom rov xa cov lus.
  • Xa cov lus rau ntau lub ntsiab lus hauv ib qho kev ua haujlwm atomic. Raws li peb yuav pom luv luv, kev tswj hwm cov ncauj lus sib txawv thiab kev faib tawm tuaj yeem nyob ntawm cov tshuab sib txawv hauv Kafka pawg uas tsis sib koom ua lag luam thaum xa. Thaum lub sijhawm sau ntawv no, qee qhov haujlwm tau ua tiav los ua qhov no nrog KIP-98.
  • Ua ke nyeem ib cov lus los ntawm ib lub ncauj lus nrog xa lwm cov lus mus rau lwm lub ncauj lus. Ib zaug ntxiv, Kafka architecture nyob ntawm ntau lub tshuab ywj pheej khiav raws li ib lub tsheb npav thiab tsis muaj kev sim los nkaum qhov no. Piv txwv li, tsis muaj API Cheebtsam uas yuav tso cai rau koj mus txuas neeg siv khoom ΠΈ Tus tsim hauv kev lag luam. Hauv JMS, qhov no yog muab los ntawm cov khoom kev sib kholos ntawm uas yog tsim MessageProducers ΠΈ MessageConsumers.

Yog tias peb tsis tuaj yeem tso siab rau kev hloov pauv, peb yuav ua li cas muab cov ntsiab lus ze dua rau cov uas muab los ntawm kev xa xov ib txwm?

Yog tias muaj qhov ua tau tias tus neeg siv khoom offset tuaj yeem nce ntxiv ua ntej cov lus tau ua tiav, xws li thaum lub sijhawm cov neeg siv khoom sib tsoo, ces tus neeg siv khoom tsis muaj txoj hauv kev paub yog tias nws pab pawg neeg siv tsis tau cov lus thaum nws muab faib. Yog li ib lub tswv yim yog rov qab qhov kev sib tw rau txoj haujlwm dhau los. Kafka tus neeg siv khoom API muab cov hauv qab no rau qhov no:

void seek(TopicPartition partition, long offset);
void seekToBeginning(Collection < TopicPartition > partitions);

Txujci nrhiav ( ) tuaj yeem siv nrog txoj kev
offsetsForTimes(Daim ntawv qhia timestampsToSearch) rov qab mus rau ib lub xeev ntawm qee qhov tshwj xeeb yav dhau los.

Implicitly, siv txoj hauv kev no txhais tau hais tias nws muaj feem ntau tias qee cov lus uas tau ua dhau los yuav raug nyeem thiab ua tiav dua. Txhawm rau zam qhov no, peb tuaj yeem siv kev nyeem ntawv tsis txaus ntseeg, raws li tau piav qhia hauv Tshooj 4, txhawm rau taug qab cov lus uas tau pom yav dhau los thiab tshem tawm cov khoom sib xws.

Xwb, koj tus neeg siv khoom code tuaj yeem khaws cia yooj yim, tsuav yog cov lus poob lossis luam tawm tau txais. Thaum peb xav txog kev siv cov xwm txheej uas feem ntau siv Kafka, xws li tuav cov xwm txheej, ntsuas, nias taug qab, thiab lwm yam, peb nkag siab tias kev poob ntawm cov lus tsis zoo li yuav muaj kev cuam tshuam loj rau cov ntawv thov nyob ib puag ncig. Nyob rau hauv xws li mob, lub neej ntawd tus nqi yog zoo kawg nkaus txais. Ntawm qhov tod tes, yog tias koj daim ntawv thov yuav tsum xa cov nyiaj them poob haujlwm, koj yuav tsum ua tib zoo saib xyuas txhua tus neeg cov lus. Nws tag nrho los ntawm cov ntsiab lus.

Cov kev soj ntsuam ntawm tus kheej qhia tau hais tias raws li qhov kev siv ntawm cov lus nce, tus nqi ntawm txhua tus neeg cov lus txo qis. Cov lus loj yuav muaj txiaj ntsig zoo thaum saib hauv daim ntawv sib sau.

Muaj Muaj

Kafka txoj hauv kev mus rau qhov muaj ntau yam txawv ntawm ActiveMQ txoj hauv kev. Kafka yog tsim nyob ib ncig ntawm cov pawg tawm uas txhua tus neeg ua haujlwm tau txais thiab faib cov lus tib lub sijhawm.

Ib pawg Kafka muaj ntau qhov sib txawv broker ua haujlwm ntawm cov servers sib txawv. Kafka tau tsim los khiav ntawm cov khoom siv ib leeg ib leeg, qhov twg txhua qhov ntawm nws muaj nws tus kheej cia siab. Kev siv lub network txuas nrog cia (SAN) tsis pom zoo vim tias ntau lub khoos phis tawj tuaj yeem sib tw rau lub sijhawm.Π«e cia ncua sij hawm thiab tsim kev tsis sib haum xeeb.

Kafka yog ib txwm nyob qhov system. Ntau tus neeg siv Kafka loj tsis tau kaw lawv pawg thiab cov software ib txwm hloov kho nrog kev rov pib dua. Qhov no tau ua tiav los ntawm kev lav kev sib raug zoo nrog cov ntawv dhau los rau cov lus thiab kev sib cuam tshuam ntawm cov neeg ua haujlwm.

Brokers txuas nrog lub server pawg ZooKeeper, uas ua raws li kev teeb tsa cov ntaub ntawv sau npe thiab siv los tswj cov luag haujlwm ntawm txhua tus broker. ZooKeeper nws tus kheej yog ib qho kev faib tawm uas muab kev muaj peev xwm los ntawm kev rov ua dua ntawm cov ntaub ntawv los ntawm kev tsim pawg.

Hauv cov ntaub ntawv hauv paus, lub ntsiab lus raug tsim nyob rau hauv Kafka pawg nrog cov khoom hauv qab no:

  • Tus naj npawb ntawm partitions. Raws li tau tham ua ntej lawm, tus nqi tiag tiag siv ntawm no nyob ntawm qhov xav tau ntawm kev nyeem ntawv sib txuas.
  • Qhov xwm txheej rov ua dua tshiab (factor) txiav txim siab pes tsawg tus broker piv txwv hauv pawg yuav tsum muaj cov cav rau qhov kev faib tawm no.

Siv ZooKeepers rau kev sib koom tes, Kafka sim ua ncaj ncees faib cov kev faib tshiab ntawm cov neeg ua haujlwm hauv pawg. Qhov no yog ua los ntawm ib qho piv txwv uas ua raws li Tus Tswj.

Thaum khiav rau txhua lub ntsiab lus muab faib Xws li muab lub luag haujlwm rau tus broker tus thawj coj (tus thawj coj, tus tswv, tus tshaj tawm) thiab cov thwjtim (cov ua raws, qhev, subordinates). Tus broker, ua tus thawj coj rau qhov kev faib tawm no, yog lub luag haujlwm tau txais tag nrho cov lus xa mus rau nws los ntawm cov neeg tsim khoom thiab faib cov lus rau cov neeg siv khoom. Thaum cov lus raug xa mus rau lub ntsiab lus muab faib, lawv tau rov ua dua rau txhua tus broker nodes ua raws li cov neeg muab faib. Txhua lub node uas muaj cov cav rau ib qho kev faib yog hu ua luam tawm. Tus broker tuaj yeem ua tus thawj coj rau qee qhov kev faib thiab ua raws li lwm tus.

Tus neeg taug qab uas muaj tag nrho cov lus tuav los ntawm tus thawj coj raug hu synchronized replica (ib tug replica uas yog nyob rau hauv ib lub xeev synchronized, in-sync replica). Yog tias tus broker ua tus thawj coj rau qhov kev faib tawm mus, txhua tus broker uas tau hloov tshiab lossis synchronized rau qhov kev faib ntawd tuaj yeem ua tus thawj coj. Nws yog ib tug incredibly sustainable tsim.

Ib feem ntawm tus tsim khoom configuration yog tus parameter acks ua, uas txiav txim siab pes tsawg replicas yuav tsum lees paub ( lees paub) tau txais cov lus ua ntej daim ntawv thov xov txuas ntxiv xa: 0, 1, lossis tag nrho. Yog teem rau tag nrho cov, tom qab ntawd thaum tau txais cov lus, tus thawj coj yuav xa ib daim ntawv lees paub rov qab rau tus tsim khoom sai li sai tau thaum nws tau txais kev lees paub (kev lees paub) ntawm cov ntaub ntawv los ntawm ntau qhov cues (suav nrog nws tus kheej) txhais los ntawm lub ntsiab lus teeb tsa. min.insync.replicas (default 1). Yog tias cov lus tsis tuaj yeem ua tiav rov ua tiav, ces tus tsim tawm yuav pov ib daim ntawv thov zam (NotEnoughReplicas los yog NotEnoughReplicasAfterAppend).

Ib tug raug configuration tsim ib lub ntsiab lus nrog ib tug replication yam ntawm 3 (1 tus thawj coj, 2 followers ib partition) thiab parameter min.insync.replicas yog teem rau 2. Nyob rau hauv cov ntaub ntawv no, pawg yuav tso cai rau ib tug ntawm cov brokers tswj lub topic partition mus down yam tsis muaj kev cuam tshuam rau cov neeg thov kev pab.

Qhov no coj peb rov qab mus rau qhov kev lag luam uas twb paub lawm ntawm kev ua tau zoo thiab kev ntseeg tau. Replication tshwm sim ntawm tus nqi ntawm lub sijhawm tos ntxiv rau kev lees paub (kev lees paub) los ntawm cov neeg ua raws. Txawm hais tias, vim tias nws ua haujlwm sib luag, rov ua dua rau tsawg kawg peb lub nodes muaj qhov ua tau zoo ib yam li ob (tsis quav ntsej qhov nce hauv kev siv network bandwidth).

Los ntawm kev siv cov txheej txheem rov ua dua no, Kafka cleverly zam qhov xav tau ntawm lub cev sau txhua cov lus rau disk nrog kev ua haujlwm sync(). Txhua cov lus xa los ntawm cov neeg tsim khoom yuav raug sau rau hauv qhov kev faib tawm, tab sis raws li tau tham hauv Tshooj 2, kev sau ntawv rau cov ntaub ntawv tau pib ua tiav hauv kev ua haujlwm tsis muaj. Yog hais tias cov lus no yog replicated rau lwm Kafka piv txwv thiab nyob rau hauv nws lub cim xeeb, qhov poob ntawm tus thawj coj tsis tau txhais hais tias cov lus nws tus kheej tau ploj lawm - nws muaj peev xwm muab tau los ntawm ib tug synchronized replica.
Kev tsis kam ua haujlwm sync() txhais tau hais tias Kafka tuaj yeem tau txais cov lus sai npaum li nws tuaj yeem sau rau hauv nco. Piv txwv li, ntev npaum li cas koj tuaj yeem zam kev nco nco rau disk, qhov zoo dua. Vim li no, nws tsis yog qhov tsis yooj yim rau Kafka brokers tau faib 64 GB lossis ntau dua ntawm kev nco. Qhov kev siv lub cim xeeb no txhais tau hais tias ib qho piv txwv Kafka tuaj yeem khiav tau yooj yim ntawm kev nrawm ntau txhiab zaus sai dua li cov lus tshaj tawm ib txwm muaj.

Kafka kuj tuaj yeem teeb tsa los siv cov haujlwm sync() mus rau cov ntawv pob. Txij li txhua yam hauv Kafka yog pob-taw qhia, nws ua tau zoo heev rau ntau qhov kev siv thiab yog cov cuab yeej siv tau zoo rau cov neeg siv uas xav tau kev lav zoo heev. Ntau qhov kev ua tau zoo ntawm Kafka los ntawm cov lus uas xa mus rau tus broker raws li pob ntawv thiab cov lus no tau nyeem los ntawm tus broker hauv cov blocks sib txuas siv. zero daim kev ua haujlwm (kev ua haujlwm thaum lub sijhawm ua haujlwm ntawm kev luam cov ntaub ntawv los ntawm ib qho chaw nco mus rau lwm qhov tsis ua). Qhov tom kawg yog qhov ua tau zoo thiab cov peev txheej tau txais txiaj ntsig thiab tsuas yog ua tau los ntawm kev siv cov ntaub ntawv hauv qab cov ntaub ntawv uas txhais cov txheej txheem muab faib.

Kev ua tau zoo dua tuaj yeem ua tau nyob rau hauv Kafka pawg dua li nrog ib tus neeg ua haujlwm Kafka ib leeg, vim tias cov ncauj lus sib faib tuaj yeem ntsuas tawm thoob plaws ntau lub tshuab sib cais.

Cov txiaj ntsim tau los

Hauv tshooj no, peb tau saib yuav ua li cas Kafka architecture rov xav txog kev sib raug zoo ntawm cov neeg siv khoom thiab cov neeg ua haujlwm kom muab cov xa xov xa xov zoo kawg, nrog kev xa tawm ntau zaus ntau dua li cov lus sib tham. Peb tau tham txog kev ua haujlwm uas nws siv los ua kom tiav qhov no thiab luv luv saib cov qauv ntawm cov ntawv thov uas muab cov haujlwm no. Nyob rau hauv tshooj tom ntej, peb yuav saib cov teeb meem kev xa ntawv-raws li cov ntawv thov yuav tsum tau daws thiab sib tham txog cov tswv yim los daws lawv. Peb mam li xaus tshooj los ntawm kev piav qhia yuav ua li cas tham txog kev xa xov technologies feem ntau yog li koj tuaj yeem ntsuas lawv qhov tsim nyog rau koj cov ntaub ntawv siv.

Previous translation part: Nkag siab cov lus brokers. Kawm cov tshuab ntawm kev xa xov nrog ActiveMQ thiab Kafka. Tshooj 1

Txhais ua tiav: tele.gg/middle_java

Kom txuas ntxiv…

Tsuas yog cov neeg siv sau npe tuaj yeem koom nrog hauv daim ntawv ntsuam xyuas. Kos npe rau hauvthov.

Puas yog Kafka siv hauv koj lub koom haum?

  • Yog

  • Tsis

  • Yav dhau los siv, tam sim no tsis

  • Peb npaj siv

38 cov neeg siv pov npav. 8 cov neeg siv txwv tsis pub siv.

Tau qhov twg los: www.hab.com

Ntxiv ib saib