---
title: "In multidimensjonale kapasiteitswachtrige ûntwerpe"
date: 2020-12-02
language: fy
topics: ["data", "ecommerce", "lemmid-store", "payments", "server", "work"]
source_url: https://willem.com/fy/2020-12-02_in-multidimensjonale-kapasiteitswachtrige-untwerpe/
---
# In multidimensjonale kapasiteitswachtrige ûntwerpe

*Keuken-, leverings- en ôfhelkapasiteit beheare*

> Dizze moanne moast ik ekstra dimensjes tafoegje oan in kapasiteitswachtrigemeganisme. De app foar itenbestellingen dy’t ik makke haw, moast de kapasiteit beheine kinne op basis fan it oantal bestellingen, de ynhâld fan yndividuele bestellingen en it soarte ôflevering (ôfhelje/levering). Lês mei om te sjen hoe't ik dêrfoar in Lambda Architecture brûkt haw.

## Kapasiteit beheine

Hoewol't do dit miskien net beseffe, is ien fan de krêftichste funksjes fan de app_foar_itenbestellingen_dy't_ik_makke_haw (https://willem.com/blog/lemmid-store/) eins de mooglikheid om it oantal bestellingen te beheinen. Dat klinkt kontra-yntuïtyf, mar troch it oantal bestellingen dat pleatst wurde kin te beheinen, kinne myn klanten (de restaurants en winkeleigners dy't myn app brûke) derfoar soargje dat bestellingen goed taret en ôflevere wurde.

## Kompleksiteit fan trije pizza's

Sis dat do trije pizza’s bestelle wolst. De iten-app moat dan witte:

- Wolst do se **ôfhelje** of **bringe litte**?

- Op **hokker tiid?** wannear moatte se de oven yn?

- Is der **genôch romte** foar *trije* pizza’s **yn de oven** *op dat momint*?

- As do kieze hast foar ôfhelje: **kinne wy dy op dat momint feilich ûntfange**?

- As do kieze hast foar levering: **is der in leveringsjonge of -faam beskikber** om dyn pizza’s by dy te bringen? 

- **Ja op alles?** Dan **betelje asjebleaft** wylst wy **dyn pizza’s ynplanne hâlde** yn de oven en by levering of ôfhelje. Net betelle? Twadde gedachten? Dan meitsje wy alle planning "ûngedien" en wachtsje wy op immen oars dy't pizza's bestelle wol! 

![Pizza ite by de ûntwikkeling is hoe't do it algoritme "libbest"](https://willem.com/global/images/e9229d524bd1.webp)

## Trije kapasiteitsdimensjes

Benammen om itenstiid hinne is der gefaar dat te folle minsken tagelyk iten bestelle. Hoewol't de app de ekstra drokte oan kin troch syn tige_skaalbere_arsjitektuer (https://willem.com/en/2020-05-11_scalable-application-design-without-magic/), bliuwe fysike beheiningen bestean, lykas:

- **keukenkapasiteit**: it oantal gerjochten dat do tagelyk klearmeitsje kinst

- **ôfhelkapasiteit**: it oantal minsken dat do tagelyk feilich ûntfange kinst mei it each op de COVID-19-beheiningen

- **leveringskapasiteit**: it oantal bestellingen dat do leverje kinst, rekken hâldend mei ferkear, ôfstân en rûte

![Trije kapasiteitsbeheiningen: keuken / levering / ôfhelje](https://willem.com/global/images/db564dd30d9f.webp)

### Ûnderskieden mar ûnderling ôfhinklik

Dizze trije ferskillende soarten beheiningen binne ûnderling ôfhinklik. It is bygelyks mooglik dat ien grutte ôfhelbestelling alle keukenkapasiteit ynnimt, wat ek ta net-beskikberens foar levering liedt. Lytsere bestellingen koene noch akseptearre wurde om keukenkapasiteit te foljen, wylst der miskien gjin kapasiteit mear is foar grutte bestellingen. Dat betsjut dat do in meganisme nedich hast dat nei *alle* metriken tegearre sjocht om de beskikberens foar nije bestellingen te bepalen, ynklusyf de ynhâld fan in noch net pleatste bestelling (bygelyks wat yn dyn winkelwein sit).

### Ferskillen yn tiidspanne-granulariteit

It is gewoan om in fysike beheining te definiearjen mei in tiidspanne, bygelyks *"de keuken kin 10 gerjochten per 15 minuten produsearje"*. It wurdt útdaagjend as do oare fysike beheiningen definiearrest mei oare tiidspannelingten. Wylst de keuken beheind wurde kin per 15 minuten, kin de leveringskapasiteit in langere tiidspanne brûke (bygelyks 3 leveringen per 30 minuten). It meganisme moat op ien of oare manier mei dizze ferskillen yn tiidspanne-granulariteit omgean kinne.

### Yn it foar bestelle

Wat it noch útdaagjender makket is de opsje foar minsken om harren bestellingen yn it foar te pleatsen. Minsken kinne in tiidslot yn de takomst kieze en de ferplichte kapasiteit reservearje litte. Soms sjoch ik minsken har bestelling dagen yn it foar pleatse om wis te wêzen dat se har iten op in bepaalde dei en tiid krije. Dat betsjut dat der (op syn minst) twa tiden by elke bestelling hearre: bestelmomint en leveringsmomint.

### Kapasiteit reservearje en frijjaan

De measte bedriuwseigners fereaskje online betellingen foar online bestellingen, om wis te wêzen dat alle bestellingen echt binne en dat der gjin kapasiteit (of iten) fergriemd wurdt oan no-shows of spoekbestellingen. It probleem_mei_online_betellingen (https://willem.com/en/2020-03-25_designing-and-implementing-a-micro-payment-system/) is dat net alle transaksjes slagje. Soms wurdt in kredyt- of debitbetelling wegere (bygelyks troch te min saldo). Soms slute minsken de app gewoan foardat se de bestelling ôfmeitsje. It systeem moat de ferplichte kapasiteit foar in bestelling reservearje wylst it minsken de online betelling dwaan lit, en it moat de reservearre kapasiteit frijjaan as de bestelling ferlitten wurdt of de betelling mislearret.

### Heech folume, heech tempo

Lêst mar net it minst moat it meganisme betrouber en fluch wêze. De beskikberens fan bestellingen moat binnen in pear millisekonden bepaald wurde, wylst der swiere parallelle belêsting is, want der binne yn de spits in protte ferskillende brûkers ferbûn mei de app. As immen in bestelling pleatst, beynfloedet dat de beskikberens foar alle oare (mooglike) bestellingen. Net elkenien is betrouber ferbûn, want guon minsken brûke de app op tillefoans mei min ûntfangst of wifi. It systeem moat goed wurkje ûnder wikseljende omstannichheden mei in protte ferskillende ferbûne minsken.

## Lambda Architecture

De Lambda_Architecture (https://en.wikipedia.org/wiki/Lambda_architecture) is ien manier om grutte hoemannichten gegevens te ferwurkjen troch sawol streamferwurking as batchferwurking te brûken. In lambda-arsjitektuer is ôfhinklik fan in gegevensmodel mei in allinnich-tafoegje, ûnferoarlike gegevensboarne, faak bestean út tiidstimpele barrens.

### Ûnferoarlike gegevens

Dit is in tige wichtige basis foar it meganisme: alle gegevens binne tiidstimpele en feroarje *nea*. Yn stee fan besteande records te feroarjen, wurde nije records gewoan tafoege om de besteande te oerskriuwen. Dat makket hege parallelle ferwurking en ferdielde algoritmen mooglik, want syngronisaasje wurdt ienfâldiger omdat do allinnich nei nije gegevens sykje hoechst (yn stee fan nije en bywurke!).

### Realtime / fluggenslaach

De streamferwurking, of realtime-/fluggenslaach, yn in lambda-arsjitektuer is ûntworpen om supersnelle antwurden te jaan op realtime gegevensbehoeften. It ûnderhâldt werjeften en metriken basearre op realtime ferwurking fan barrens.

### Foarberekkeningslaach

De batchferwurking, of foarberekkeningslaach, jout in folsleine en krekte basis fan alle gegevens yn it systeem. Om't it ferwurkjen fan grutte hoemannichten gegevens tiid kostje kin, is de batchferwurking net fluch genôch om alles daliks te dwaan. Dêrom wurkje de twa lagen yn in lambda-arsjitektuer gear.

## Ymplemintaasje

De backendservers dy't itenbestellingen fan de app ôfhannelje, wurkje mei in gegevensstream fan tiidstimpele barrens. Yn essinsje: elke bestelling is in barren yn it systeem. Elke bestelling wurdt opslein mei syn bestel-datum/tiid, ferstjoer-datum/tiid (plande levering of ôfhelltiid), klantgegevens en bestelynhâld (oantal gerjochten, ensfh.).

### Kapasiteit reservearje en frijjaan

As de betelling mislearret of in bestelling ferlitten wurdt, wurdt der in "negative" bestelling tafoege oan de gegevensstream. Dy neutralisearret elk effekt op kapasiteitsbeheiningen troch syn negative metriken. Bygelyks: om in bestelling fan trije pizza’s te annulearjen, wurdt der in negative bestelling fan "min trije pizza’s" yn de gegevensstream makke mei deselde ferstjoer-tiidstimpel. Dit is in elegante manier om wis te wêzen dat kapasiteit sawol reservearre as frijjûn wurdt.

### Multidimensjonale realtime metriken

Yn stee fan kapasiteit yn tellers te abstrahearjen, brûkt de backendserver de *echte* streamgegevens om fragen nei realtime metriken te beäntwurdzjen. Dat makket it systeem by steat om te gean mei ferskillen yn tiidspanne-granulariteit.

![In barrenstream fan bestellingen is it hert fan it meganisme, fragen wurde beäntwurde troch nei dizze stream te sjen: hoefolle pizza's binne der om 18:00 oere klear?](https://willem.com/global/images/1e59e0b31de7.webp)

De earste kear dat der in fraach foar in bepaalde metryk ynkomt, laadt it systeem histoaryske gegevens fia in batchmeganisme om it model te inisjalisearjen dat it dan realtime bywurke hâlde kin. Dizze metryk wurdt bywurke hâlden troch nei alle nije bestellingen te sjen dy't yn it systeem komme, salang as der fragen foar in bepaalde metryk binne. Sadree't de gegevens net mear opfrege wurde, wurdt it model útlaad. As it wer nedich is, werhellet it proses him.

It geweldige oan dizze oanpak is dat de measte fragen binnen in pear millisekonden beäntwurde wurde, want se wurde direkt út RAM-ûnthâld lêzen sûnder databank- of skiifynteraksje. Dat makket ultrahege prestaasje mooglik op in "need to have"-basis. Dat wurket goed by de app foar itenbestellingen, want net *alle* tiidspannes binne like populêr.

De app foar itenbestellingen freget werhelle kearen in sintrale kapasiteitsserver dy't de wachtrigemetriken bywurket. Dy filteret dan de beskikbere tiidslots út troch te sjen nei de echte dingen dy't in persoan foar syn of har bestelling kiest. It kiezen fan in (wierskynlik) beskikber tiidslot bart dêrom oan de kant fan de brûker, wat de belêsting op de backend ferleget. Sadree't der in bestelling pleatst wurdt, reservearret de backend de kapasiteit troch de sintrale wachtrigemetriken by te wurkjen, sadat oare minsken net itselde plak yn de wachtrige claime kinne.

## Konklúzje

Wachtrigemeganismen kinne útdaagjend wêze as do mei meardere metriken te meitsjen hast dy't de fluggens bepale. Do moatst echt de tiid nimme om it goed te modellearjen, tink oan de soarte gegevens dy’t do *echt* nedich hast om wachtrige-relatearre kontrôles út te fieren.

No witst do dat it bestellen fan trije pizza’s net sa ienfâldich is! Garandearje dat se waarm en op tiid betsjinne wurde kinne is in grutte technyske útdaging - neist in goede kok wêze. Gelokkich foar dy dat *ik* my net op dat lêste rjochtsje, ha!
