gora.
Last-mile Delivery Platform

Perkėlimas nuo svetimos platformos

Ankstesnis rangovas neatidavė projekto. Kaip pasiėmiau parduotuvės duomenis per jos skydelį ir perkėliau pardavimus be nė vienos prastovos dienos.

~4 min skaityti · 880 žodžių

TL;DR

Last-mile Delivery Platform perkėlimas — tai veikiančios pristatymo parduotuvės perkėlimas iš ankstesnio rangovo platformos į mano, atliktas be jo dalyvavimo. Atiduoti projekto jis nenorėjo: kartu su projektu jis prarastų mokestį už priežiūrą. Parduotuvė turėjo tik savo administravimo skydelį, ir per to skydelio API kas valandą kopijavau duomenis į savo duomenų bazę. Perkėlimas vyko dalimis, prieš kiekvieną žingsnį darant atsarginę kopiją. Ankstesnė platforma paskutinį užsakymą priėmė 2026 m. sausio 24 d., o 25 d. užsakymai jau ėjo į naująją. Kopija pasirodė pilnesnė už originalą: joje išliko 13 užsakymų, kuriuos senoji sistema pas save ištrynė.

Nuo ko viskas prasidėjo

2025 m. gruodį parduotuvė veikė kito kūrėjo platformoje. Svetainė, administravimo skydelis, duomenų bazė ir kodas buvo pas jį, o parduotuvė mokėjo už priežiūrą. Kai parduotuvė nusprendė pereiti į savo platformą, rangovas projekto neatidavė: nei duomenų bazės eksporto, nei kodo.

Tokia situacija pažįstama daugeliui. Rangovas, kurio priežiūroje yra parduotuvė, atidavęs projektą praranda pinigus, todėl neskuba. O verslo savininkas tuo metu neturi nei duomenų bazės, nei kodo, tik prisijungimą prie administravimo skydelio.

Kas buvo rankose

Tik parduotuvės administravimo skydelis. Jis veikė per API, ir viską, ką matė administratorius, tas API ir grąžino: užsakymus, pirkėjus, prekes, vairuotojus, nuolaidų kodus, ataskaitas. Tai pačios parduotuvės duomenys, ir paimti juos buvo galima ta pačia prieiga, su kuria parduotuvė dirbo.

Surinkiklis: šviežia kopija kas valandą

Pirmiausia parašiau surinkiklį. Kas valandą jis pereidavo per skydelio API ir viską sudėdavo į savo PostgreSQL duomenų bazę. Perėjimas vyko penkiais etapais: užsakymai, pinigai, operaciniai duomenys, žinynai, piniginės. Užsakymai buvo užklausiami laiko langais metus atgal. Į kopiją pateko užsakymai su visa būsenų istorija, pirkėjai ir jų piniginės, prekės su variantais, prekių ženklai, kategorijos, vairuotojai, dispečeriai, nuolaidų kodai, pristatymo rajonai ir laiko intervalai, iš viso 30 lentelių. Visas perėjimas užtrukdavo apie minutę.

Kopija, kuri atsinaujina pati, davė du dalykus. Parduotuvės duomenys nebepriklausė nuo rangovo geros valios: jei jis būtų uždaręs prieigą, parduotuvei būtų likusi ne senesnė nei valandos kopija. Be to, ji pasirodė pilnesnė už originalą: 13 užsakymų, kuriuos ankstesnė sistema pas save ištrynė, kopijoje išliko.

Perkėlimo planas

Dviejų sistemų schemos nesutapo beveik niekuo. Senojoje ID buvo skaičiai, naujojoje — UUID. Būsenos, mokėjimo būdai ir pristatymo tipai vadinosi skirtingai. Dalies prekės laukų naujojoje schemoje apskritai nebuvo. Todėl prieš perkėlimą užrašiau planą:

  • ID verčiami per atitikmenų lentelę „senas ID → naujas UUID“: ryšiai tarp įrašų nenutrūksta, ir bet kurį žingsnį galima paleisti iš naujo.
  • Lentelės keliamos nuo žinynų iki užsakymų: parduotuvės, kategorijos, prekių ženklai, prekės, pirkėjai, darbuotojai, zonos, laiko intervalai, nuolaidų kodai, užsakymai, piniginės, baneriai. Kiekviena kita nurodo tik į jau perkeltas.
  • Septynios senosios sistemos būsenos suvedamos į šešias naujas: „pateiktas“ tampa „laukia“, „paruoštas“ ir „paskirtas“ — „patvirtintas“, „priimtas vairuotojo“ — „paskirtas“, „kelyje“ — „paimtas“, „įvykdytas“ — „pristatytas“, „atšauktas“ taip ir lieka.
  • Pirkėjai sutapatinami pagal telefono numerį, suvestą į vieną formatą, o kur telefono nėra — pagal vardą.
  • Naujoji schema gauna 20 prekės laukų, kurie buvo tik senojoje: 13 pačios prekės ir 7 varianto.
  • Kiekvienas žingsnis suderinamas su tuo, kas jau veikia, ir prieš kiekvieną žingsnį daroma naujos duomenų bazės kopija.

Kas nepavyko

Bandomojo įkėlimo metu užsakymų eilutės padvigubėjo: kiekviena į naują duomenų bazę pateko 18 kartų. Taisyti jų po vieną nepradėjau. Ištryniau visas eilutes ir iš naujo įkėliau jas iš kopijos vienu kartu, nes tokio žingsnio rezultatą lengviau sutikrinti su šaltiniu.

Prekės buvo sutapatinamos pagal pavadinimą: sutapo 133 prekės iš 133 ir 402 variantai iš 427. Senojoje sistemoje prekių buvo 139, naujojoje — 133. Skirtumą sudarė trys dublikatai ir trys bandomosios prekės, tikrų prekių abiejose pusėse buvo tiek pat.

Perjungimas be nė vienos prastovos dienos

Kol vyko perkėlimas, senoji platforma toliau priėmė užsakymus, o surinkiklis toliau kas valandą darė kopiją. Didysis paleidimas įvyko sausio 22 d., vėlesnių dienų užsakymai į naują duomenų bazę atkeliavo paskui. Sausio 24 d. senoji platforma priėmė paskutinį užsakymą, o 25 d. pirmasis užsakymas atėjo jau į naująją. Pirkėjų istorija, jų piniginių likučiai ir ankstesni užsakymai persikėlė kartu su jais.

Kas gavosi

  • Nė vienos dienos be užsakymų: paskutinis užsakymas senojoje sistemoje — sausio 24 d., pirmasis naujojoje — 25 d.
  • Naujoje duomenų bazėje gyvuoja ankstesnės platformos istorija: 64 pristatyti užsakymai su būsenomis, pirkėjai, jų piniginės.
  • Išsaugoti 13 užsakymų, kuriuos senoji sistema ištrynė.
  • Po aštuonių mėnesių naujoje platformoje parduotuvė per rugsėjį pristatė 1 035 užsakymus. Kaip tai vyko, pasakojama projekto istorijoje.

Jei esate tokioje pat situacijoje

Ką tikrinčiau pirmiausia:

  1. Ką turite dabar: prieigą prie administravimo skydelio, duomenų bazės, talpinimo, domeno. Domenas ir talpinimo paskyros turi būti užregistruoti jūsų, o ne rangovo vardu.
  2. Pradėkite nuo kopijos. Reguliarus visko, ką grąžina jūsų skydelis, eksportas į jums priklausančią duomenų bazę yra apsauga dar prieš sprendimą keltis.
  3. Sutikrinkite kopiją su originalu pagal užsakymų ir pirkėjų skaičių. Jei kas nors dingsta pas rangovą, jūs tai jau turite.
  4. Prieš perkėlimą užrašykite ID ir būsenų atitikmenų lentelę, lentelių tvarką ir taisyklę „duomenų bazės kopija prieš kiekvieną žingsnį“.
  5. Persijunkite tada, kai nauja sistema jau priėmė perkeltus duomenis, o surinkiklis dar veikia: paskutinių dienų užsakymai atkeliaus paskui.

Ko šis perkėlimas nedarė

  • Ankstesnės platformos kodas nebuvo perkeltas: naujoji parašyta nuo nulio.
  • Duomenys imti tik pačios parduotuvės prieiga, be svetimų prisijungimų ir be prieigos prie rangovo serverių.

Nuorodos