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
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 -
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:
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
{
"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
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
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:
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 sum
e 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:
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 (
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:
- 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ë.
- 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.
- 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
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