News for hackers. Stuff that matters.
Re:Datomic Is Now Free by electroly on Thursday April 27, 2023 @10:36AM (#35728794)
> Someone needs to have the working set of your database in memory, why shouldn't it be your app server and business logic?

This one confused me. The obvious reason why you don't want the whole working set of your database in the app server's memory is because you have lots of app servers, whereas you only have one database[1]. This suggests that you put the working set of the database in the database, so that you still only need the one copy, not in the app servers where you'd need N copies of it.

The rest of your post makes sense to me but the thing about keeping the database's working set in your app server's memory does not. That's something we specifically work to avoid.

[1] Still talking about "non-webscale" office usage here, that's the world I live in as well. One big central database server, lots of apps and app servers strewn about.

Re:Datomic Is Now Free by NovemberWhiskey on Thursday April 27, 2023 @10:41AM (#35728875)
I think the point is that treating your database as an arms-length, RPC component that's independent from your "application" isn't necessarily the only pattern.
Re:Datomic Is Now Free by foobiekr on Thursday April 27, 2023 @11:03AM (#35729211)
Strong agree. there are vast, massive cost savings and performance advantages to be had if the model is that a shard of the dataset is in memory and the data persistence problem is the part that's made external. The only reason we are where we are today is that doing that well is hard.
Re:Datomic Is Now Free by bombolo on Friday April 28, 2023 @06:04AM (#35739394)
If it's in memory you must live with the fact that it might be gone at any moment though.
Re:Datomic Is Now Free by foobiekr on Friday April 28, 2023 @11:31AM (#35742478)
Hence "the data persistence part."
Re:Datomic Is Now Free by robertlagrant on Friday April 28, 2023 @12:09PM (#35743233)
This sounds like a write-back / write-through cache with extra terminology. What's the difference?
Re:Datomic Is Now Free by foobiekr on Friday April 28, 2023 @04:13PM (#35746501)
The difference is the 10,000x slower performance if you move the actual DB transaction leader for the shard to over-the-wire access.

Anything can be anywhere if we ignore latency and throughput.

Re:Datomic Is Now Free by robertlagrant on Tuesday May 02, 2023 @04:30AM (#35784791)
I'm not saying that. I'm asking if this is just new terminology for a previous technology idea, or whether it's a new concept.
Re:Datomic Is Now Free by robertlagrant on Friday April 28, 2023 @08:57AM (#35740715)
Is this not the case already? Database drivers (or just your application code) are allowed to cache results if they like. The problem is cache invalidation.
Re:Datomic Is Now Free by foobiekr on Friday April 28, 2023 @11:31AM (#35742492)
Caches aren't the same. In the shard-in-memory case, the shard is the thing serving the queries, meaning it's not a cache it _is_ the live data.
Re:Datomic Is Now Free by robertlagrant on Friday April 28, 2023 @12:08PM (#35743213)
Understood. For a single-node or read-only system it sounds fine, but then there are a variety of ways to solve that (e.g. a preloaded in-memory sqlite).
Re:Datomic Is Now Free by augustl on Thursday April 27, 2023 @11:01AM (#35729171)
It's definitely a trade-off! If you have 10s or 100s of app servers that has the exact same working set in memory, it's probably not worth it.

But if you have a handful of app servers, it's much more reasonable. The relatively low scale back-office systems I tend to work with typically has 2, max 3. Also, spinning up an extra instance that does some data crunching does not affect the performance of the app servers, as they don't have to coordinate.

There's also the performance and practicality benefits you get from not having to do round-trips in order to query. You can now actually do 100 queries in a loop, instead of having to formulate everything as a single query.

And if you have many different apps that operates on the same DB, it becomes a benefit as well. The app server will only have the _actual_ working set it queries on in memory, not the sum of the working set across all of the app servers.

If this becomes a problem, you can always architecture your way around it as well, by having two beefy API app servers that your 10s or 100s of other app servers talks to.

Re:Datomic Is Now Free by electroly on Thursday April 27, 2023 @11:28AM (#35729584)
SQLite provides a similar benefit with tremendous results using its in-process database engine, although the benefit there is more muted by default because of the very small default cache size. We do have one app where we do this. There's no database server, the app server uses SQLite to talk directly to S3 and the app server itself caches its working set in memory. I can definitely see the benefit of some situations, but for us it was a pretty unusual situation that we might not ever encounter again.

All that said... can't Datomic also do traditional query execution on the server? I thought it had support for scale-out compute for that. AIUI, you have the option to run as either a full peer or just an RPC client on a case-by-case basis? I thought you wouldn't need to resort to writing your own API intermediary, you could just connect to Datomic via RPC, right?

Re:Datomic Is Now Free by carry_bit on Thursday April 27, 2023 @01:22PM (#35731483)
AIUI, the full peer is Datomic; the RPC server is just a full peer that exposes the API over http and is mainly intended to be used with clients that don't run on the JVM (and so can't run Datomic itself in-process).
Re:Datomic Is Now Free by xmlblog on Thursday April 27, 2023 @01:22PM (#35731471)
> If you have 10s or 100s of app servers that has the exact same working set in memory, it's probably not worth it.

The introduction of intelligent application-level partitioning [1] and routing schemes can help one balance cost and performance.

[1] https://blog.datomic.com/2023/04/implicit-partitions.html

Re:Datomic Is Now Free by dimitar on Thursday April 27, 2023 @11:39AM (#35729730)
Consider this use case - in addition to your web app, you have a reporting service that makes heavy duty reports; if you run one at a bad time, bad things might happen like users not being able to log in or do any other important work, because the database is busy with the reports.

So in a traditional DB you might have a DBA set up a reporting database so the operational one is not affected. Using Datomic the reporting service gets a datomic peer that has a copy of the DB in database without any extra DBA work and without affecting any web services. This also works nicely with batch jobs or in any situation where you don't want to have different services affect each others performance.

Its true that a lot more memory gets used, but it is relatively cheap - usually the biggest cost when hosting in the cloud being the vCPUs. But usually in Clojure/Datomic web application you don't need to put various cache services like Redis in front of your DB.

Thea assumption here is that the usual bottleneck for most information systems and business applications is reading and querying data.

Re:Datomic Is Now Free by electroly on Thursday April 27, 2023 @12:28PM (#35730559)
I appreciated this insight into other people's use cases, thank you for that! This architecture brings RethinkDB to mind, which also had some ability to run your client as a cluster node that you alone get to query. (Although there it was more about receiving the live feed than about caching a local working set.)
Re:Datomic Is Now Free by thewataccount on Thursday April 27, 2023 @02:20PM (#35732412)
Is RethinkDB still around?

They actually have recent commits, and a release last year.

Re:Datomic Is Now Free by electroly on Thursday April 27, 2023 @02:30PM (#35732556)
The company is gone, but the open source project lives on. We still use it in production.
Re:Datomic Is Now Free by thewataccount on Thursday April 27, 2023 @02:48PM (#35732824)
How's it been for production?

Would you recommend using it, or would it be better to go with a safer option?

Re:Datomic Is Now Free by electroly on Thursday April 27, 2023 @03:00PM (#35732993)
We've never had any issue with it on a typical three-node install in Kubernetes. It requires essentially no ongoing management. That said, it can't be ignored that the company went under and now it's in community maintenance mode. If you don't have a specific good use for Rethink's changefeed functionality, which sets it apart from the alternatives, I'm not sure I could recommend it for new development. We've chosen not to rip it out, but we're not developing new things on it.
Re:Datomic Is Now Free by thewataccount on Thursday April 27, 2023 @03:35PM (#35733434)
Interesting thank you!

I remember back when it came out it was a big deal that it could easily scale master-master nodes and the object format was a big thing because of Mongo back then.

That was before k8's wasn't a thing back then, and most of the failover for other databases wasn't a thing just yet. I'm too scared to use it because they have a community but they're obviously nowhere as active as the Postgres and other communities.

Re:Datomic Is Now Free by jwr on Friday April 28, 2023 @06:56AM (#35739701)
RethinkDB user here. I've been running it in production for the last 8 years or so. It works. It doesn't lose data. It doesn't corrupt data (like most distributed databases do, read the Jepsen reports).

I am worried about it being unmaintained. I do have some issues that are more smells than anything else — like things becoming slower after an uptime of around three weeks (I now reboot my systems every 14 days). I could also do with improved performance.

I'm disappointed that the Winds of Internet Fashion haven't been kind to RethinkDB. It was always a much better proposition that, say, MongoDB, but got less publicity and sort of became marginalized. I guess correct and working are not that important.

I'm slowly rebuilding my application to use FoundationDB. This lets me implement changefeeds, is a correct distributed database with fantastic guarantees (you get strict serializability in a fully distributed db!), and lets me avoid the unneeded serialization to/from JSON as a transport format.

Re:Datomic Is Now Free by svieira on Thursday April 27, 2023 @02:36PM (#35732662)
> which also had some ability to run your client as a cluster node that you alone get to query

FoundationDB does this as well.

Re:Datomic Is Now Free by bsaul on Friday April 28, 2023 @05:17AM (#35739136)
Do you have a pointer to some doc explaining how to do that in foundationdb ?
Re:Datomic Is Now Free by svieira on Friday April 28, 2023 @10:08AM (#35741427)
https://blog.the-pans.com/notes-on-the-foundationdb-paper/ is one:

> Client (notice not Proxy) caches uncommitted writes to support read-uncommitted-writes in the same transaction. This type of read-repair is only feasible for a simple k/v data model. Anything slightly more complicated, e.g. a graph data model, would introduce a significant amount of complexity. Caching is done on the client, so read queries can bypass the entire transaction system. Reads can be served either locally from client cache or from storage nodes.

Re:Datomic Is Now Free by tyre on Thursday April 27, 2023 @03:35PM (#35733424)
With AWS you can create a replica with a few clicks. Latency is measured in milliseconds for the three-nines observed usage.

I don’t think this is a huge challenge (anymore) for Postgres or whatever traditional database.

Re:Datomic Is Now Free by augustl on Thursday April 27, 2023 @03:38PM (#35733469)
A few milliseconds per query adds up if you're doing one query per item in a list with 100s or 1000s of elements :)
Re:Datomic Is Now Free by tyre on Thursday April 27, 2023 @09:33PM (#35736572)
ah okay. in that case add in a couple hours to refactor those N+1 queries and you’re all good
Re:Datomic Is Now Free by bt1a on Thursday April 27, 2023 @11:36PM (#35737210)
when do you ever have to do one query per array of items? genuinely curious
Re:Datomic Is Now Free by augustl on Friday April 28, 2023 @01:26AM (#35737738)
I suppose I think of this the other way around. When the query engine is inside your app, it doesn't have to invent a way for the query engine to do loop-like things. So you can have a much simpler querying language and mix it with plain code, kind of similar to how you don't need a templating language in React (and in Clojure when you use hiccup to represent HTML)
Re:Datomic Is Now Free by robertlagrant on Friday April 28, 2023 @08:55AM (#35740701)
> A few milliseconds per query adds up if you're doing one query per item in a list with 100s or 1000s of elements :)

If you're doing this, then you need to stop :)

Re:Datomic Is Now Free by dimitar on Thursday April 27, 2023 @06:22PM (#35735291)
That is a read replica, datomic peers can do writes as well, which further expands the possible use cases.
Re:Datomic Is Now Free by xmlblog on Thursday April 27, 2023 @01:16PM (#35731393)
Having the working set present on app servers means they don't put load on a precious centralized resource which becomes a bottleneck for reads. The peer model allows app servers to service reads directly, avoiding the cost of contention and an additional network hop, allowing for massive read scale.
Re:Datomic Is Now Free by bruiseralmighty on Thursday April 27, 2023 @02:41PM (#35732718)
This is true, but the tradeoff is that now your central DB is a bottleneck that is difficult to scale.

Having the applications keep a cached version of the db means that when one of them runs a complex or resource intensive query, it's not affecting everyone else.