Modelleerpatronen (3): Niet-groeiende objectbomen

 
29 mei 2011

Titel: Niet-groeiende objectbomen

Doel: Door je objectengraaf die je model representeert in het geheugen uit een vast – niet te groot – aantal objecten te laten bestaan kan een model volledig in het werkgeheugen geladen worden zodat er geen continue prestatieverliezen zijn door laden- en wegschrijven uit een database. Meer real-time achtige verwerking (voor o.a. monitoringapplicaties) door een domeinmodel is dan mogelijk. Dit impliceert een andere manier van modelleren dan we normaliter gewend zijn: je moet je model eigenlijk helemaal los zien van data (nieuwe gegevens impliceren geen nieuwe objecten in je model).

Motivatie: Veel kantoorautomatiseringsapplicaties worden opgebouwd in een meerlaagsmodel waarbij er een businesslogica-laag of domeinmodel tussen UI- en datacomponent gezet wordt. Vaak wordt in deze tussenlaag een rechtstreekse mapping gemaakt van één object naar één of een aantal records in de database met behulp van een O/R mapper zoals bijvoorbeeld (N)Hibernate. Deze metafoor werkt goed voor meer CRUD georiënteerde applicaties maar is voor applicaties waarbij performance een belangrijke rol speelt niet de meest handige oplossing. Als we denken aan applicaties die bijvoorbeeld grote hoeveelheden events vanuit een besturing of aantal sensoren moeten verwerken is het raadzaam dit patroon toe te passen.

Toepasbaarheid: Applicaties die real-time veel gegevens moeten verwerken en de state van een bepaalde situatie (denk aan berekening van sliding gemiddelden bijvoorbeeld) moeten kunnen weergeven.

Voorbeeld Voor een klantorganisatie hebben we afgelopen jaar een applicatie op deze manier ontwikkeld. Het betreft een monitoring- en besturingsapplicatie die veel berichten vanuit diverse hardwarecomponenten real-time moet kunnen tonen en verwerken. Hierbij is het concept van de berichten volledig losgekoppeld van het domeinmodel. Het model bestaat slechts uit de machine en sensorenconfiguratie in de fabriek. Door al deze objecten in het geheugen te laden bij de ‘boot’ van het systeem kan verwerking van berichten door de logica in deze objecten ontzettend snel en schaalbaar plaatsvinden. De berichtenstroom gaat door het model en van daaruit kunnen weer nieuwe berichten genereerd worden.

De mapping van classes naar ‘real-world’ concepten gaat in deze manier van modelleren dus vrij letterlijk op. Een database onder je domain model component is hier eigenlijk ook niet meer nodig (slechts als je toch verzekerd wilt zijn van ACID persistency, hetgeen toch vaak wel fijn is).

Gerelateerd aan CQS principe. CQRS van Greg Young werkt soortgelijk. De stap die echter in dat patroon vaak vergeten wordt is de manier van niet-groeiend modelleren.


Werken met ?
Kijk dan bij onze mogelijkheden voor zowel starters als ervaren engineers.


Categorieën: Development


Reacties (2)

  • Peter M. schreef:

    Gaat het om een andere manier van modelleren die de bestaande manier vervangt? Of baseer je het model nog steeds puur op de data, en maak je daarnaast specifieke views op dit model die bruikbaar zijn in zulke situaties?

    Ik denk dat als je zo’n model/view goed definieert en de integriteit ervan kunt garanderen (bijv. de gegevens voor een sliding gemiddelde up-to-date houden), dat het een elegante manier van optimalisatie is. Ik vraag me echter af of je hiervoor het “echte” datamodel (dat een laagje dieper ligt) niet gewoon intact zou kunnen laten.

    Geplaatst op 30 mei 2011 om 8:12 Permalink

    • Peter,

      Wat ik bedoel is het volledig los zien van je datamodel en je domeinmodel. Je domeinmodel zou direct de werkelijkheid die je wilt simuleren moeten weerspiegelen, dus alleen die objecten bevatten die ook daadwerkelijk in de te monoitoren omgeving bestaan. Denk aan een fabriekshal met een redelijk eindige set machines.

      Artificiële objecten zoals ‘metingen’, ‘events’ of anderssoortige bedachte entiteiten komen in dit model niet voor, maar worden er wel doorheen verwerkt. Vevolgens kan aan dit model wel een database (of zelfs meerdere) gekoppeld worden voor bijvoorbeeld rapportage, logging of andere meer data-georiënteerde aspecten.

      Geplaatst op 18 juli 2011 om 20:51 Permalink