Šiandien pradedu straipsnių ciklą apie neįtikėtiną biblioteką ZeroMQ (ØMQ), kuri leidžia ženkliai supaprastinti paskirstytų programų kūrimą. Pradėsiu nuo to, kas nėra ZeroMQ. Nepaisant MQ santrumpos pavadinime, tai nėra eilių (angl. Message Queue) sprendimas kaip RabbitMQ, ActiveMQ ar MSMQ. Taipogi, tai nėra WCF ar Thrift RPC atitikmuo. Aš apibrėžčiau ZeroMQ kaip ypatingai greitą ir labai paprastą panaudojime buferizuotą soketų komunikavimo biblioteką.
Kam teko programuoti soketus (nesvarbu kokia programavimo kalba), tikriausiai pritars, kad tai nėra labai paprastas užsiėmimas reikalaujantis pakankamai gilių tinklo žinių. Reikia galvoti apie prisijungimus, atsijungimus, ryšio palaikymą, buferizavimą, tinklo problemų aptikimą, siuntimo pakartojimą ir dar daug kitų dalykų. ZeroMQ – tai labai patogi abstrakcija virš soketų. Ši biblioteka leidžia pamiršti apie visas su žinučių perdavimu susijusias problemas išlaikant soketų greitaveiką.
ZeroMQ galimybių apžvalga
ZeroMQ leidžia nesukti galvos dėl prisijungimo eiliškumo – klientai ir serveriai gali būti paleidžiami bet kokia eilės tvarka. Jeigu klientas pasileis pirmas ir reikalingo serverio nebus – visos žinutės bus kaupiamos kliento pusėje ir išsiųstos kai tik serveris taps prieinamas.
Dėl bibliotekos paprastumo (leidžiama siųsti ir priimti tik baitų masyvus), nereikia prisirišti prie konkretaus komunikavimo protokolo ir galima naudoti bet kurį duomenų formatą: JSON, BSON, Protocol Buffers (ProtoBuf) ir t.t.
Kadangi ZeroMQ yra žemo lygio abstrakcija virš soketų parašyta su C ir viduje veikia pilnai asinchroniškai, ji pasižymi ypatinga greitaveika. Lokaliame kompiuteryje man pavyko pasiekti 30 tūkstančių žinučių per sekundę perdavimo greitį, įskaitant duomenų serializavimą į ir iš ProtoBuf.
Kita nuostabi bibliotekos savybė – ji palaiko visus pagrindinius komunikavimo šablonus:
Papildomai, ZeroMQ palaiko tokius transporto protokolus kaip in-process, IPC, multicast ir TCP. Norimas protokolas nurodomas tiesiai prisijungimo eilutėje, tad jo keitimas yra trivialus konfigūracijos atnaujinimas.
Ir pabaigai, kas labiausiai mane sužavėjo – ZeroMQ automatiškai palaiko žinučių balansavimą (round-robin principu) bei turi lokalius buferius (eiles). Visos įeinamos ir išeinamos žinutės pirma dedamos į eiles, iš kurių žinutė po žinutės yra išimamos ir apdorojamos.
ZeroMQ apribojimai
Apart visų aukščiau išvardintų privalumų, manau būtina žinoti ir tam tikrus bibliotekos apribojimus. Skirtingai negu pilnaverčiai eilių sprendimai, ZeroMQ neturi centrinio brokerio, kas gali būti tiek privalumas, tiek ir trūkumas:
- Brokerio nebuvimas leidžia pasiekti žymiai geresnių greitaveikos rezultatų negu bet koks kitas eilių sprendimas.
- Brokeris eilių sprendimuose yra labai svarbus ir jam nulūžus – visos eilės sustoja. ZeroMQ tokios problemos neturi, nes centrinio komunikavimo taško nėra.
- Architektūriškai, ZeroMQ negarantuoja žinučių eiliškumo išlaikymo, tad vėliau siųsta žinutė gali būti apdorota pirmiau už anksčiau siųstą.
- Kadangi žinučių eilės saugomos atmintyje, nulūžus programai pradings ir visos neapdorotos / neišsiųstos žinutės.
Kitoje dalyje
Tiek šiam kartui, tikiuosi pavyko jus sudominti ZeroMQ galimybėmis. Kitoje dalyje sukursime kliento-serverio programas, kurios komunikuos Request / Reply principu su automatiniu žinučių balansavimu.
Rodyk draugams
Naujausi komentarai