TollRo și anatomia unei lansări dificile

În 2009 îmi finalizam studiile de doctorat cu tema Particularități ale proiectării sistemelor informaționale financiar contabile în medii distribuite. Am învățat, cercetat și experimentat în perioada studiilor diferite platforme de colectare, prelucrare și stocare a datelor și informațiilor, culminând cu participarea pe mai mulți ani la competiția Imagine Cup organizată de Microsoft, dedicată acestor tipuri de implementări. Am înțeles cât de importantă este partea de proiectare și testare și lecția supremă: nu contează cât de mult ai încercat, ci rezultatul să fie funcțional.

De fiecare dată când la nivel național s-a lansat câte o platformă pentru ceva anume, aproape întotdeauna a fost cu probleme de subdimensionare în momentul în care s-a făcut trecerea în “producție”. Amintim doar: Cardul Național de Sănătate și sistemul SIUI (CNAS), Platforma IMM Invest, Portalul RO Vaccinare, Sistemele RO e-Factura și SPV și altele. Majoritatea problemelor au apărut din cauza proiectării. Întâmplător sau nu, am lucrat o singură dată pentru organismele statului pentru proiectarea și implementarea unui sistem informatic, dar era doar pentru intern. Această experiență în schimb m-a făcut să înțeleg cum se lucrează și de ce multe din astfel de proiecte eșuează. Dar de fapt ”strategia” este puțin altfel: digitalizarea este o afacere foarte bănoasă (pentru anumite companii), mai ales dacă ea este continuă…

În continuarea acestui articol voi încerca să explic din punct de vedere tehnic ce s-a întâmplat cu eșecul lansării TollRo din 1 octombrie 2026 pentru că oferă un studiu de caz interesant despre diferența dintre dezvoltarea unei aplicații informatice și operarea unui serviciu digital critic la scară națională. Încă de la început doresc să menționez că nu dețin foarte multe detalii despre probleme, în afara celor care au apărut în presă și articolul acesta încearcă o tentă educativă.

Pe scurt, pentru cei care nu sunt la curent cu problema, în primele ore de funcționare au apărut probleme de acces, întârzieri în transmiterea mesajelor electronice și dificultăți în anumite fluxuri de plată. CNAIR a explicat că platforma s-a confruntat cu un volum foarte mare de utilizatori și tranzacții imediat după lansare, iar ulterior a anunțat măsuri de creștere a capacității și de stabilizare a serviciului. În primele 12 ore, conform datelor publicate de companie, platforma fusese accesată de aproximativ patru milioane de vizitatori și utilizatori autentificați, fuseseră înregistrați circa 50.000 de utilizatori și 170.000 de vehicule, emise peste 45.000 de tichete de rută și procesate peste 60.000 de plăți.

Aceste cifre explică amploarea lansării, dar nu sunt suficiente pentru a identifica precis cauza tehnică a incidentelor. Din exterior nu avem acces la arhitectura platformei, la loguri, la metricile infrastructurii, la rezultatele testelor de performanță sau la configurația componentelor software. De aceea, ar fi excesiv să afirmăm că TollRo a suferit, în mod demonstrat, de o „arhitectură software greșită”.

Putem însă face ceva mai util: să pornim de la ceea ce este documentat public și să explicăm ce presupune, în ingineria software modernă, pregătirea unui asemenea sistem pentru producție.

Un sistem poate funcționa și totuși să nu fie pregătit pentru producție

Una dintre confuziile frecvente în proiectele informatice este echivalarea funcționării aplicației cu pregătirea ei pentru exploatare reală. Dacă un utilizator poate crea un cont, poate înregistra un vehicul și poate realiza o plată, putem spune că fluxul respectiv funcționează. Acest lucru demonstrează însă în primul rând corectitudinea funcțională.

În producție apare o întrebare diferită: ce se întâmplă atunci când mii sau zeci de mii de persoane încearcă să execute aceleași operații într-un interval foarte scurt?

Aici intrăm în zona numită production readiness (pregătirea pentru producție). Ea nu privește doar corectitudinea codului, ci capacitatea, performanța, monitorizarea, recuperarea după erori, dependențele externe, securitatea și comportamentul sistemului atunci când una dintre componente începe să funcționeze lent sau devine temporar indisponibilă.

Checklist-ul clasic folosit de companiile mari de software și cloud pentru lansarea serviciilor include tocmai asemenea întrebări: care este traficul estimat, cât de mare poate fi vârful din momentul lansării, care este combinația diferitelor tipuri de solicitări, ce arată un test end-to-end, cum se comportă serviciile externe, ce timeout-uri și retry-uri există și cum se degradează serviciul dacă o dependență nu mai funcționează.

Această distincție este importantă pentru a înțelege cazul TollRo. Nu discutăm doar despre întrebarea „funcționa aplicația?”, ci despre una mai complexă: era întregul ecosistem pregătit pentru comportamentul real al utilizatorilor din momentul lansării?

Ce înseamnă, de fapt, „foarte mulți utilizatori”?

Cifra de aproximativ patru milioane de accesări în primele 12 ore este impresionantă, dar, din punct de vedere tehnic, nu ne spune singură cât de solicitat a fost sistemul.

Pentru analiza capacității sunt mai importante alte valori: câte cereri erau procesate într-o secundă, câți utilizatori erau activi simultan, câte operații genera fiecare acțiune din interfață, cât dura răspunsul bazei de date și cât timp era consumat în apelurile către sistemele externe.

În terminologia tehnică apar aici câteva metrici importante. RPS (requests per second) arată câte solicitări primește sistemul într-o secundă. Concurrency descrie câte operații sunt procesate simultan. Latency măsoară timpul necesar pentru răspuns, iar valori precum p95 sau p99 încearcă să surprindă experiența utilizatorilor mai puțin norocoși: de exemplu, p99 indică timpul sub care sunt finalizate 99% dintre solicitări. Mai există apoi saturation, adică momentul în care o resursă începe să ajungă la limita sa: procesoare, memorie, conexiuni la baza de date, thread-uri, lățime de bandă sau capacitatea unui serviciu extern. Aceste valori sunt importante deoarece patru milioane de accesări distribuite relativ uniform pe parcursul unei zile reprezintă un fenomen complet diferit de câteva sute de mii de operații concentrate într-un interval foarte scurt.

AWS, de exemplu, recomandă tocmai de aceea ca testarea de încărcare să fie făcută asupra întregului workload, într-un mediu comparabil cu producția și inclusiv la valori mai mari decât traficul estimat. Testarea doar a componentelor individuale sau numai până la încărcarea așteptată este considerată o practică insuficientă, deoarece nu arată locul în care sistemul va începe să se degradeze.

Lansarea TollRo avea și un profil particular de trafic

În cazul TollRo există un detaliu foarte important pentru această discuție. Cu doar câteva ore înaintea trecerii la versiunea de producție, CNAIR a anunțat că datele din aplicația pilot nu vor fi migrate. Operatorii care participaseră la pilotare trebuiau să își creeze din nou conturile, să reintroducă datele companiilor și să înregistreze din nou vehiculele și remorcile. Din punct de vedere tehnic, acest lucru înseamnă că lansarea nu genera doar trafic normal de utilizare. Genera simultan un volum important de bootstrap traffic: operațiile necesare pentru inițializarea unei baze mari de utilizatori. Crearea unui cont este de obicei mai costisitoare decât simpla autentificare într-un cont existent. Poate implica scrieri în baze de date, validări, generarea unor token-uri, apeluri către alte sisteme, transmiterea unor mesaje de confirmare și înregistrarea altor informații asociate. Același lucru se întâmplă la introducerea unei flote de vehicule. În consecință, profilul de trafic din prima zi poate fi foarte diferit de cel care va exista peste o lună, când majoritatea utilizatorilor au deja conturile și vehiculele înregistrate.

Google SRE (Site Reliability Engineering  – o disciplină de inginerie software creată de Google pentru a gestiona, automatiza și menține scalabilitatea, disponibilitatea și securitatea sistemelor IT de mare anvergură) atrage atenția exact asupra acestui fenomen: un launch spike nu înseamnă neapărat doar mai mult trafic, ci poate însemna și un traffic mix diferit de cel întâlnit în funcționarea normală. În unele lansări documentate de Google, vârfurile au depășit de câteva ori estimările inițiale.

Prin urmare, una dintre întrebările relevante pentru orice sistem de acest tip ar fi: a fost testată înainte de lansare nu doar cantitatea de trafic, ci exact combinația de operații care urma să apară în primele ore?

Load testing, stress testing și diferența dintre ele

Aici merită lămuriți doi termeni utilizați frecvent:

  • Load testing înseamnă testarea comportamentului aplicației la un nivel realist de încărcare. Dacă estimăm, de exemplu, că într-o oră vor exista 20.000 de utilizatori activi, încercăm să reproducem un asemenea scenariu înainte de lansare și urmărim timpii de răspuns, rata erorilor și consumul resurselor.
  • Stress testing merge mai departe. Creștem intenționat încărcarea peste valorile anticipate pentru a identifica limita sistemului și, mai ales, pentru a observa cum se comportă atunci când ajunge acolo.

Această diferență este importantă. Nu este realist să presupunem că orice sistem poate suporta orice volum de trafic. Resursele sunt finite chiar și într-un cloud privat. Ceea ce ne dorim însă de la un sistem bine proiectat este ca depășirea capacității să nu producă un colaps necontrolat. La 110% din capacitatea proiectată, poate răspunde mai lent. La 150%, poate limita temporar unele operații. La 200%, poate refuza controlat anumite solicitări și îi poate informa pe utilizatori că serviciul este temporar aglomerat.

Acest comportament poartă numele de graceful degradation, degradare controlată. Sistemul nu încearcă să mențină toate funcțiile cu orice preț, ci protejează operațiile esențiale și încearcă să evite propagarea unei probleme către întregul serviciu.

TollRo nu este o aplicație izolată

O altă parte importantă a incidentului privește serviciile externe. CNAIR a anunțat probleme în interconectarea cu procesatorul de plăți, mai exact în fluxurile de autorizare și confirmare a tranzacțiilor. De asemenea, compania a descris ulterior procesul de verificare și reconciliere a plăților efectuate în intervalul afectat. Acest lucru ne amintește de o caracteristică esențială a aplicațiilor moderne: ele sunt rareori sisteme complet independente.

Un flux poate arăta, simplificat, astfel:

Pentru utilizator toate acestea reprezintă „TollRo”. Din punct de vedere tehnic însă, sunt mai multe servicii, posibil operate de organizații diferite și conectate prin rețea. Aici apare noțiunea de dependency (dependență): un sistem poate fi perfect funcțional în interior și totuși să ofere o experiență slabă dacă un serviciu extern începe să răspundă lent.

Să presupunem că un serviciu răspunde în mod normal în 200 de milisecunde, dar ajunge temporar la zece secunde. Aplicația care îl apelează poate rămâne cu conexiunile ocupate, utilizatorul poate apăsa din nou butonul, iar alte componente pot începe să acumuleze cereri. Problema inițială poate astfel să se propage.

De ce retry-ul nu este întotdeauna soluția

În asemenea situații, primul instinct al programatorului este adesea rezonabil: dacă apelul nu a reușit, îl încercăm din nou, operațiunea fiind cunoscută sub numele de retry. Pentru o eroare tranzitorie poate fi o soluție foarte bună. Dacă o conexiune de rețea a avut o problemă timp de câteva sute de milisecunde, următoarea încercare poate reuși. Dar retry-urile trebuie controlate și condiționate. Să presupunem că un serviciu poate procesa 1.000 de solicitări pe secundă, dar primește 2.000. Unele solicitări vor eșua. Dacă fiecare dintre ele este retrimisă imediat de două sau trei ori, serviciul deja suprasolicitat poate primi 4.000 sau 5.000 de solicitări și astfel problema se amplifică singură, dintr-un comportament, am spune, normal al utilizatorilor în condiții de stres.

În literatura de specialitate fenomenul este cunoscut ca retry storm și poate contribui la un cascading failure. Microsoft recomandă, printre altele, un număr finit de retry-uri, întârzieri progresive între încercări și chiar bugete globale de retry, tocmai pentru ca un număr mare de clienți să nu suprasolicite colectiv o dependență care încearcă să se recupereze.

O tehnică frecvent utilizată este exponential backoff: dacă prima încercare eșuează, aștepți puțin; dacă și următoarea eșuează, aștepți mai mult, apoi și mai mult. Adesea se adaugă o variație aleatorie (jitter) pentru a preveni reîncercările simultane din partea a mii de utilizatori.

Circuit breaker: când este mai sănătos să nu mai încerci

Pentru probleme care persistă există un alt mecanism, numit circuit breaker, al cărui nume vine chiar de la siguranța electrică. Dacă un serviciu extern începe să producă multe erori, aplicația poate decide temporar să nu îl mai apeleze. „Circuitul” intră în starea open, iar solicitările eșuează rapid sau primesc un răspuns alternativ. După o perioadă, sistemul permite câteva solicitări de probă. Dacă ele reușesc, circuitul se închide și traficul normal poate reveni treptat. Scopul nu este doar protejarea aplicației principale, ci și a serviciului care are probleme. Un sistem aflat în recuperare nu este ajutat dacă primește imediat toate solicitările acumulate.

Microsoft descrie circuit breaker-ul tocmai ca pe un mecanism care limitează apelurile repetate către o resursă care probabil va continua să eșueze și ajută la prevenirea propagării incidentului către alte componente. Nu știm dacă TollRo utilizează sau nu acest pattern și incidentul nu permite să tragem o asemenea concluzie. Cazul explică însă foarte bine de ce aceste mecanisme sunt importante atunci când o platformă depinde de servicii pe care nu le controlează complet.

De ce e-mailul este o componentă tehnică, nu doar o notificare

Una dintre problemele documentate pe 1 octombrie a fost transmiterea mesajelor către Gmail și Yahoo. CNAIR a explicat că platforma a generat într-un interval foarte scurt un volum mare de mesaje tranzacționale, iar unele au fost temporar limitate de mecanismele automate ale furnizorilor de e-mail. Acest comportament al furnizorilor nu este neobișnuit. Google recomandă explicit expeditorilor care trimit volume mari de e-mail să crească progresiv volumul, să evite trimiterea în rafale și să monitorizeze reputația domeniului și răspunsurile serverelor. O creștere bruscă a volumului poate duce la rate limiting și amânarea livrării.

Aici apare termenul throttling: în loc să accepte un număr nelimitat de solicitări, un serviciu impune temporar o limită. Nu înseamnă neapărat că mesajele sunt considerate spam; poate însemna pur și simplu că sistemul receptor reduce rata cu care acceptă trafic de la un anumit expeditor.

Pentru un sistem precum TollRo este important ca trimiterea unui e-mail să nu blocheze inutil întreaga tranzacție principală.

O arhitectură uzuală ar putea separa cele două procese:

În acest scenariu, dacă furnizorul de e-mail acceptă mesajele mai lent, notificările se acumulează într-o coadă și sunt livrate progresiv. Aplicația principală nu trebuie neapărat să aștepte finalizarea trimiterii fiecărui mesaj. Aceasta este una dintre utilizările procesării asincrone: operațiile care nu trebuie finalizate exact în aceeași fracțiune de secundă sunt decuplate pentru a reduce dependențele și pentru a absorbi vârfurile de trafic.

Plățile aduc o problemă specială: ce faci când nu știi dacă tranzacția s-a executat?

Plățile sunt mai delicate decât multe alte operații. Să presupunem că aplicația transmite unui procesator cererea de plată. Procesatorul debitează cardul, dar conexiunea cade exact înainte ca răspunsul să ajungă înapoi la TollRo. Din perspectiva aplicației există o ambiguitate: plata a eșuat sau doar confirmarea s-a pierdut? Dacă retrimite pur și simplu aceeași operație, există riscul unei procesări duplicate. Aici intervine conceptul de idempotency.

O operație idempotentă poate fi repetată fără ca efectul să se producă de mai multe ori. În cazul unei plăți, două request-uri reprezentând aceeași tranzacție logică trebuie să poată fi recunoscute ca duplicate și să nu determine două debitări. Microsoft recomandă explicit verificarea caracterului idempotent înainte de retry, tocmai deoarece un request poate fi procesat cu succes chiar dacă răspunsul către client nu mai ajunge.

În aceeași logică apare și reconcilierea tranzacțiilor, procedură menționată de CNAIR după incidentele din prima zi. Reconcilierea compară informațiile din sistemele implicate pentru a determina care tranzacții au fost efectiv procesate și pentru a aduce evidențele într-o stare consistentă. CNAIR chiar le-a recomandat utilizatorilor care plătiseră fără să primească o confirmare să nu repete plata până când nu verifică situația în cont. Este o recomandare care ilustrează foarte bine diferența dintre „request-ul a primit eroare” și „tranzacția financiară nu a avut loc”.

Mai multe servere ajută, dar nu rezolvă automat problema

După incident, capacitatea platformei a fost mărită. Aceasta este o reacție firească atunci când există semne de saturație. Totuși, scalabilitatea unui sistem nu depinde doar de numărul de servere. Imaginați-vă că avem zece servere de aplicație care folosesc aceeași bază de date. Dacă serverele aplicației sunt suprasolicitate, putem adăuga încă zece. Dar dacă adevărata limită este baza de date, noua capacitate de procesare poate însemna pur și simplu că trimitem și mai repede cereri către componenta care era deja saturată.

Situația este similară pentru serviciile externe. Dacă acestea permit un anumit număr de conexiuni simultane, multiplicarea serverelor proprii nu mărește automat și capacitatea partenerului. De aceea, performanța trebuie analizată end-to-end, de la utilizator până la ultima dependență relevantă. Într-un sistem distribuit, capacitatea întregului flux este deseori determinată de componenta cea mai restrictivă.

Back-pressure: sistemul trebuie să știe și să spună „mai încet”

Un alt concept util este back-pressure: dacă o componentă poate procesa 1.000 de operații pe secundă, iar alta îi livrează 5.000, există două posibilități: prima este ca cererile să se acumuleze până când memoria, conexiunile sau thread-urile sunt epuizate; a doua este ca sistemul să reducă controlat rata de intrare. Acest mecanism poate lua forma unor cozi, limite de concurență, rate limiting sau prioritizarea anumitor operații.

În termeni simpli, back-pressure înseamnă că o componentă aflată aproape de limită transmite în amonte mesajul: „pot continua, dar nu cu viteza aceasta”. Microsoft subliniază că vârfurile foarte scurte pot destabiliza inclusiv componentele din aval înainte ca throttling-ul obișnuit să intervină și recomandă mecanisme de control al concurenței către dependențele externe.

Astfel de tehnici sunt importante tocmai pentru a transforma o suprasarcină dintr-o cădere generală într-o perioadă de funcționare mai lentă, dar controlată.

Pilotarea și problema timpului disponibil

În cazul TollRo există și o dimensiune importantă legată de calendar. CNAIR anunța pe 18 septembrie că pilotarea publică fusese începută pe 16 septembrie și că, potrivit contractului, această etapă trebuia să dureze minimum patru săptămâni. Compania preciza totodată că sistemul nu intrase încă în etapa de recepție calitativă, care putea începe numai după finalizarea testării și pilotării. CNAIR ceruse deja amânarea aplicării până la 1 aprilie 2027. TollRo a devenit însă operațional la 1 octombrie.

Această cronologie nu dovedește că durata pilotării este cauza directă a incidentelor din prima zi. Ar fi o concluzie pe care datele publice nu o permit. Ea arată însă că lansarea s-a produs înainte de încheierea perioadei minime de pilotare prevăzute contractual și înainte de etapa de recepție calitativă descrisă de CNAIR.

Din perspectiva managementului tehnic, pilotarea nu este doar o perioadă în care „vedem dacă aplicația merge”. Este momentul în care ipotezele de proiectare întâlnesc pentru prima dată utilizatorii și infrastructura reală. În pilotare pot apărea diferențe neașteptate între telefoane, rețele mobile, moduri de utilizare, profile de trafic, date reale, servicii externe și comportamentul prevăzut în laborator.

Tocmai de aceea este util să existe suficient timp între identificarea unei probleme, remedierea ei, retestare și decizia finală de go-live.

Cum ar arăta, „ca la carte”, pregătirea unei asemenea lansări?

Nu există o singură rețetă universală, iar fără documentația internă nu putem spune ce pași au fost sau nu au fost parcurși în cazul TollRo. Putem însă descrie modelul general utilizat pentru sistemele digitale critice.

Înainte de lansare ar trebui cunoscută capacitatea reală a sistemului prin teste de încărcare end-to-end. Nu doar frontend-ul, ci baza de date, autentificarea, plățile, serviciile externe și sistemele de notificare trebuie testate împreună.

Ar trebui apoi testată încărcarea peste estimarea normală, astfel încât echipa să știe unde se află limita și cum se manifestă degradarea.

Dependențele externe ar trebui evaluate separat: ce se întâmplă dacă un sistem răspunde de zece ori mai lent, dacă returnează erori sau dacă devine complet indisponibil?

Pentru aceste situații se proiectează timeout-uri, retry-uri cu backoff, circuit breakers, cozi, mecanisme de throttling și forme de graceful degradation.

Pentru operațiile financiare trebuie gândite idempotency și reconciliere.

Pentru operațiile care nu trebuie efectuate sincron,  precum anumite notificări, pot fi folosite cozi și procesare asincronă.

În plus, este nevoie de observability. Acest termen desemnează capacitatea echipei de a înțelege starea internă a sistemului pornind de la ceea ce acesta raportează: metrici, loguri și distributed traces. În timpul unui incident, echipa ar trebui să poată vedea rapid nu doar că „platforma este lentă”, ci dacă problema provine din CPU, conexiunile bazei de date, o anumită interfață externă, procesatorul de plăți sau acumularea unei cozi.

Ideal, toate acestea sunt însoțite de o lansare progresivă (staged rollout) atunci când natura serviciului permite acest lucru. În loc ca întreaga populație să intre simultan într-o versiune complet nouă, traficul poate fi transferat gradual, monitorizând comportamentul sistemului pe măsură ce volumul crește. Și acest tip de abordare apare în practicile de lansare descrise de Google SRE.

Ce putem spune și ce nu putem spune despre TollRo

Din informațiile publice, putem spune că lansarea din 1 octombrie a întâlnit simultan mai multe tipuri de dificultăți: un volum foarte ridicat de acces și tranzacții, probleme asociate livrării mesajelor electronice și dificultăți în anumite fluxuri de plată și integrare. Putem spune, de asemenea, că după incident CNAIR a crescut capacitatea, a început reconcilierea tranzacțiilor și a continuat procesul de stabilizare. Știm și că pilotarea publică începuse cu aproximativ două săptămâni înainte de data intrării în producție și că perioada contractuală minimă menționată de CNAIR era de patru săptămâni.

Nu știm însă dacă principala limitare a fost baza de date, infrastructura de calcul, configurația rețelei, o anumită integrare, algoritmii aplicației sau o combinație între acestea. Nu știm ce rezultate au avut testele de performanță realizate înainte de lansare. Nu știm capacitatea proiectată și nici capacitatea măsurată a platformei. Nu știm ce mecanisme de autoscaling, circuit breaker, caching, rate limiting sau load shedding sunt implementate.

Aceste informații ar putea apărea doar într-o analiză tehnică detaliată sau într-un post-mortem al incidentului.

Prin urmare, cea mai corectă concluzie nu este că „TollRo a avut o arhitectură greșită”, ci că lansarea a scos la suprafață mai multe probleme tipice ale exploatării sistemelor distribuite la scară: capacitate, vârfuri de trafic, dependențe externe și comportamentul unor fluxuri tranzacționale sub sarcină reală.

Dincolo de TollRo

Poate că aceasta este și partea cea mai utilă a întregului episod. Sistemele informatice moderne nu mai pot fi evaluate doar prin întrebarea „merge aplicația?”.

Un sistem critic trebuie evaluat și prin întrebări precum: ce se întâmplă dacă numărul utilizatorilor este de trei ori mai mare decât estimarea? Ce se întâmplă dacă baza de date încetinește? Ce se întâmplă dacă furnizorul de e-mail introduce throttling? Ce se întâmplă dacă procesatorul de plăți primește operația, dar confirmarea se pierde? Ce se întâmplă dacă un serviciu extern nu răspunde timp de cinci minute? Și, poate cel mai important, ce funcții pot continua să opereze atunci când una dintre componente are probleme?

Aceste întrebări reprezintă trecerea de la simpla dezvoltare software la reliability engineering.

Un sistem bine proiectat nu este unul despre care presupunem că nu va avea niciodată probleme. În sisteme suficient de complexe, problemele sunt inevitabile. Un sistem bine proiectat este unul în care limitele au fost căutate înainte de lansare, modurile de defectare au fost anticipate, iar incidentele unei componente nu se transformă automat în indisponibilitatea întregului serviciu.

Din această perspectivă, TollRo poate deveni un studiu de caz foarte util. Nu pentru a identifica de la distanță un vinovat sau un anumit defect de cod, ci pentru a înțelege cât de multă inginerie există între momentul în care o aplicație „funcționează” și momentul în care putem spune că un serviciu digital critic este cu adevărat pregătit pentru producție.

La final câteva detalii financiare și tehnice

1. Costul proiectului și finanțarea

  • Valoarea contractului principal (Lot 1): 224,5 milioane de lei (fără TVA) (aproximativ 267 milioane lei cu TVA).
  • Sursa de finanțare: Fonduri europene nerambursabile prin PNRR (Planul Național de Redresare și Reziliență), Componenta 10 / Reforme în sectorul transporturilor.
  • Durata contractului: Perioadă de dezvoltare/implementare (de circa 10-12 luni), urmată de servicii de mentenanță și suport tehnic pe o perioadă de 5 ani.

2. Actorii principali

  • Beneficiarul & Administratorul sistemului: C.N.A.I.R. S.A. (Compania Națională de Administrare a Infrastructurii Rutiere) – entitatea publică responsabilă de colectarea taxelor și gestionarea rețelei de drumuri.
  • Dezvoltatorul / Prestatorul IT principal: Vodafone România S.A. – compania desemnată câștigătoare a licitației publice pentru Lotul 1 („Sistem informatic centralizat”).
  • Interoperabilitate europeană: Furnizorii SETRE / EETS (European Electronic Toll Service) – operatori terți autorizați care integrează echipamentele OBU de la bordul vehiculelor de marfă cu platforma centrală.

3. Arhitectura tehnică (Conform Caietului de Sarcini al Licitației)

Sistemul a fost conceput ca o arhitectură distribuită, orientată pe servicii și procesare de volume mari de date (Big Data & Real-time Streaming). Principalele componente de arhitectură ale Lotului 1 includ:

  1. Sistemul de Containerizare și Microservicii:
    • Utilizează containere izolate (de tip Docker/Kubernetes) pentru a permite scalarea automată a modulelor în perioadele cu trafic masiv pe servere.
  2. Componenta Big Data & Streaming Engine:
    • Streaming Engine (Message Broker): Un sistem bazat pe modelul Publish/Subscribe (de tip Apache Kafka) care preia în timp real sute de mii de mesaje și poziții GPS transmise de dispozitivele din camioane sau de aplicația mobilă.
    • Componenta Big Data: Stochează istoricul uriaș de date geolocalizate ale traseelor parcurse.
  3. Motorul de Procesare în Timp Real (Stream Analytics Engine):
    • Analizează fluxul de date în timp real pentru a valida consistența călătoriilor și pentru a detecta anomalii sau fraude (de exemplu: raportarea simultană a aceluiași număr de înmatriculare în două puncte geografice incompatibile).
  4. Sistemul Central (Core System):
    • Porți Virtuale (Virtual Gates): Segmentarea virtuală a rețelei rutiere naționale pentru calculul automat al kilometrilor parcurși de un vehicul la trecerea dintr-un sector în altul.
    • Algoritm de calcul al tarifelor: Calcularea dinamică a prețului în funcție de masa totală (MTMA), numărul de axe, clasa de poluare EURO și tipul de drum (autostradă, drum expres, drum național).
    • Gestiune clienți și flote: Administrarea conturilor de persoane fizice și juridice, interfațate prin portalul web etoll.ro.
  5. Modulul de Colectare și Procesare a Contravențiilor:
    • Integrează camerele fixe ANPR (recunoașterea automată a numerelor de înmatriculare) și punctele de control mobile.
    • Stochează imaginile și dovezile în baze de date de tip Object Storage și generează automat procesele-verbale de constatare a amenzilor.
  6. Interfețe API de Integrare:
    • Servicii dedicate conectării cu infrastructurile operatorilor europeni SETRE și cu procesatorii de plăți bancare.

Referințe

CNAIR / AGERPRES, „Situația platformei TollRo: ce s-a remediat și ce urmează”, 1 octombrie 2026 – date privind primele 12 ore de funcționare, măsurile de stabilizare și reconcilierea tranzacțiilor.

HotNews, „Atenție! Incident tehnic. Noul sistem de taxare rutieră TollRo, lansat astăzi, nu funcționează”, 1 octombrie 2026 – comunicarea CNAIR referitoare la e-mailuri, throttling și fluxurile de plată.

AGERPRES, „CNAIR solicită amânarea aplicării TollRo până la 1 aprilie 2027”, 18 septembrie 2026 – pilotarea începută la 16 septembrie, durata contractuală minimă și stadiul recepției calitative.

HotNews, „Anunțul CNAIR pentru șoferi cu câteva ore înainte de intrarea în vigoare a sistemului TollRo”, 30 septembrie 2026 – trecerea din pilot în producție fără migrarea conturilor și a datelor introduse anterior.

Google Site Reliability Engineering, „Launch Coordination Checklist” și „Reliable Product Launches at Scale” – capacity planning, launch spikes, dependențe externe, load testing, rate limiting, rollout gradual și pregătirea serviciilor pentru producție.

AWS Well-Architected Framework, „Load test your workload” – testarea end-to-end și testarea la sarcini care depășesc nivelul anticipat.

Microsoft Azure Architecture Center, „Circuit Breaker Pattern”, „Retry Pattern” și recomandările privind gestionarea erorilor tranzitorii – circuit breakers, retry, backoff, retry budgets și idempotency.

Google Gmail, „Email sender guidelines” – creșterea graduală a volumului, evitarea spike-urilor și mecanismele de rate limiting.

Despre onestitate

Onestitatea are un defect mare: odată invocată, nu mai poate fi pusă în sertar. Nu poți s-o scoți la lumină în campanie, s-o plimbi prin piețe, s-o așezi pe afișe, s-o transformi în emoție publică, iar apoi, când ajungi în camera cu uși grele, s-o lași discret pe hol, lângă umbrele.

Oamenii pot ierta multe. Pot ierta greșeli, ezitări, bâlbâieli, chiar și lipsa de experiență. Dar iartă greu sentimentul că au fost folosiți ca treaptă morală pentru o scară politică. Pentru că votul nu este doar o ștampilă. Uneori este o mică investiție de suflet. Pui acolo o speranță, o supărare mai veche, o încredere câștigată greu, o rușine de a mai fi păcălit încă o dată. Și pleci acasă spunându-ți că, poate, de data aceasta, lucrurile nu vor mai fi făcute ca înainte.

Trădarea nu începe întotdeauna cu un gest spectaculos. Nu vine mereu cu fanfară, cu tunete și cu declarații mari. Uneori vine pe vârfuri, îmbrăcată în cuvinte cuminți: stabilitate, responsabilitate, maturitate, aritmetica mulțimilor. Sunt cuvinte respectabile, desigur. Dar și cele mai respectabile cuvinte pot deveni paravane, dacă în spatele lor se ascunde aceeași veche meserie a combinației.

Există o diferență între compromis și compromitere. Compromisul este când accepți că lumea nu încape perfect în principiile tale. Compromiterea este când principiile tale încep să nu mai încapă în lumea în care ai vrut cu orice preț să intri. Primul ține de luciditate. A doua ține de abandon.Și mai există o diferență: între a lucra cu oameni imperfecți și a te sprijini pe oameni care au făcut din lipsa de caracter o metodă. Nimeni nu cere sfinți în politică. Ar fi și ridicol, și periculos. Dar între sfințenie și duplicitate există un teritoriu foarte larg, în care se află decența, loialitatea, transparența, respectul față de cei care te-au crezut.

Când invoci onestitatea, nu promiți perfecțiune. Promiți însă că nu vei face din întuneric o tehnică de guvernare. Promiți că nu vei numi curaj ceea ce este doar calcul. Că nu vei numi responsabilitate ceea ce seamănă izbitor cu frica de a pierde jocul. Că nu vei numi maturitate ceea ce, privit de aproape, are toate trăsăturile vechii șmecherii politice.

Poate că unii vor spune că așa se face politica. Că trebuie numărate voturi, împărțite funcții, adunate tabere, convinsă lumea de pe margine. Așa este. Politica nu se face cu îngeri și nici cu poezii. Dar tocmai aici este proba. Dacă totul se reduce, în cele din urmă, la aceleași manevre, aceleași întâlniri discrete, aceleași fidelități schimbate peste noapte, atunci de ce am mai avut nevoie de cuvinte mari? De ce am mai chemat oamenii la o promisiune morală?

Pentru că oamenii nu au votat doar o persoană. Au votat o direcție. Au votat împotriva unui fel de a face lucrurile. Au votat împotriva aroganței celor care cred că poporul este bun doar când aplaudă și inutil când întreabă. Au votat cu gândul că, măcar de data aceasta, ușile nu se vor închide imediat după numărarea voturilor.

Dezamăgirea nu vine din faptul că realitatea este complicată. Oamenii știu asta. Vine din impresia că realitatea complicată este folosită ca scuză pentru gesturi simple și urâte. Vine din senzația că ai fost invitat să crezi într-un principiu, iar apoi ți s-a explicat, superior, că principiile sunt bune doar până încep negocierile.

Onestitatea nu este un slogan. Este o datorie care rămâne după ce luminile campaniei s-au stins. Este partea aceea incomodă care te urmărește tocmai când ai ajuns unde voiai să ajungi. Este martorul tăcut din încăpere, cel pe care nu-l poți da afară fără să se vadă.Iar trădarea cea mai dureroasă nu este întotdeauna trădarea adversarului. De la adversar te aștepți. Te aperi. Îți ții geaca strânsă și portofelul aproape. Trădarea care doare este aceea a celui în care ai pus, fie și pentru o clipă, ceva mai mult decât o opinie. Ai pus o nădejde.Și poate că aici se rupe firul. Nu definitiv, nu teatral, nu cu urlete. Ci încet, aproape civilizat. Omul care a sperat nu devine neapărat dușman. Devine mai atent. Mai rece. Mai greu de convins. Își ia înapoi emoția și o pune într-un loc mai sigur. Nu pentru că nu mai vrea binele public, ci pentru că a înțeles, încă o dată, că în politică promisiunile frumoase trebuie păzite mai ales de cei care le rostesc.

Onestitatea nu cere să nu greșești niciodată. Cere doar să nu-ți construiești greșeala ca pe o strategie și apoi să-i ceri lumii să o numească virtute.

Povestea celor trei pălării

A fost odată, pe un deal care nu se hotărâse nici el bine ce fel de deal vrea să fie, o stână. Nu o stână obișnuită, cu miei și cu brânză și cu mirosul acela cinstit de lână și de fum, ci una dintre acelea în care oile se numărau de două ori:  o dată ca să fie și a doua oară ca să pară mai multe.

Peste această stână vegheau trei păstori, fiecare cu mersul lui, cu tăcerea lui selectivă și, mai ales, cu pălăria lui. Căci în toate treburile mari ale lumii, pălăria a venit înaintea capului.

Cel dintâi, să-i zicem Costică, deși el preferă „domnul Costică”, și în anumite cercuri chiar „liderul Costică”, purta o pălărie largă, cu boruri cât umbrela unui om de stat la vremea ploilor electorale. O purtase atâta, că uitase când o luase și de unde. Unii ziceau că i-o dăduseră alegătorii. Alții, că și-o cumpărase singur și le prezentase chitanța ca dovadă de transparență.

Când îl întreba cineva ceva, Costică nu răspundea imediat. Ridica mai întâi borul cu două degete, privea în zare cu aerul omului care a văzut lucruri pe care voi nu le-ați văzut și care, dacă le-ar spune, v-ar copleși, și zicea:

— Eu am spus-o dintotdeauna. Și dacă n-am spus-o, am gândit-o, ceea ce e mai important.

Pălăria îl umbrea atât de bine, încât nici el nu mai vedea limpede unde calcă. Dar picioarele lui aveau memorie proprie și-l duceau singure, mai ales spre locurile unde era lumină și aplauze.

Al doilea, Grigore, fostul Grigoriță, actualul „Grigore-cu-viziune”, cum se prezenta singur pe cardurile de vizită pe care le purta în trei buzunare simultan, purta o pălărie dreaptă, severă, cu boruri mici și precise, ca un ordin de zi.

Grigore mergea apăsat și vorbea în propoziții scurte, terminate cu punct, nu cu virgulă, căci virgula, după opinia lui, era semnul celui care ezită, iar el nu ezita niciodată, ceea ce îl ajuta enorm să nu se răzgândească, și ceva mai puțin să aibă dreptate.

— Situația e clară, zicea Grigore, în fața oricărei situații care nu era câtuși de puțin clară.

— Și ce facem? întreba câte unul.

— Ce trebuie, răspundea el, cu aerul că „ce trebuie” e un concept pe deplin definit și aflat exclusiv în posesia lui.

Pălăria îl ținea atât de drept, că spinarea lui devenise un argument în sine. Oamenii îl credeau adesea nu pentru că zicea ceva convingător, ci pentru că stătea atât de convingător.

Al treilea, Nelu, zis și „Nelu-cel-de-suflet”, zis și „băiatul nostru”, zis și alte feluri pe care le vom lăsa nerostite din delicatețe, purta o pălărioară mică, de-o șchioapă, așezată pe creștetul capului cu o precizie care trăda ore de exersare în fața oglinzii.

Nelu nu spunea niciodată lucruri mari. Spunea lucruri mici, dar cu o căldură atât de comunicativă, că lumea pleca acasă cu impresia că auzise ceva important și nu-și mai amintea bine ce anume. Arta lui era tocmai asta: să lase în urmă un sentiment fără un conținut.

— Noi suntem cu oamenii! declara el, cu mâna la piept, de parcă alternativa ar fi fost să fie cu peștii sau cu mineralele.

Pălărioara îl contrazicea permanent, dar Nelu nu observase. Sau observase și hotărâse că e mai bine să n-o știe.

Cele trei pălării. Imagine generată aleator de AI pe baza textului. Orice asemănare cu personaje reale este pur întâmplătoare.

Într-o dimineață, din mijlocul turmei, ieși o mioară. Nu orice mioară, una din acelea cu privire fixă și cu obiceiul incomod de a pune întrebări la care nu te aștepți.

Se opri în fața celor trei și-i privi pe rând, cu acea răbdare a celui care a văzut destule și nu mai e grăbit să vadă și restul.

— Bună dimineața, zise ea. Am o întrebare.

— Poftim? făcu Costică, ridicând borul cu gestul omului pregătit să acorde un interviu.

— Aveți pălării frumoase, zise mioara. Dar sub pălăriile acestea… ce-aveți?

Tăcere.

Costică zâmbi larg, zâmbetul lui de rezervă, cel cu treizeci și doi de dinți și fără ochi:

— Avem experiență, draga mea.

— Avem competență, completă Grigore, scurt și final.

— Avem inimă, adăugă Nelu, punând din nou mâna la piept, de data asta și pe cea stângă, ca să nu fie dubii.

Mioara dădu din cap ușor.

— Înțeleg. Și pălăriile… le-ați ales singuri?

— Alegătorii ni le-au dat, zise Costică.

— Meritele mi-au adus-o, zise Grigore.

— A venit de la sine, zise Nelu, cu modestia aceea care costă mult la producție.

— Curios, zise mioara. Toate trei par cam nepotrivite.

Se lăsă din nou o tăcere grea.

— Cum adică nepotrivite? zise Costică, cu glasul aceluia care simte că urmează să fie jignit instituțional.

— Pălăria ta, explică mioara cu blândețea unui medic care comunică un diagnostic, e atât de mare, că te umbrește fix când ar trebui să vezi. Ai purtat-o atâta, că ai început să crezi că umbra ei e orizontul.

Costică deschise gura. O închise. O redeschise:

— Asta e o interpretare.

— A ta, spune ea, e o pălărie. A mea e o observație. Continuăm?

Grigore tuși scurt, semn că urmează o intervenție de principiu:

— În cazul meu, pălăria e perfect potrivită.

— Da, e perfect potrivită pentru capul tău de acum, zise mioara. Problema e că al omului cap mai crește. Al tău pare că a uitat.

Grigore nu răspunse. Oamenii cu pălării strâmte nu răspund, emit comunicate.

Rămase Nelu, care zâmbea deja preventiv:

— Și a mea?

Mioara îl privi cu o tristețe politicoasă:

— A ta e atât de mică, Nelule, că pare pusă acolo nu ca să te apere de ceva, ci ca să te facă recognoscibil în fotografii.

Nelu zâmbi în continuare. Era specialitatea lui: să zâmbească inclusiv când nu pricepea că e vorba de el.

De după deal, veni în goană un al patrulea personaj, Simică, nou-apărut pe scenă, proaspăt coborât dintr-o mașină mare, cu telefonul în mână dar fără o biografie verificabilă.

— Bună ziua la toată lumea! anunță el, de parcă ziua fusese rea până la sosirea lui. Am auzit că se împart pălării!

— Nu se împart pălării, zise mioara.

— Nu? Păcat. Oricum, eu vreau una. Ceva… reprezentativ. Ceva care să transmită un mesaj.

— Ce mesaj? îl întrebă mioara.

Simică se gândi o secundă și jumătate, tot atât cât îi lua de obicei să ia decizii:

— Că sunt omul potrivit.

— Potrivit pentru ce?

— Pentru… context, zise el, cu aerul celui care a folosit cuvântul corect.

Mioara îl privi lung.

— Înainte să-ți alegi pălăria, poate ar fi util să știi ce vrei să acoperi cu ea.

Simică o privi și el, mai puțin lung:

— Capul, evident.

— Evident, zise mioara, și se întoarse spre turmă.

Simică rămase o clipă, căută din priviri o cameră care să-l filmeze, nu găsi niciuna și plecă în direcția din care venise, convins că momentul fusese, totuși, unul de referință.

Seara, cele patru pălării fură așezate pe gard, trei ale păstorilor, una lipsă uitată de Simică în grabă.

Cea dintâi acoperea aproape toată șipca, umbrind inclusiv cuiele.

Cea de-a doua stătea dreaptă ca la defilare, gata să fie inspectat gardul.

Cea de-a treia era aproape invizibilă de la distanță, ceea ce nu o împiedica să fie fotografiată.

Cea de-a patra, care nu exista de fapt, era nouă-nouță, fără o urmă de uzură, fără un semn că ar fi stat vreodată pe un cap care gândise ceva.

Mioara le privi îndelung.

Undeva, departe, se auzea glasul lui Simică strigând că a uitat ceva.

— Știu, ai uitat ce n-ai avut, zise mioara, numai pentru iarbă și pentru stele și pentru cine mai are urechi în ziua de azi.

Și se întoarse la celelalte oi, care aveau și ele problemele lor, dar cel puțin nu purtau pălării.

Se zice, prin locurile acelea, că pălăriile n-au schimbat nimic. Oamenii le-au luat de pe gard dimineața și și-au continuat drumul ca înainte. Singura diferență e că mioara nu mai ieșea să întrebe nimic.

Nu din lipsă de întrebări. Ci fiindcă găsise că unele răspunsuri sunt mai clare dacă nu le mai ceri nimănui.

Blog la WordPress.com.

SUS ↑