Remix.run Logo
jpsaccount 2 days ago

Author here. Ampbase is an OpAMP control plane for agent fleets, and this is how it runs without a database: conditional writes for uniqueness and compare-and-swap, one bucket per customer so isolation isn't a WHERE clause somebody has to remember, ULID keys so history is a prefix list.

Two things the post doesn't cover and I'm happy to get into. What closing the cross-region lost update actually took: annotating the RPCs that depend on a compare-and-swap and replaying those to a single region, with a client-side guard. And the read amplification, which we have a plan for but waiting on a clear signal for when it’s needed.

Cross-posted with thanks to the Tigris folks; the original is at ampbase.io.

typesanitizer an hour ago | parent | next [-]

> [..] so isolation isn't a WHERE clause somebody has to remember, [..] Two things the post doesn't cover and I'm happy to get into. What closing the cross-region lost update actually took: [..]

Set of my Claude alarm bell, and lo-and-behold, Pangram judges this comment to be 100% AI-generated, albeit with limited confidence.

themgt 8 minutes ago | parent | next [-]

And the read amplification, which we have a plan for but waiting on a clear signal for when it’s needed.

This is Claude between the lines admitting none of it was needed. Postgres on a VM would be doing just fine right now.

BenoitP an hour ago | parent | prev | next [-]

There's even a load-bearing in there as well

8by3 an hour ago | parent | prev [-]

real people don't write "compare-and-swap" ... or "lo-and-behold" for that matter.

edit. Clearly the joke about "lo-and-behold" didn't land well with the bots...

ninjaoxygen an hour ago | parent | next [-]

People who grew up with assembly language or locking primitives are fairly likely to use compare-and-swap because it's literally the commonly understood term for it.

https://en.wikipedia.org/wiki/Compare-and-swap

BenoitP an hour ago | parent | prev [-]

Compare-and-swap is a hardware instruction, and beyond that a desirable pattern for dealing with concurrent writes.

CMPXCHG

https://www.felixcloutier.com/x86/cmpxchg

https://lwn.net/Articles/847973/

embedding-shape an hour ago | parent | prev [-]

> and this is how it runs without a database

From the article:

> In practice, when you reach for a database engine you're actually reaching for four basic features: unique constraints, transactions, indices, and history tables. In order to use Tigris' global object storage as a database, we had to implement all of these primitives ourselves.

Not sure why the "without a database" is or isn't so important, why is it mentioned so often and why the article flip-flopping between "we don't have a DB" and "we're effectively building our own DB"?