Arkitektura dhe aftësitë e Tarantool Data Grid

Arkitektura dhe aftësitë e Tarantool Data Grid

Në vitin 2017, ne fituam një konkurs për të zhvilluar thelbin transaksional të biznesit të investimeve të Alfa-Bank dhe filluam punën (në HighLoad++ 2018 me një raport mbi thelbin e biznesit të investimeve kryer Vladimir Drynkin, kreu i bërthamës transaksionale të biznesit të investimeve të Alfa Bank). Ky sistem duhej të grumbullonte të dhënat e transaksioneve nga burime të ndryshme në formate të ndryshme, t'i sillte të dhënat në një formë të unifikuar, t'i ruante dhe të siguronte akses në to.

Gjatë procesit të zhvillimit, sistemi evoluoi dhe fitoi funksionalitet, dhe në një moment ne kuptuam se po kristalizonim diçka shumë më tepër sesa thjesht një softuer aplikacioni i krijuar për të zgjidhur një gamë të përcaktuar rreptësisht detyrash: ia dolëm sistem për ndërtimin e aplikacioneve të shpërndara me ruajtje të vazhdueshme. Përvoja që fituam formoi bazën e një produkti të ri - Rrjeti i të dhënave Tarantool (TDG).

Dua të flas për arkitekturën TDG dhe zgjidhjet në të cilat kemi ardhur gjatë procesit të zhvillimit, t'ju prezantoj me funksionalitetin kryesor dhe të tregoj se si produkti ynë mund të bëhet bazë për ndërtimin e zgjidhjeve të plota.

Arkitekturisht, ne e ndamë sistemin në të veçantë rolin, secila prej të cilave është përgjegjëse për zgjidhjen e një game të caktuar problemesh. Një shembull i vetëm i aplikacionit ekzekutiv zbaton një ose më shumë lloje rolesh. Mund të ketë disa role të të njëjtit lloj në një grup:

Arkitektura dhe aftësitë e Tarantool Data Grid

Connector

Connector është përgjegjës për komunikimin me botën e jashtme; Detyra e tij është të pranojë kërkesën, ta analizojë atë dhe nëse kjo ka sukses, atëherë dërgoni të dhënat për përpunim në procesorin hyrës. Ne mbështesim formatet HTTP, SOAP, Kafka, FIX. Arkitektura ju lejon të shtoni thjesht mbështetje për formate të reja, me mbështetjen për IBM MQ së shpejti. Nëse analizimi i kërkesës dështoi, lidhësi do të kthejë një gabim; përndryshe, ai do të përgjigjet se kërkesa është përpunuar me sukses, edhe nëse ka ndodhur një gabim gjatë përpunimit të saj të mëtejshëm. Kjo është bërë posaçërisht për të punuar me sisteme që nuk dinë të përsërisin kërkesat - ose, përkundrazi, e bëjnë atë me shumë këmbëngulje. Për të mos humbur të dhënat, përdoret një radhë riparimi: objekti së pari futet në të dhe vetëm pas përpunimit të suksesshëm hiqet prej tij. Administratori mund të marrë sinjalizime për objektet që mbeten në radhën e riparimit dhe pasi të eliminojë një gabim softueri ose dështim harduer, provoni përsëri.

Procesori i hyrjes

Procesori i hyrjes i klasifikon të dhënat e marra sipas veçorive karakteristike dhe thërret procesorët e duhur. Trajtuesit janë kodi Lua që funksionon në një sandbox, kështu që ata nuk mund të ndikojnë në funksionimin e sistemit. Në këtë fazë, të dhënat mund të reduktohen në formën e kërkuar dhe, nëse është e nevojshme, mund të nisë një numër arbitrar detyrash që mund të zbatojnë logjikën e nevojshme. Për shembull, në produktin MDM (Master Data Management) i ndërtuar në Tarantool Data Grid, kur shtojmë një përdorues të ri, për të mos ngadalësuar përpunimin e kërkesës, ne nisim krijimin e një rekordi të artë si detyrë më vete. Sandbox mbështet kërkesat për leximin, ndryshimin dhe shtimin e të dhënave, ju lejon të kryeni disa funksione në të gjitha rolet e llojit të ruajtjes dhe grumbullimin e rezultatit (hartë/zvogëloni).

Trajtuesit mund të përshkruhen në skedarë:

sum.lua

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

Dhe pastaj, deklaruar në konfigurim:

functions:
  sum: { __file: sum.lua }

Pse Lua? Lua është një gjuhë shumë e thjeshtë. Bazuar në përvojën tonë, disa orë pasi e njohin atë, njerëzit fillojnë të shkruajnë kodin që zgjidh problemin e tyre. Dhe këta nuk janë vetëm zhvillues profesionistë, por, për shembull, analistë. Përveç kësaj, falë kompajlerit jit, Lua funksionon shumë shpejt.

Ruajtje

Magazinimi ruan të dhëna të vazhdueshme. Para ruajtjes, të dhënat vërtetohen kundrejt skemës së të dhënave. Për të përshkruar qarkun ne përdorim një format të zgjeruar Apache Avro. Shembull:

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

Bazuar në këtë përshkrim, DDL (Gjuha e Përkufizimit të të Dhënave) gjenerohet automatikisht për Tarantula DBMS dhe GrafikQL skema për aksesin e të dhënave.

Replikimi asinkron i të dhënave mbështetet (ka plane për të shtuar një sinkron).

Procesori i daljes

Ndonjëherë është e nevojshme të njoftohen konsumatorët e jashtëm për mbërritjen e të dhënave të reja; për këtë qëllim, ekziston roli i procesorit Output. Pas ruajtjes së të dhënave, ato mund t'i kalohen mbajtësit përkatës (për shembull, për t'i sjellë ato në formën e kërkuar nga konsumatori) - dhe më pas kalohen te lidhësi për dërgim. Këtu përdoret gjithashtu një radhë riparimi: nëse askush nuk e pranoi objektin, administratori mund të provojë përsëri më vonë.

Shkallëzimi

Rolet e lidhësit, procesorit të hyrjes dhe procesorit të daljes janë pa shtetësi, duke na lejuar të shkallëzojmë sistemin horizontalisht duke shtuar thjesht shembuj të rinj të aplikacionit me llojin e dëshiruar të rolit të aktivizuar. Magazinimi përdoret për shkallëzim horizontal afrimi për të organizuar një grup duke përdorur kova virtuale. Pas shtimit të një serveri të ri, disa nga kovat nga serverët e vjetër zhvendosen në serverin e ri në sfond; kjo ndodh në mënyrë transparente për përdoruesit dhe nuk ndikon në funksionimin e të gjithë sistemit.

Karakteristikat e të dhënave

Objektet mund të jenë shumë të mëdha dhe të përmbajnë objekte të tjera. Ne sigurojmë atomicitetin e shtimit dhe përditësimit të të dhënave duke ruajtur një objekt me të gjitha varësitë në një kovë virtuale. Kjo parandalon që objekti të "përhapet" nëpër disa serverë fizikë.

Versionimi mbështetet: çdo përditësim i një objekti krijon një version të ri dhe ne gjithmonë mund të marrim një pjesë kohore dhe të shohim se si dukej bota atëherë. Për të dhënat që nuk kanë nevojë për një histori të gjatë, ne mund të kufizojmë numrin e versioneve ose madje të ruajmë vetëm një - më të fundit - domethënë, në thelb të çaktivizojmë versionin për një lloj të caktuar. Ju gjithashtu mund të kufizoni historinë sipas kohës: për shembull, fshini të gjitha objektet e një lloji të caktuar më të vjetër se 1 vit. Mbështetet gjithashtu arkivimi: ne mund të shkarkojmë objekte më të vjetra se koha e specifikuar, duke liruar hapësirë ​​në grup.

detyrat

Ndër veçoritë interesante, vlen të përmendet aftësia për të nisur detyrat në një orar, me kërkesë të përdoruesit ose në mënyrë programore nga sandbox:

Arkitektura dhe aftësitë e Tarantool Data Grid

Këtu shohim një rol tjetër - vrapues. Ky rol është pa shtetësi dhe shembuj shtesë të aplikacionit me këtë rol mund të shtohen në grup sipas nevojës. Përgjegjësia e vrapuesit është të kryejë detyrat. Siç u përmend, është e mundur të gjenerohen detyra të reja nga sandbox; ato ruhen në një radhë në ruajtje dhe më pas ekzekutohen në runner. Kjo lloj detyre quhet Job. Ne kemi gjithashtu një lloj detyre të quajtur Detyrë - këto janë detyra të përcaktuara nga përdoruesi që ekzekutohen sipas një orari (duke përdorur sintaksën cron) ose sipas kërkesës. Për të nisur dhe gjurmuar detyra të tilla, ne kemi një menaxher të përshtatshëm detyrash. Në mënyrë që ky funksion të jetë i disponueshëm, duhet të aktivizoni rolin e planifikuesit; ky rol ka një gjendje, pra nuk shkallëzohet, gjë që megjithatë nuk kërkohet; në të njëjtën kohë, si të gjitha rolet e tjera, mund të ketë një kopje që fillon të funksionojë nëse mjeshtri papritmas refuzon.

sharrëxhi

Një rol tjetër quhet sharrëxhi. Ai mbledh regjistrat nga të gjithë anëtarët e grupit dhe ofron një ndërfaqe për ngarkimin dhe shikimin e tyre përmes ndërfaqes së internetit.

Sherbime

Vlen të theksohet se sistemi lehtëson krijimin e shërbimeve. Në skedarin e konfigurimit, mund të specifikoni se cilat kërkesa i dërgohen një mbajtësi të shkruar nga përdoruesi që funksionon në sandbox. Në këtë mbajtës, ju mund, për shembull, të ekzekutoni një lloj pyetjeje analitike dhe të ktheni rezultatin.

Shërbimi përshkruhet në skedarin e konfigurimit:

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

GraphQL API gjenerohet automatikisht dhe shërbimi bëhet i disponueshëm për thirrje:

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

Kjo do të thërrasë mbajtësin sume cila do të kthejë rezultatin:

3

Profilizimi i pyetjeve dhe matjet

Për të kuptuar funksionimin e sistemit dhe kërkesat e profilizimit, ne kemi implementuar mbështetje për protokollin OpenTracing. Sistemi mund të dërgojë informacion sipas kërkesës tek mjetet që mbështesin këtë protokoll, si Zipkin, i cili do t'ju lejojë të kuptoni se si u ekzekutua kërkesa:

Arkitektura dhe aftësitë e Tarantool Data Grid

Natyrisht, sistemi ofron metrika të brendshme që mund të mblidhen duke përdorur Prometheus dhe të vizualizohen duke përdorur Grafana.

Vendosni

Tarantool Data Grid mund të vendoset nga paketat RPM ose një arkiv, duke përdorur një mjet nga shpërndarja ose Ansible, ka gjithashtu mbështetje për Kubernetes (Operatori Tarantool Kubernetes).

Aplikacioni që zbaton logjikën e biznesit (konfigurimi, mbajtësit) ngarkohet në grupin e vendosur të rrjetit të të dhënave Tarantool në formën e një arkivi përmes UI ose duke përdorur një skript përmes API-së së ofruar nga ne.

Shembull aplikimesh

Cilat aplikacione mund të krijohen duke përdorur Tarantool Data Grid? Në fakt, shumica e detyrave të biznesit janë disi të lidhura me përpunimin, ruajtjen dhe aksesin në rrjedhën e të dhënave. Prandaj, nëse keni rrjedha të mëdha të dhënash që duhet të ruhen dhe të aksesohen në mënyrë të sigurt, atëherë produkti ynë mund t'ju kursejë shumë kohë zhvillimi dhe të fokusohet në logjikën e biznesit tuaj.

Për shembull, ne duam të mbledhim informacione për tregun e pasurive të paluajtshme, në mënyrë që në të ardhmen, për shembull, të kemi informacion për ofertat më të mira. Në këtë rast, ne do të theksojmë detyrat e mëposhtme:

  1. Robotët që mbledhin informacion nga burime të hapura do të jenë burimet tona të të dhënave. Ju mund ta zgjidhni këtë problem duke përdorur zgjidhje të gatshme ose duke shkruar kode në çdo gjuhë.
  2. Më pas, Tarantool Data Grid do t'i pranojë dhe ruajë të dhënat. Nëse formati i të dhënave nga burime të ndryshme është i ndryshëm, atëherë mund të shkruani kodin në Lua që do të kryejë konvertimin në një format të vetëm. Në fazën e para-përpunimit, do të jeni gjithashtu në gjendje, për shembull, të filtroni oferta të kopjuara ose të përditësoni informacione shtesë për agjentët që punojnë në treg në bazën e të dhënave.
  3. Tani ju tashmë keni një zgjidhje të shkallëzueshme në një grup që mund të mbushet me të dhëna dhe të bëjë zgjedhje të të dhënave. Pastaj mund të zbatoni funksionalitet të ri, për shembull, të shkruani një shërbim që do të bëjë një kërkesë për të dhëna dhe do të japë ofertën më të favorshme në ditë - kjo do të kërkojë disa rreshta në skedarin e konfigurimit dhe pak kod Lua.

Çka më tej?

Prioriteti ynë është të përmirësojmë lehtësinë e zhvillimit të përdorimit Rrjeti i të dhënave Tarantool. Për shembull, ky është një IDE me mbështetje për trajtuesit e profilizimit dhe korrigjimit që funksionojnë në një sandbox.

Ne gjithashtu i kushtojmë vëmendje të madhe çështjeve të sigurisë. Tani për tani ne po kalojmë certifikimin nga FSTEC i Rusisë për të konfirmuar nivelin e lartë të sigurisë dhe për të përmbushur kërkesat për certifikimin e produkteve softuerike të përdorura në sistemet e informacionit të të dhënave personale dhe sistemet e informacionit qeveritar.

Burimi: www.habr.com

Shto një koment