Het bedrijf moest een complexe migratie voltooien binnen een krappe deadline om miljoenen dollars aan post-contractkosten en boetes te vermijden.
Overgang van Python naar Golang voor eBike App-ontwikkeling

Onze klant is een gerenommeerde leverancier van technologische oplossingen met een sterke aanwezigheid in meerdere sectoren. Om zijn concurrentievoordeel te behouden en innovatie te stimuleren, is de klant voortdurend op zoek naar zijn digitale oplossingen te optimaliseren.
Deze keer zocht de klant op zoek naar een oplossing voor zijn eBike-applicatie, die te maken had met aanzienlijke uitdagingen op het gebied van prestaties en schaalbaarheid. Vanwege deze beperkingen met zijn bestaande systeem wilde de klant de architectuur te moderniseren door over te stappen van een oude Python-gebaseerde applicatie naar een moderne, microservices-gebaseerde Golang-oplossing. Deze overgang was gericht op het verbeteren van de bruikbaarheid, het verlagen van de operationele kosten en het verbeteren van de prestaties om toekomstige groei en innovatie te ondersteunen.
De uitdagingen
Uitdagingen voor de app van de klant
- Lange laadtijden: De trage prestaties van de app zorgden voor een suboptimale gebruikerservaring.
- Hoge kosten: Het onderhouden en opschalen van de Python-gebaseerde applicatie kostte veel middelen.
- Beperkte schaalbaarheid: De monolithische structuur beperkte het aanpassingsvermogen van de app aan veranderende behoeften.
Ontwikkelingsuitdagingen
Het team werd tijdens het ontwikkelingsproces geconfronteerd met verschillende obstakels. Ten eerste, het gebrek aan documentatie voor de bestaande Python-app uitgebreide reverse engineering nodig om de functionaliteit te begrijpen en te repliceren. Daarnaast, het beheer van gedistribueerde gegevens over microservices uitdagingen bij het handhaven van consistentie, omdat elke service zijn eigen database had. Het bereiken van uiteindelijke consistentie tussen services zorgde voor extra complexiteit en vereiste een zorgvuldig ontwerp om ervoor te zorgen dat alle systemen na verloop van tijd synchroon bleven.
Het coördineren van gedistribueerde transacties Het coördineren van gedistribueerde transacties over meerdere services was een andere hindernis, omdat storingen in één service de hele workflow konden verstoren. Om gegevensafwijkingen te voorkomen, moest het team mechanismen implementeren voor idempotency, zodat dubbele gebeurtenissen de integriteit van het systeem niet aantasten. Tot slot, warenrobuuste monitoring- en retry-mechanismen essentieel om storingen in de communicatie tussen diensten aan te pakken, zodat de nieuwe architectuur betrouwbaar en veerkrachtig is.

Geleverde oplossingen
De app werd omgebouwd van een monolithische Python-applicatie naar een op microservices gebaseerde architectuur met Golang. Deze herstructurering verbeterde de prestaties en schaalbaarheid terwijl het onderhoud werd vereenvoudigd.
Opsplitsing microservices
- Gebruikersdienst: Behandelt profielen, verificatie en gebruikersvoorkeuren.
- Ritregistratiedienst: Registreert ritgegevens zoals routes en duur.
- Navigatiedienst: Biedt routeplanning en begeleiding.
- Fitnessdienst: Traceert en analyseert fitnessgegevens van gebruikers.
- Beveiligingsservice: Omvat functies zoals de functie 'Vergrendelen', die motorondersteuning uitschakelt om diefstal tegen te gaan.
Communicatie tussen diensten
gRPC: Zorgt voor efficiënte communicatie met lage latentie tussen microservices. Wanneer bijvoorbeeld een rit is voltooid, gebruikt de ritopsporingsservice gRPC om de fitnessservice op de hoogte te stellen om de statistieken bij te werken.
Uitdagingen voor gegevens aanpakken
Het team pakte de uitdagingen op het gebied van gegevens aan door een gebeurtenisgestuurde architectuur, waarbij diensten gebeurtenissen publiceerden aan een berichtenmakelaar, waardoor geabonneerde diensten gegevens in realtime konden bijwerken en consistentie konden behouden. Uiteindelijk consistentiemodellen zorgden voor synchronisatie tussen services in de loop van de tijd, met idempotente operaties voorkomen van verstoringen door dubbele verwerking van gebeurtenissen.
Om gedistribueerde transacties te verwerken, werd het Saga patroon gebruikt, waarbij lokale transacties worden gecoördineerd met compenserende acties om de gegevensintegriteit te behouden in het geval van storingen. Bovendien werden idempotency mechanismen ontworpen om dubbele gebeurtenissen te beherenen robuuste monitoringtools zoals Prometheus, Grafana en Kibana werden geïntegreerd naast automatische retries met exponentiële backoff om betrouwbaarheid en naadloze communicatie tussen services.
Voorbeeldstroom: gebruiker voltooit een rit
- De ritopsporingsdienst registreert de ritgegevens en publiceert een gebeurtenis "Rit voltooid".
- De Fitness Service, die op deze gebeurtenis is geabonneerd, werkt de fitnessgegevens van de gebruiker bij.
- De Navigation Service werkt de routeaanbevelingen bij op basis van de nieuwe gegevens.
- De gebruikersdienst werkt de ritgeschiedenis van de gebruiker bij.
Door gebruik te maken van een event-driven architectuur met gRPC voor inter-service communicatie, kan het eBike Connect-platform schaalbaarheid en gegevensconsistentie tussen de microservices.
Technologie Stapel
Golang, Python, Prometheus, Grafana, Kibana, Kubernetes voor het beheren van microservices, AWS.
Teamsamenstelling
Python-ontwikkelaar, Golang-ontwikkelaar, producteigenaar (PO) en QA-ingenieur