(nettipäiväkirja 28.01.2016) Luin tässä taas yhtä kirjoitusta (http://www.enterpriseintegrationpatterns.com/patterns/messaging/IntegrationStylesIntro.html), jossa rajapintaviestintää pidetään jotenkin "hienompana" (tällä kertaa more sophisticated) kuin jaettua tietokantaa. Molemmat ovat vastauksia ongelmaan: miten useampi ohjelma pystyy käyttämään samoja tietoja, niin ettei samoja tietoja tarvitse pitää yllä kahdessa paikassa. Mutta tiedon konsistenssista on huomattavasti helpompaa huolehtia yhdessä paikassa kuin useammassa, ja rajapinnoitse keskenään keskustelevien ohjelmien jatkokehitys ja testaaminen on usein sokkeloista, kun testiympäristöissä tarvitaan eri tavoin toisiinsa liitettyjä versioita näistä hajautetuista ohjelmaympäristöistä.
Niinpä ajattelin dokumentoida sellaisen integraatiorakenteen, joka on yksinkertaisuutensa vuoksi saavuttanut koko ajan lisää suosiota viime aikoina (ks. esim. Pycon Finland 2015, "Viestiloki sovelluksen pohjana"). Tässä rakenteessa pointti on se, että kaikille yhteistyötä tekeville ohjelmille (tai palveluille) on kaksi yhteistä tietovarastoa: tietokanta ja viestiloki. Tietokanta sisältää tiedon "vallitsevasta tilanteesta". Aina, kun jokin ohjelma haluaa tietää, miten jokin on, se kääntyy tietokannan puoleen ja lukee tiedon sieltä. Viestiloki taas sisältää tiedon "ajankohtaisista tapahtumista". Aina, kun jokin ohjelma haluaa tietää, mitä kaikkea uutta on tapahtunut, se lukee viestilokista uudet viestit. (Viestilokin ja tietokannan voi toki toteuttaa rajapintapalveluina, jos haluaa niille toteutusriippumattoman rajapinnan.)
Näiden kahden keskeisen palvelun suhde on se, että tietokantapäivitykset ovat tapahtumia ja niinpä on oltava ainakin yksi palvelu, joka lukee tietokantapäivityksiä viestilokista ja toteuttaa ne tietokantaan. Voi vielä tehdä niin, että sama palvelu sitten tiedottaa, että tietty muutos on tehty, niin tietoja seuraavat ohjelmat voivat päivittää tietonsa tietokannasta.
Aina asioita ei tarvitse tehdä näin monimutkaisesti, mutta jos joskus huomaat, että käytännössä jokainen tietokantamuutos pitäisi kertoa myös palveluille X ja Y (esimerkkejä: audit-lokitus, valmiiksi rendattujen www-sivujen cache, käyttöraportointi, ...) niin yksi keskitetty viestiloki alkaa tulla yksinkertaisemmaksi kuin laittaa jokainen muutoksia tekevä ohjelma ottamaan yhteyttä jokaiseen muutoksia kuuntelevaan ohjelmaan.
Mutta sen sijaan keskitetty tietokanta on olennaista, jotta sovellusten arkkitehtuuria voi yksinkertaistaa. Se ratkaisee kerralla hyvin monta asiaa: antaa sovelluksille yhteisen tietomallin, antaa hyvät ja hyvin dokumentoidut välineet tietojen kyselyyn, ja huolehtii, että kaikki ohjelmat näkevät samat tiedot (lisäksi se huolehtii näiden tietojen eheydestä). Oikeastaan ainoa syy olla käyttämättä jaettua tietokantaa on nähdäkseni se, jos ei pysty: jos esimerkiksi käyttää jotain pilvipalvelua, joka on täysin naimisissa oman tietokantansa kanssa.