Arkitekturo kaj kapabloj de Tarantool Data Grid

Arkitekturo kaj kapabloj de Tarantool Data Grid

En 2017, ni gajnis konkurson por disvolvi la transakcian kernon de la investa komerco de Alfa-Bank kaj komencis laboron (ĉe HighLoad++ 2018 kun raporto pri la kerno de la investa komerco. farita Vladimir Drynkin, estro de la transakcia kerno de la investa komerco de Alfa Bank). Ĉi tiu sistemo devis kunigi transakciajn datumojn de malsamaj fontoj en diversaj formatoj, alporti la datumojn en unuigitan formon, stoki ĝin kaj havigi aliron al ĝi.

Dum la evoluprocezo, la sistemo evoluis kaj akiris funkciecon, kaj iam ni konstatis, ke ni kristaligas ion multe pli ol nur aplikaĵon kreitan por solvi strikte difinitan gamon da taskoj: ni sukcesis. sistemo por konstrui distribuitajn aplikojn kun konstanta stokado. La sperto kiun ni akiris formis la bazon de nova produkto - Tarantool Datuma Reto (TDG).

Mi volas paroli pri la TDG-arkitekturo kaj la solvoj al kiuj ni venis dum la evoluprocezo, prezenti al vi la ĉefan funkciojn kaj montri kiel nia produkto povas fariĝi la bazo por konstrui kompletajn solvojn.

Arkitekture, ni dividis la sistemon en apartajn roloj, ĉiu el kiuj respondecas pri solvado de certa gamo da problemoj. Ununura funkcianta aplikaĵo efektivigas unu aŭ plurajn rolspecojn. Povas ekzisti pluraj roloj de la sama tipo en areto:

Arkitekturo kaj kapabloj de Tarantool Data Grid

konektilo

Konektilo respondecas pri komunikado kun la ekstera mondo; ĝia tasko estas akcepti la peton, analizi ĝin, kaj se ĉi tio sukcesas, tiam sendi la datumojn por prilaborado al la eniga procesoro. Ni subtenas HTTP, SOAP, Kafka, FIX-formatojn. La arkitekturo permesas al vi simple aldoni subtenon por novaj formatoj, kun subteno por IBM MQ baldaŭ. Se la analizo de la peto malsukcesis, la konektilo resendos eraron; alie, ĝi respondos, ke la peto estis procesita sukcese, eĉ se eraro okazis dum ĝia plua prilaborado. Tio estis farita specife por labori kun sistemoj, kiuj ne scipovas ripeti petojn – aŭ male tro persiste. Por ne perdi datumojn, oni uzas riparvicon: la objekto unue eniras ĝin kaj nur post sukcesa prilaborado estas forigita de ĝi. La administranto povas ricevi atentigojn pri objektoj restantaj en la riparvico, kaj post forigo de programara eraro aŭ aparataro, provu denove.

Eniga procesoro

La Eniga procesoro klasifikas la ricevitajn datumojn laŭ karakterizaj trajtoj kaj nomas taŭgajn procesorojn. Pritraktantoj estas Lua-kodo, kiu funkcias en sablokesto, do ili ne povas influi la funkciadon de la sistemo. En ĉi tiu etapo, la datumoj povas esti reduktitaj al la bezonata formo, kaj, se necese, arbitra nombro da taskoj povas esti lanĉita, kiuj povas efektivigi la necesan logikon. Ekzemple, en la produkto MDM (Master Data Management) konstruita sur Tarantool Data Grid, aldonante novan uzanton, por ne malrapidigi la prilaboradon de la peto, ni lanĉas la kreadon de ora rekordo kiel aparta tasko. La sablokesto subtenas petojn por legi, ŝanĝi kaj aldoni datumojn, ebligas al vi plenumi iun funkcion pri ĉiuj roloj de la konserva tipo kaj agregado de la rezulto (mapo/redukto).

Pritraktiloj povas esti priskribitaj en dosieroj:

sum.lua

local x, y = unpack(...)
return x + y

Kaj tiam, deklarita en la agordo:

functions:
  sum: { __file: sum.lua }

Kial Lua? Lua estas tre simpla lingvo. Surbaze de nia sperto, kelkajn horojn post ekkoni ĝin, homoj komencas skribi kodon, kiu solvas sian problemon. Kaj ĉi tiuj ne estas nur profesiaj programistoj, sed, ekzemple, analizistoj. Krome, danke al la jitkompililo, Lua funkcias tre rapide.

stokado

Stokado konservas konstantajn datumojn. Antaŭ konservado, datumoj estas validigitaj kontraŭ la datumskemo. Por priskribi la cirkviton ni uzas plilongigitan formaton Apache Avro. Ekzemplo:

{
    "name": "User",
    "type": "record",
    "logicalType": "Aggregate",
    "fields": [ 
        { "name": "id", "type": "string"}, 
        {"name": "first_name", "type": "string"}, 
        {"name": "last_name", "type": "string"} 
    ], 
    "indexes": ["id"] 
}

Surbaze de ĉi tiu priskribo, DDL (Data Difina Lingvo) estas aŭtomate generita por la Tarantula DBMS kaj GraphQL skemo por aliro al datumoj.

Nesinkrona datuma reproduktado estas subtenata (estas planoj aldoni sinkronan).

Eliga procesoro

Kelkfoje necesas informi eksterajn konsumantojn pri la alveno de novaj datumoj; por ĉi tiu celo, estas la rolo de Eligo-procesoro. Post konservado de la datumoj, ĝi povas esti transdonita al la responda prizorganto (ekzemple, por alporti ĝin al la formo postulata de la konsumanto) - kaj poste transdonita al la konektilo por sendi. Ĉi tie ankaŭ estas uzata riparvico: se neniu akceptis la objekton, la administranto povas denove provi poste.

Skalo

La roloj de konektilo, eniga procesoro kaj produktaĵprocesoro estas sennaciaj, permesante al ni skali la sistemon horizontale per simple aldonado de novaj aplikaĵkazoj kun la dezirata roltipo ebligita. Stokado estas uzata por horizontala skalado aliro al organizado de areto uzante virtualajn sitelojn. Post aldoni novan servilon, kelkaj el la siteloj de la malnovaj serviloj estas movitaj al la nova servilo en la fono; ĉi tio okazas travideble al uzantoj kaj ne influas la funkciadon de la tuta sistemo.

Datumaj Propraĵoj

Objektoj povas esti tre grandaj kaj enhavi aliajn objektojn. Ni certigas atomecon de aldono kaj ĝisdatigo de datumoj stokante objekton kun ĉiuj dependecoj en unu virtuala sitelo. Ĉi tio malhelpas la objekton esti "disvastigita" tra pluraj fizikaj serviloj.

Versiado estas subtenata: ĉiu ĝisdatigo de objekto kreas novan version, kaj ni ĉiam povas preni tempotranĉon kaj vidi kiel la mondo aspektis tiam. Por datumoj, kiuj ne bezonas longan historion, ni povas limigi la nombron da versioj aŭ eĉ konservi nur unu - la plej novan - tio estas, esence malŝalti versionadon por certa tipo. Vi ankaŭ povas limigi la historion laŭ tempo: ekzemple, forigi ĉiujn objektojn de certa tipo pli aĝaj ol 1 jaro. Arkivado ankaŭ estas subtenata: ni povas malŝarĝi objektojn pli malnovajn ol la specifita tempo, liberigante spacon en la areto.

taskoj

Inter la interesaj funkcioj, indas noti la eblon lanĉi taskojn laŭ horaro, laŭ la peto de la uzanto aŭ programe el la sablokesto:

Arkitekturo kaj kapabloj de Tarantool Data Grid

Ĉi tie ni vidas alian rolon - kuristo. Ĉi tiu rolo estas sennacia, kaj pliaj aplikaĵkazoj kun ĉi tiu rolo povas esti aldonitaj al la areto laŭbezone. La respondeco de la kuristo estas plenumi taskojn. Kiel menciite, eblas generi novajn taskojn el la sablokesto; ili estas konservitaj en atendovico sur stokado kaj tiam efektivigitaj sur la kuristo. Ĉi tiu tipo de tasko nomiĝas Ijob. Ni ankaŭ havas taskospecon nomatan Tasko - ĉi tiuj estas uzant-difinitaj taskoj, kiuj funkcias laŭ horaro (uzante cron-sintakso) aŭ laŭpeto. Por lanĉi kaj spuri tiajn taskojn, ni havas oportunan taskadministranton. Por ke ĉi tiu funkcio estu disponebla, vi devas ebligi la planilon; tiu ĉi rolo havas staton, do ĝi ne skalas, kiu tamen ne estas postulata; samtempe, kiel ĉiuj aliaj roloj, ĝi povas havi kopion, kiu ekfunkcias, se la majstro subite rifuzas.

Logilo

Alia rolo nomiĝas logger. Ĝi kolektas protokolojn de ĉiuj membroj de la areto kaj disponigas interfacon por alŝuti kaj vidi ilin per la retinterfaco.

Servoj

Menciindas, ke la sistemo faciligas krei servojn. En la agorda dosiero, vi povas specifi kiuj petoj estas senditaj al uzant-skribita prizorganto, kiu funkcias en la sablokesto. En ĉi tiu prizorganto, vi povas, ekzemple, ruli ian analizan demandon kaj redoni la rezulton.

La servo estas priskribita en la agorda dosiero:

services:
   sum:
      doc: "adds two numbers"
      function: sum
      return_type: int
      args:
         x: int
         y: int

La GraphQL API estas generita aŭtomate kaj la servo fariĝas disponebla por voki:

query {
   sum(x: 1, y: 2) 
}

Ĉi tio vokos la prizorganton sumkiu resendos la rezulton:

3

Demando Profilado kaj Metriko

Por kompreni la funkciadon de la sistemo kaj profilajn petojn, ni efektivigis subtenon por la protokolo OpenTracing. La sistemo povas sendi informojn laŭ postulo al iloj, kiuj subtenas ĉi tiun protokolon, kiel ekzemple Zipkin, kiu permesos al vi kompreni kiel la peto estis efektivigita:

Arkitekturo kaj kapabloj de Tarantool Data Grid

Kompreneble, la sistemo disponigas internajn metrikojn, kiuj povas esti kolektitaj per Prometheus kaj bildigitaj per Grafana.

Deploji

Tarantool Data Grid povas esti deplojita de RPM-pakaĵoj aŭ arkivo, uzante ilon de la distribuo aŭ Ansible, ekzistas ankaŭ subteno por Kubernetes (Operaciisto de Tarantool Kubernetes).

La aplikaĵo, kiu efektivigas la komercan logikon (agordo, pritraktantoj) estas ŝarĝita en la deplojitan Tarantool Data Grid-grupon en la formo de arkivo per la UI aŭ uzante skripton per la API provizita de ni.

Ekzemplaj Aplikoj

Kiuj aplikoj povas esti kreitaj per Tarantool Data Grid? Fakte, plej multaj komercaj taskoj estas iel rilataj al prilaborado, stokado kaj aliro de datumfluo. Sekve, se vi havas grandajn fluojn de datumoj, kiuj devas esti sekure konservitaj kaj alireblaj, tiam nia produkto povas ŝpari al vi multan disvolvan tempon kaj koncentriĝi pri via komerca logiko.

Ekzemple, ni volas kolekti informojn pri la nemovebla merkato, por ke estonte, ekzemple, ni havu informojn pri la plej bonaj ofertoj. En ĉi tiu kazo, ni reliefigos la sekvajn taskojn:

  1. Robotoj kiuj kolektas informojn de malfermaj fontoj estos niaj datumfontoj. Vi povas solvi ĉi tiun problemon uzante pretajn solvojn aŭ skribante kodon en iu ajn lingvo.
  2. Poste, Tarantool Data Grid akceptos kaj konservos la datumojn. Se la formato de datumoj de malsamaj fontoj estas malsama, tiam vi povas skribi kodon en Lua, kiu faros la konvertiĝon al ununura formato. En la antaŭ-prilabora stadio, vi ankaŭ povos, ekzemple, filtri duplikatajn ofertojn aŭ aldone ĝisdatigi informojn pri agentoj laborantaj en la merkato en la datumbazo.
  3. Nun vi jam havas skaleblan solvon en areto, kiu povas esti plenigita per datumoj kaj fari datumajn elektojn. Tiam vi povas efektivigi novan funkcion, ekzemple, skribi servon, kiu faros peton por datumoj kaj donos la plej avantaĝan oferton ĉiutage - ĉi tio postulos kelkajn liniojn en la agorda dosiero kaj iom Lua-kodo.

Kio sekvas?

Nia prioritato estas plibonigi la facilecon de disvolviĝo uzante Tarantool Datuma Reto. Ekzemple, ĉi tio estas IDE kun subteno por profilado kaj sencimigaj prizorgantoj kurantaj en sablokesto.

Ni ankaŭ multe atentas sekurecajn problemojn. Ĝuste nun ni spertas ateston de FSTEC de Rusio por konfirmi la altan nivelon de sekureco kaj plenumi la postulojn por atesto de programaj produktoj uzataj en personaj datumoj informsistemoj kaj registaraj informsistemoj.

fonto: www.habr.com

Aldoni komenton