FallstudieLastmile Leverans

Från utvecklarresurs till API-driven leveransplattform.

Urb-it kopplar e-handlares plattformar till same-day-leverans i city. Under två år gick uppdraget från ren utvecklarresurs till nära samarbete med produktägare — och verksamheten ställdes om mot öppna API:er och checkout-widgets som låter externa partners koppla på Urb-it Delivery som leveransalternativ.

KundUrb-it
Periodaug 2016 – maj 2018
RollerFullstack, DevOps
01 / Problem

Leveranslogiken satt inuti produkten — inte framför partnern.

Same-day-leverans i city är ett realtidsproblem: order, bud, ruttning och kundlöfte måste hålla ihop under samma timme. Urb-its tillväxt låg däremot i att bli ett leveransalternativ hos andras e-handel — och då räcker det inte att logiken fungerar internt. Den måste gå att koppla på utifrån, i checkout, av en partner utan tillgång till teamet.

Samtidigt fanns en fungerande Azure-plattform med reell affärslogik i sig. Att skriva om allt hade varit att kasta bort investeringar för att vinna skalbarhet. Frågan var inte ”monolit eller mikrotjänster” utan: var måste vi vara snabba och externt exponerade, och vad ska stå still?

BegränsningExterna partners behövde egna, dokumenterade API:er — inte interna endpoints.
BegränsningBefintlig Azure-plattform skulle behållas och integreras, inte ersättas.
BegränsningRealtidsflöden krävde spårbar händelsehistorik, inte bara aktuellt tillstånd.
02 / Angreppssätt

Små team, multi-cloud, en tydlig ytterkant.

Arbetet realiserades i små självorganiserade innovationsteam tillsammans med produktägare: mikrotjänster i Kubernetes på AWS för det som ska exponeras och skala, integrerade mot den befintliga Azure-plattformen via Azure Service Bus och AMQP.

aug 2016Utvecklarresurs i befintligt flödeIn i teamet på kundens villkor: PHP7/Laravel och .NET Core i drift, buggar och funktioner i produktionens takt. Förtroende före arkitekturförslag.
2017Nära produktägarskapetUppdraget växte till samarbete med produktägare kring vad plattformen skulle bli — API:er och checkout-widgets som affärsmodell, inte som teknisk detalj.
2017Mikrotjänster i innovationsteamSmå självorganiserade team byggde tjänster i Python/Flask och Node-nära lager bakom OpenResty/Nginx, containeriserat med Docker och kört i Kubernetes på AWS.
2017 – 2018Multi-cloud-integration och driftAWS-tjänsterna integrerades mot den befintliga Azure-plattformen över Azure Service Bus och AMQP/RabbitMQ, med Loggly och New Relic som gemensam insyn.
Principen
Vi behåller värdet av tidigare investeringar och får skalbarheten som krävs i externt exponerade API:er.
03 / Arkitektur

Fyra beslut som bar resten.

BeslutVarförKonsekvens
Kubernetes på AWSExternt exponerade API:er behövde egen skalning och release-takt, oberoende av den äldre plattformen.Team kunde deploya sin egen tjänst utan att koordinera hela systemet.
Multi-cloud mot AzureDen befintliga plattformen innehöll fungerande affärslogik som inte skulle skrivas om.Tidigare investeringar behölls; integrationen blev en tydlig gräns istället för en migrering.
CQRS + Event SourcingRealtidsleverans kräver historik: vad hände med ordern, i vilken ordning, och varför.Spårbarhet per händelse och läsmodeller anpassade för widget och partner-API.
OpenResty/Nginx + Lua i kantenEn gemensam ytterkant för routing, auth och throttling framför många små tjänster.Partners möter ett stabilt API-kontrakt även när tjänsterna bakom byts ut.
04 / Utfall

Vad som faktiskt förändrades.

Partnerintegrationer— antal —E-handlare som kopplat på Urb-it Delivery via widget eller API.
Städer i drift— antal —Marknader plattformen körde same-day-leverans i vid uppdragets slut.
Releasefrekvens— per vecka —Deploys innan mikrotjänsterna jämfört med efter.
Ordervolym— per månad —Volym som passerade det nya leveransflödet.
Streckade rutor saknar verifierad siffra — inga uppskattningar publiceras.

Kvalitativt är utfallet tydligt: Urb-it Delivery gick från att vara en egen produktupplevelse till en tjänst andra kunde bygga på, via checkout-widgets och öppna API:er. Leveransflödet blev spårbart händelse för händelse istället för bara ett aktuellt orderläge — vilket är skillnaden mellan att gissa och att kunna svara kunden.

05 / Teknik

32 tekniker, grupperade.

Plattform & driftDockerKubernetesAWSCoreOSAlpineLinuxGit
Tjänster & språkPythonFlaskGunicornPHP7LaravelLumen.NET CoreLua
Kant & frontendOpenRestyNginxReactAngular
Data & meddelandenMongoDBPostgreSQLRedisRabbitMQAMQPAzure Service Bus
Mönster & insynMicroservicesCQRSEvent SourcingLogglyNew Relic
Säg hej

Har du ett problem värt att lösa?

Chatta med oss på WhatsApp. Vi svarar inom 48 timmar.