Architektur a Fäegkeete vum Tarantool Data Grid

Architektur a Fäegkeete vum Tarantool Data Grid

Am 2017 hu mir e Concours gewonnen fir den Transaktiounskär vum Alfa-Bank Investitiounsgeschäft z'entwéckelen an ugefaang ze schaffen (bei HighLoad ++ 2018 mat engem Bericht iwwer de Kär vum Investitiounsgeschäft geschwat Vladimir Drynkin, Chef vum Transaktiounskär vum Investitiounsgeschäft vun der Alfa Bank). Dëse System sollt Transaktiounsdaten aus verschiddene Quellen a verschiddene Formater aggregéieren, d'Donnéeën an eng vereenegt Form bréngen, se späicheren an Zougang zu hinnen ubidden.

Wärend dem Entwécklungsprozess huet de System evoluéiert an d'Funktionalitéit kritt, an iergendwann hu mir gemierkt datt mir eppes vill méi kristalliséieren wéi just Applikatiounssoftware erstallt fir eng strikt definéiert Palette vun Aufgaben ze léisen: mir hunn et gelongen System fir verdeelt Uwendungen mat persistent Lagerung ze bauen. D'Erfahrung, déi mir gewonnen hunn, huet d'Basis vun engem neie Produkt geformt - Tarantool Data Grid (TDG).

Ech wëll iwwer d'TDG Architektur schwätzen an d'Léisungen, déi mir am Entwécklungsprozess ukomm sinn, Iech d'Haaptfunktionalitéit virstellen a weisen wéi eise Produkt d'Basis ka ginn fir komplett Léisungen ze bauen.

Architektonesch hu mir de System an separat opgedeelt Rollen, déi jidderee verantwortlech ass fir eng gewëssen Palette vu Problemer ze léisen. Eng eenzeg Lafen Applikatioun Instanz implementéiert eng oder méi Rollentypen. Et kënne verschidde Rollen vum selwechten Typ an engem Cluster sinn:

Architektur a Fäegkeete vum Tarantool Data Grid

wäert bewegen

Connector ass responsabel fir Kommunikatioun mat der Äussewelt; seng Aufgab ass d'Ufro ze akzeptéieren, se ze analyséieren, a wann dëst geléngt, da schéckt d'Donnéeën fir d'Veraarbechtung un den Inputprozessor. Mir ënnerstëtzen HTTP, SOAP, Kafka, FIX Formater. D'Architektur erlaabt Iech einfach Ënnerstëtzung fir nei Formater ze addéieren, mat Ënnerstëtzung fir IBM MQ kënnt geschwënn. Wann d'Parsing vun der Ufro gescheitert ass, gëtt de Connector e Feeler zréck; soss wäert et äntweren datt d'Ufro erfollegräich veraarbecht gouf, och wann e Feeler während senger weiderer Veraarbechtung geschitt ass. Dëst gouf speziell gemaach fir mat Systemer ze schaffen, déi net wësse wéi d'Demande widderhuelen - oder am Géigendeel, et ze persistent maachen. Fir Daten net ze verléieren, gëtt eng Reparaturschlaang benotzt: d'Objet gëtt als éischt an et an eréischt no der erfollegräicher Veraarbechtung ofgeschaaft. Den Administrateur kann Alarmer iwwer Objeten kréien, déi an der Reparaturschlaang bleiwen, an nodeems Dir e Softwarefehler oder Hardwarefehler eliminéiert hutt, probéiert et nach eng Kéier.

Input Prozessor

Den Input Prozessor klasséiert déi kritt Donnéeën no charakteristesche Fonctiounen a rifft entspriechend Prozessoren. Handler sinn Lua Code deen an enger Sandkëscht leeft, sou datt se de Fonctionnement vum System net beaflosse kënnen. Op dëser Etapp kënnen d'Donnéeën op déi erfuerderlech Form reduzéiert ginn, an, wann néideg, eng arbiträr Unzuel vun Aufgaben lancéiert ginn, déi déi néideg Logik ëmsetzen kënnen. Zum Beispill, am MDM (Master Data Management) Produkt gebaut op Tarantool Data Grid, wann Dir en neie Benotzer bäidréit, fir d'Veraarbechtung vun der Ufro net ze luesen, lancéiere mir d'Schafung vun engem gëllene Rekord als eng separat Aufgab. D'Sandbox ënnerstëtzt Ufroe fir d'Liesen, d'Ännerung an d'Addéieren vun Donnéeën, erlaabt Iech e puer Funktioun op all Rollen vum Späichertyp an der Aggregatioun vum Resultat ze maachen (Kaart / reduzéieren).

Handler kënnen an Dateien beschriwwe ginn:

sum.lua

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

An dann, an der Konfiguratioun deklaréiert:

functions:
  sum: { __file: sum.lua }

Firwat Lua? Lua ass eng ganz einfach Sprooch. Baséierend op eiser Erfahrung, e puer Stonnen nodeems se et kennen léieren, fänken d'Leit Code ze schreiwen deen hire Problem léist. An dat sinn net nëmmen professionell Entwéckler, mä, zum Beispill, Analysten. Zousätzlech, dank dem Jit Compiler, leeft Lua ganz séier.

Stockage

Stockage späichert persistent Daten. Ier Dir späichert, ginn d'Donnéeën géint den Dateschema validéiert. Fir de Circuit ze beschreiwen benotze mir en erweidert Format Apache AvroAn. Beispill:

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

Baséierend op dëser Beschreiwung gëtt DDL (Data Definition Language) automatesch fir d'Tarantula DBMS generéiert an GrafQL Schema fir Daten Zougang.

Asynchron Datereplikatioun gëtt ënnerstëtzt (et gi Pläng fir eng Synchron ze addéieren).

Ausgang Prozessor

Heiansdo ass et néideg externe Konsumenten iwwer d'Arrivée vun neien Donnéeën z'informéieren; fir dësen Zweck gëtt et d'Ausgangsprozessor Roll. Nodeems Dir d'Daten gespäichert hutt, kënnen se un den entspriechende Handler weiderginn (zum Beispill fir se an d'Form ze bréngen, déi vum Konsument erfuerderlech ass) - an dann un de Connector fir ze schécken. Hei gëtt och eng Reparaturschlaang benotzt: wa keen den Objet akzeptéiert huet, kann den Administrateur spéider nach eng Kéier probéieren.

Skaléieren

De Connector, Input Prozessor, an Output Prozessor Rollen sinn stateless, wat eis erlaabt de System horizontal ze skaléieren andeems se einfach nei Applikatiounsfäll mat der gewënschter Rollentyp ageschalt ginn. D'Lagerung gëtt fir horizontale Skala benotzt virugoen fir e Stärekoup mat virtuellen Eemer ze organiséieren. Nodeems Dir en neie Server bäigefüügt hutt, ginn e puer vun den Eemer vun den alen Serveren op den neie Server am Hannergrond geplënnert; dëst geschitt transparent fir Benotzer an beaflosst net d'Operatioun vum ganze System.

Daten Properties

Objete kënne ganz grouss sinn an aner Objeten enthalen. Mir garantéieren d'Atomizitéit fir Daten ze addéieren an ze aktualiséieren andeems en Objet mat all Ofhängegkeeten an engem virtuellen Eemer späichert. Dëst verhënnert datt den Objet iwwer verschidde physesch Serveren "verbreet" gëtt.

Versioning gëtt ënnerstëtzt: all Aktualiséierung vun engem Objet erstellt eng nei Versioun, a mir kënnen ëmmer eng Zäitschnëtt huelen a kucken wéi d'Welt deemools ausgesinn huet. Fir Daten déi keng laang Geschicht brauchen, kënne mir d'Zuel vun de Versioune limitéieren oder souguer nëmmen eng späicheren - déi lescht - dat ass, am Wesentlechen d'Versionéierung fir eng bestëmmten Typ deaktivéieren. Dir kënnt och d'Geschicht vun Zäit limitéieren: zum Beispill, läschen all Objete vun engem bestëmmten Typ méi al wéi 1 Joer. Archivéieren gëtt och ënnerstëtzt: mir kënnen Objekter méi al wéi déi spezifizéierter Zäit entloossen, a Raum am Cluster befreien.

Aufgaben

Ënnert den interessanten Features ass et derwäert ze notéieren d'Fäegkeet fir Aufgaben op engem Zäitplang ze starten, op Ufro vum Benotzer, oder programmatesch aus der Sandkëscht:

Architektur a Fäegkeete vum Tarantool Data Grid

Hei gesi mir eng aner Roll - Leefer. Dës Roll ass stateless, an zousätzlech Uwendungsinstanzen mat dëser Roll kënnen an de Cluster bäigefüügt ginn wéi néideg. D'Verantwortung vum Leefer ass d'Aufgaben ze kompletéieren. Wéi erwähnt, ass et méiglech nei Aufgaben aus der Sandkëscht ze generéieren; si sinn an enger Schlaang op Stockage gespäichert an dann op de Leefer ausgefouert. Dës Zort Aufgab gëtt Job genannt. Mir hunn och eng Tasktyp genannt Task - dëst sinn Benotzerdefinéiert Aufgaben déi op engem Zäitplang lafen (mat Cron Syntax) oder op Ufro. Fir esou Aufgaben ze lancéieren an ze verfollegen, hu mir e prakteschen Task Manager. Fir datt dës Funktionalitéit verfügbar ass, musst Dir d'Roll vum Scheduler aktivéieren; dës Roll huet e Staat, sou datt et net Skala ass, wat awer net erfuerderlech ass; gläichzäiteg, wéi all aner Rollen, kann et eng Replica hunn, déi ufänkt ze schaffen, wann de Meeschter op eemol refuséiert.

Logger

Eng aner Roll gëtt Logger genannt. Et sammelt Logbicher vun alle Membere vum Stärekoup a bitt en Interface fir d'Eroplueden an ze gesinn duerch d'Webinterface.

Servicer

Et ass derwäert ze ernimmen datt de System et einfach mécht Servicer ze kreéieren. An der Konfiguratiounsdatei kënnt Dir uginn, wéi eng Ufroen un e Benotzer-schrëftleche Handler geschéckt ginn, deen an der Sandkëscht leeft. An dësem Handler kënnt Dir zum Beispill eng Zort analytesch Ufro lafen an d'Resultat zréckginn.

De Service gëtt an der Konfiguratiounsdatei beschriwwen:

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

D'GraphQL API gëtt automatesch generéiert an de Service gëtt verfügbar fir ze ruffen:

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

Dëst wäert den Handler ruffen sumdéi d'Resultat zréckginn:

3

Query Profiling a Metriken

Fir d'Operatioun vum System an d'Profiléierungsufroen ze verstoen, hu mir Ënnerstëtzung fir den OpenTracing Protokoll implementéiert. De System kann Informatioun op Ufro un Tools schécken déi dëse Protokoll ënnerstëtzen, wéi Zipkin, wat Iech erlaabt ze verstoen wéi d'Ufro ausgefouert gouf:

Architektur a Fäegkeete vum Tarantool Data Grid

Natierlech liwwert de System intern Metriken déi mat Prometheus gesammelt kënne ginn a mat Grafana visualiséiert ginn.

Deploy

Tarantool Data Grid kann aus RPM Packagen oder engem Archiv ofgesat ginn, mat engem Utility vun der Verdeelung oder Ansible, et gëtt och Ënnerstëtzung fir Kubernetes (Tarantool Kubernetes Bedreiwer).

D'Applikatioun déi d'Geschäftslogik implementéiert (Konfiguratioun, Handler) gëtt an den ofgebauten Tarantool Data Grid Cluster gelueden a Form vun engem Archiv duerch d'UI oder mat engem Skript duerch d'API vun eis geliwwert.

Beispill Uwendungen

Wéi eng Uwendunge kënne mat Tarantool Data Grid erstallt ginn? Tatsächlech sinn déi meescht Geschäftsaufgaben iergendwéi am Zesummenhang mat der Veraarbechtung, Späicheren an Zougang zu Datenfloss. Dofir, wann Dir grouss Streamen vun Daten hutt, déi sécher musse gespäichert an zougänglech sinn, da kann eise Produkt Iech vill Entwécklungszäit spueren an op Är Geschäftslogik fokusséieren.

Zum Beispill wëlle mir Informatiounen iwwer den Immobiliemaart sammelen, fir datt mir zum Beispill an Zukunft Informatiounen iwwer déi bescht Offeren hunn. An dësem Fall wäerte mir déi folgend Aufgaben markéieren:

  1. Roboter déi Informatioun aus oppene Quellen sammelen wäerten eis Datequellen sinn. Dir kënnt dëse Problem léisen andeems Dir fäerdege Léisunge benotzt oder Code an all Sprooch schreift.
  2. Als nächst wäert Tarantool Data Grid d'Donnéeën akzeptéieren a späicheren. Wann d'Dateformat aus verschiddene Quellen anescht ass, da kënnt Dir Code am Lua schreiwen, deen d'Konversioun an en eenzegt Format ausféiert. An der Pre-Veraarbechtung Etapp, Dir wäert och fäheg sinn, zum Beispill, duplizéiert Offeren ze filteren oder zousätzlech Informatiounen iwwer Agenten, déi um Maart an der Datebank schaffen, aktualiséieren.
  3. Elo hutt Dir schonn eng skalierbar Léisung an engem Cluster, dee mat Daten gefëllt ka ginn an Datenauswielen maachen. Da kënnt Dir nei Funktionalitéit ëmsetzen, zum Beispill, e Service schreiwen, deen eng Demande fir Daten mécht an déi avantagéisst Offer pro Dag gëtt - dëst erfuerdert e puer Zeilen an der Konfiguratiounsdatei an e bësse Lua Code.

Wat d'nächst?

Eis Prioritéit ass d'Liichtegkeet vun der Entwécklung ze verbesseren Tarantool Data Grid. Zum Beispill ass dëst eng IDE mat Ënnerstëtzung fir Profiléierung an Debugging Handler déi an enger Sandkëscht lafen.

Mir bezuelen och grouss Opmierksamkeet op Sécherheetsproblemer. Am Moment sinn mir amgaang Zertifizéierung vum FSTEC vu Russland fir den héije Sécherheetsniveau ze bestätegen an d'Ufuerderunge fir d'Zertifizéierung vu Softwareprodukter ze treffen, déi a perséinlechen Dateninformatiounssystemer a Regierungsinformatiounssystemer benotzt ginn.

Source: will.com

Setzt e Commentaire