This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-04-28
Channels
- # aleph (3)
- # announcements (3)
- # babashka (8)
- # beginners (12)
- # biff (4)
- # calva (12)
- # clerk (29)
- # clj-kondo (1)
- # clojure (104)
- # clojure-art (1)
- # clojure-austin (5)
- # clojure-berlin (3)
- # clojure-brasil (34)
- # clojure-europe (11)
- # clojure-germany (16)
- # clojure-losangeles (9)
- # clojure-nl (30)
- # clojure-norway (58)
- # clojure-uk (1)
- # core-async (8)
- # cursive (4)
- # data-science (9)
- # datalevin (1)
- # datomic (40)
- # emacs (2)
- # events (3)
- # helix (1)
- # honeysql (3)
- # hugsql (1)
- # hyperfiddle (66)
- # jobs (4)
- # juxt (7)
- # kaocha (9)
- # lsp (5)
- # malli (10)
- # off-topic (4)
- # polylith (2)
- # reitit (5)
- # releases (1)
- # remote-jobs (5)
- # sci (46)
- # scittle (2)
- # shadow-cljs (9)
- # tools-deps (17)
- # xtdb (8)
Det at datomic integrerer så godt og er så nært er en av de store fordelene. Native Clojure datatyper rett inn, ingen serialisering. Dataene kommer rett ut igjen fra en lazy collection. Helt nydelig.
Jeg har prøvd meg på datomic både fra Java og nodejs i tidligere prosjekter, og da forsvinner dette helt - og mye av magien faller bort.
Jeg delte nyheten om Datomic på jobb. Første feedback fra en seniorutvikler: > Datomic is indeed a cool database, but I would actually prefer to embrace eventsourcing. Just using eventsourcing would give you all the benefits you list. Another benefit is that you would make the events first class in your domain, resulting in a better understanding in what actually drives change of data rather that simple crud. There is a specialized db called eventstore, https://www.eventstore.com/, for eventsourcing that is pretty sweet, but you can also use https://martendb.io/ in .net which runs on top of postgres.
den store forskjellen med Datomic der er at events er ugjennomsiktig data og du må i praksis bygge opp dine egne views. Datomic har struktur og schema, og indekserer data som du senere kan gjøre queries på, og er en relasjonsdatabase og ish en graf-database ut av boksen
dessverre er det ganske vanlig at flinke folk ser Datomic og sier (feilaktig) "men det er jo bare å..." :)
Transaksjoner er førsteklasses data som kan annoteres - dette er eventene dine. Det er selvfølgelig en noe forenklet tilnærming, men den sparer deg for sykt mye kompleksitet, og gir deg de aller fleste fordelene.
@slipset snakket om at en grunn til å unngå Daromic, er at det er et krav å hardt skille på data på tvers av tenants i Ardoq. I postgres kan du skille på data på db/schema-nivå, easy peasy. Men @magnars, gjorde ikke dere noe sindige greier på Norled for at brukere bare skulle få se data de faktisk har tilgang til, hvor dere filtrerte på et eller annet generisk vis etter queries? Something something filtrering av facts?
det tror jeg @U0ESP0TS8 svarer best på 🙃
@U0MKRS1FX beklager sent svar; det var jævlig smooth! Vi kom aldri lengre enn til en liten proof-of-concept da vi ikke hadde behovet til å gjøre tilgangsstyring på data (kun funksjoner). Jeg er usikker på hvordan teknikken hadde skalert ved spørringer. Skal forsøke å samle trådene og få i hop en blog evt et lite foredrag på meetup?
Med smooth så mener jeg at det på query-siden var implementert som filter, det vil si at queriene ikke trengte å tenke på dette. De så bare det subsettet av databasen de hadde tilgang til. I tillegg kunne filteret brukes ved transacts også, ved å gjøre en spekulativ transaksjon (Datomics d/with
) og sjekke resultatet av transaksjonen om den påvirket entiteter/attributter som passerte filteret. Implementerte aldri dette som transaksjonsfunksjoner serverside i Datomic, men det er jo naturligvis fult mulig.
Ikke bare mulig, men selvfølgelig også ønskelig i en produksjonssetting (for å forhindre potensielle race conditions)
nå har vel tilogmed transaksjonsfunksjoner blitt hyggeligere, tror man kan putte ting på classpathen til transactoren elns, i stedet for å committe kode som strings over en tx
Det er kanskje vanskeligere å selge inn Datomic i en bedrift som er all-in på Microsoft og C# .NET når en av de store vinningene er den sømløse "integrasjonen" og hele brukeropplevelsen i et språk med matchende "filosofi."
En mulig vinkling er jo å bygge en liten mikrotjeneste rundt datomic som øvrige tjenester kan kalle på. Når man så ser hvor flott det blir kan man bytte ut de andre i tur og orden 😅
Ja, jeg tror det blir planen. Hovedutfordringen er at vi har et relativt tynt men komplekst "rammeverk" for mikrotjenester som "vi" (egentlig en ekstern konsulent) har laget. Alle mikrotjenester "må" i utgangspunktet benytte det fordi det gjør registrering av tjenesten, kommunikasjon med andre tjenester (via Service Bus), secrets, databaser, autentisering, logging, etc. Jeg jobber på teamet som er ansvarlig for dette rammeverket og "core" tjenester (dvs. de som ikke får hente inn andre tjenester). En ulempe er at det er relativt restriktivt og man kan ikke bruke hele .NET helt fritt heller. Fordelen er at det er ganske raskt og enkelt å lage nye tjenester og forstå alle tjenestene fordi konseptet og strukturen er likt. Så lenge man bruker denne "malen" er alt "lett" i den forstand at man kun trenger å tenke på business logic og ikke alt "rundt." Vi har ca. 300 mikrotjenester som bygger på- og kommuniserer med hverandre gjennom dette rammeverket. For å lage en mikrotjeneste i Clojure må jeg antagelig enten porte hele eller deler av rammeverket vårt eller bruke det via ClojureCLR på en eller annen kreativ måte. Eller skite i hele greia og lage en helt frittstående tjeneste, men da gjør jeg meg selv svært upopulær 😅
altså, jeg synes livet ble hyggeligere, ikke kjipere, av å lage en liten sak med Groovy (!) som skrev alle bevegelser i togtrafikken til en datomic-base så vi kunne se “hvordan så egentlig tog-norge ut i natt 02:00 når vi sendte en melding vi ikke forstod helt hvorfor”
Det er nok fine måter å bruke det på også fra andre språk altså, ikke la meg svartmale helt!
Det som er positivt med rammeverket vårt for mikrotjenester, er at det er svært modulært. Det er bygget på konseptene "hexagonal architecture" og "CQRS," med frittstående "komponenter" som kan konsumeres enkeltvis via separate NuGet pakker. Fordi det er ikke alle mikrotjenestene vi bygger som behøver alle delene av rammeverket. Alt som har med databaser å gjøre er generalisert, slik at en kan velge forskjellige typer databaser relativt enkelt. Dermed er det betydelig enklere å bytte ut en del av rammeverket av gangen, eller "plugge inn" Datomic under den delen av rammeverket som styrer med databaser. Så det kan hende det finnes noen muligheter der også. Rammeverket er egentlig ganske godt bygget.
Så det kunne kanskje vært en idé å lage en C# .NET klient for Datomic, og legge til støtte for det i den delen av rammeverket som gjør databasegreier. Når Datomic er på plass, tror jeg det ville vært betydelig enklere å selge inn Clojure ved å vise det i sammenheng med Datomic på egne datasett.
Hvis du bygger et klientbibliotek som tar seg av mappingen mellom Clojure sine datatyper og noe som er ergonomisk på .NET så er mye gjort tror jeg
går det, egentlig? Tviler på at Datomic peers kjører på .net. Clojure gjør jo det, men Datomic selv har vel en god del JVM-kode i seg
Aha, right. Typ lage en HTTP-basert klient, uten å gå via Peers? Noe à la Ruby-klienten da.
Men da får du mer klassisk klient-server-arkitektur, og mister mange av fordelene med peers
en stor mengde win kommer fra å ha business-logikk helt inntil query-motoren og dataene ja… så man ender vel fort opp med å få en del business-logikk i Clojure
Da vi brukte Datomic fra Java så var det særlig her det smertet. Litt ironisk, for det er jo langt mer elegant enn “strenger” som i praksis er utvekslingsformatet du har med en tradisjonell database - men der har du klientbiblioteker som integrerer språkets datastrukturer mot databasen.
hvis man liker CQRS er forøvrig Datomic et bra innsalg. Jeg vet ikke om en database som gjør tydeligere CQR enn Datomic, egentlig 😄 Datomic sine trade-offs gjør at så godt som alt er helt ulikt mellom commands og queries
enig med Christian, hadde vært rått om det var enkelt å jobbe med Datomic fra andre språk, og at protokollen ikke var så Clojure-spesifikk ned til beinet. Typ at du må lage Clojure-symboler (`clojure.lang.Symbol.create("db", "add")` for å få det som tilsvarer :db/add
) fra Java-kode for å lage queries som data. Rart med det egentlig, virker som Cognitect/Nubank ikke er spesielt interesserte i at Datomic skal “ta av”
er en stor dose “hva vet jeg” her da, kanskje det er kjempe upraktisk å få til det uten å samtidig gjøre det vanskeligere å bruke Datomic fra Clojure
.NET har for øvrig også https://learn.microsoft.com/en-us/ef/, som er en slags ORM. Det virker ganske komplekst, og ikke som en spesielt god idé egentlig. Men det er relativt utbredt, og jeg tror det er mulig å extende Entity Framework til å supportere andre typer databaser og query-språk, som f.eks. Datomic og Datalog. Men jeg vet ikke om det er en spesielt smart tilnærming.
Det er lett å abstrahere seg bort fra det som gjør Datomic bra hvis man ikke har inngående kjennskap til det. Jeg ramlet i den fella når jeg (som flink gutt) lagde storage-laget for http://www.adventur.no med en "pluggbar arkitektur" slik at man "lett" skulle kunne bytte ut databasen. Det hadde jeg jo lært at var viktig.
jeg har aldri forstått hvorfor noen mener det er viktig/essensielt å skille på business-logikk og databasen… Hva man gjør med databasen er jo businesslogikken 🤷 (men mulig de som liker sånt har en fantastisk pitch jeg ikke har forstått)
imperative shell/functional core skiller jo i stor grad på database (connection) og business-logikken, men datomic sine immutable database-snapshots trekker jo opp den skillestreken et annet sted enn det som er vanlig
Jeg har hatt gleden av å lede et prosjekt hvor vi måtte skrive om en legacy løsning til en stor bank, som bestod av titusenvis av linjer stored procedures i SQL, til C# .NET. Noen hadde skrevet hele appen rett i SQL databasen 😅 Det var ikke spesielt gøy. Så jeg forstår til en viss grad ønsket om å ikke putte masse logikk helt nedi databasen.
hmm ja, ser den. Er vel mere at når business-logikken din avhenger av database-interaksjon, hvorfor er det utvilsomt amazing å skille de to fra hverandre?
sånn sett er det vel egentlig bare Datomic som gjør det praktisk gjennomførbart å implementere og skalere functional core, imperative shell. Om man skal gjøre det med databasen på en armlengdes avstand, ender man fort opp med å querye inn for mye data, i tilfelle den funksjonelle delen av business-logikken trenger det, osv osv
På tools-teamet til Funcom i gamledager introduserte vi NHibernate for å få større avstand til databasen. Det gjorde løsningene svært kompliserte med mange obskure feil. Men til gjengeld var det betydelig enklere når vi ønsket å prøvekjøre PostgreSQL istedenfor Oracle. Men jeg tror ikke det var verdt kompleksiteten egentlig.
Kjenner at jeg brygger på en blog post: “Loose coupling considered harmful” 🙂
Har du en teaser / et abstract? Tror kanskje jeg har en idé om hva du skal skrive om. Jeg tar meg i å foretrekke mer "rett fram" kode nå enn før. Men spent på hva du legger i det!