Skip to content

Writing/AI

O sarcină AI lungă, pornită de pe telefon

Generarea unui clip durează minute, iar un telefon poate fi trimis în fundal, oprit sau lăsat fără semnal în oricare dintre ele. Așa că telefonul nu poate fi cel care ține sarcina.

ISIonuț Sandu30 iun 2026 · 8 min de cititAIFirebaseArhitectură

Construiesc de ceva vreme o aplicație care transformă un selfie și o descriere într-un scurt clip generat. Generarea durează minute, nu secunde, iar în minutele alea telefonul poate fi trimis în fundal, oprit de sistemul de operare, urcat în tren sau rămas fără baterie. Faptul ăsta singur decide toată arhitectura.

Varianta care nu funcționează e o cerere HTTP din aplicație către un endpoint de generare, așteptată. Merge perfect la demonstrație și eșuează constant, pentru că clientul e participantul cel mai puțin fiabil și tocmai l-ai făcut pe el să țină sarcina.

Baza de date e coada de sarcini

Așa că clientul face trei lucruri și pe urmă încetează să conteze: încarcă imaginea de start în storage, creează un document care descrie sarcina și se abonează la documentul acela. Un worker din backend preia sarcina, apelează furnizorul de generare și scrie progresul înapoi în același document.

“Telefonul e abonat la sarcină, niciodată proprietarul ei. Odată ce asta e adevărat, închiderea aplicației nu mai e un eveniment de tratat.”

Canalul de progres e o abonare la un document, nu o interogare repetată și nici un socket, ceea ce înseamnă că reconectarea e problema altcuiva. Închide aplicația în mijlocul generării, redeschide-o peste zece minute și în bibliotecă e un clip terminat, pentru că sarcina n-a depins niciodată de prezența aplicației. Nu s-a scris nicio logică de reluare ca să fie adevărat.

Anularea trebuie să însemne restituire

Generarea costă bani la fiecare rulare, așa că aplicația o contorizează. Asta face din anulare o operație financiară, nu una de interfață. Un buton de anulare care doar te duce în altă parte lasă workerul să ruleze, furnizorul să factureze și creditul utilizatorului cheltuit pe un clip pe care nu-l va vedea niciodată.

Așa că anularea marchează sarcina drept anulată, oprește workerul și restituie creditul în aceeași operație. Regula pe care aș aplica-o oriunde: dacă pornirea a ceva cheltuie o resursă, drumul de oprire trebuie scris la fel de atent ca drumul de pornire, iar de obicei e scris în jumătate din timp.

Anonim de la început și un mock pentru tot

Două decizii care au costat puțin și s-au plătit singure. Autentificarea e anonimă mai întâi, ca cineva să poată încerca lucrul înainte să i se ceară un cont, iar trecerea la cont păstrează ce a făcut deja, în loc să-l ia de la capăt.

Iar tot fluxul de generare are un mod simulat în spatele unei variabile de mediu. Munca de interfață, sincronizarea animațiilor și fiecare stare de eroare pot fi construite fără să cheltuiești un cent și fără să aștepți trei minute la fiecare încercare. Pe un produs a cărui acțiune principală e lentă și costă, asta nu e o comoditate pentru dezvoltator, e ce face posibilă iterarea pe interfață.

Ionuț Sandu — 30 iun 2026Copiază linkul

URMĂTORUL · 29 IUN 2026 · 10 MIN DE CITIT

Liquid Glass în React Native

Efectul nativ Apple pe iOS 26, o alternativă peste tot altundeva și cum faci o singură componentă să decidă care dintre ele.

Preiau proiecte noi

Spune-mi ce construiești.Un plan scris și un preț fix înainte să se miște vreun ban.

Răspund la tot într-o zi lucrătoare. Dacă nu sunt omul potrivit pentru proiect, ți-o spun din start, nu după trei săptămâni.