DBOS
Michael: Hello and welcome to Postgres.FM,
a weekly show about all things PostgreSQL.
I am Michael, founder of pgMustard.
I'm joined as always by
Nik, founder of Postgres.ai.
Hey, Nik
Nik: Hi, Michael
Michael: And we have two
special guests with us today.
We have Qian, who is CEO and
co-founder of DBOS, and Peter,
CTO and co-founder of DBOS.
Welcome both
Qian: Thank you
Michael: I wonder if one of you could
give us a bit of the backstory of DBOS.
I think it's quite a cool story
Qian: Yeah.
So we started DBOS as a research project.
I think it was started quite in the middle
of pandemic in summer 2020, when Professor
Mike Stonebraker heard a talk from Matei
Zaharia, the profes- our advisors and
also co-founder of Databricks, where they
were talking about how Databricks were u-
was using Postgres to do some scheduling
work because, distributed scheduling
and cluster management was a mess.
And they were talking about how to
use a database to simplify that.
And then I think during that summer we
talked and discussed, like, how we can
u- extend that idea to make database
more helpful to build, reliable systems
to even replace the operating system.
So that's how we started the original
research project called DBOS.
And then Peter and I were the co-leads PhD
students working on that research project.
We published several
papers, did a bunch of work.
And then what we found was that, the most
interesting thing was actually to use the
database as a foundation for distributed
systems, to build distributed systems.
And that's why when we both graduated
in 2023 we decided to do, to
commercialize this idea, to do a startup.
And now we are working on
DBOS Inc., the company.
Nik: that's cool And I must admit
I observed queues in Postgres
for so long, like 20 plus years.
And somehow when DBOS DBOS was
announced, of course it it attracted
my attention, but I didn't quite get
it like Because like w-w-workflow,
like what i-what is it, right?
But then I started to realize,
actually, to realize that in any
business there are workflows, and to
keep the state and all the history and
so on in database, it's very natural.
So this is a very good idea.
And I think it's, it's-- it revives
the idea that queue in that database
is not only possible, but it's
possible in quite efficient way.
But you need to… With Postgres,
you need to be very careful, right?
Because of some, some things that
might happen if you implement
queues and workflows in naive way.
But I don't quite get it
still why operational system.
I understand when Andrei Karpaty
talks about like AI as a CPU in
the center, like memory, like every
p-peripheral devices, everything.
I understand this analogy, but here
I don't quite get the analogy why
is there is some intent or idea to
implement whole works operational
system in, in da-database.
Like what's your view?
Peter: Yeah.
So what we're doing as a company is
using the database as a foundation
for distributed workflows, and then
for things around the distributed
workflows like queues, like messaging,
like notifications, and so on.
I think the core idea here is that
as your program runs, you regularly
checkpoint the state of that program
in a Postgres database so that if the
program ever fails, if anything happens
to it, if it crashes, if it's interrupted,
it can reload those checkpoints to
recover from exactly where it left off.
And that, durable workflows idea backed
by Postgres is the core idea of DBOS,
using Postgres as an orchestrator to
make durable workflows that run really
w- that run with high performance
and that are really simple because
all they have is, all they have,
all they rely on is your database
Nik: Yeah, this makes sense.
I understand that.
I'm just still processing the idea.
It's like whole operational system.
Qian: I think our goal is that when
we think about operating system,
we should not be limited to the
operating system we're running
our, on our laptop or desktop.
Thinking like anything operational,
I think Kubernetes can be called
as a distributed operating system.
Thinking about like anything that
can run your application as like a
meta name for like operating system.
So I think nowadays, especially with
AI, operating system is like cool again.
Everyone is calling themselves an AI
operating system or, like something
AI-powered operating system for
engineers, for sales, for whatsoever.
So I think operating system now, like
the idea is more about how to properly
run your applications in any environment,
like in a distributed environment,
in a highly available environment.
It's about how to provide the
guarantee and provide kind of an
illusion that you are ru- like normal,
like modern developers no longer
directly write or interact with
low-level operating system primitives.
They usually interact with some- something
like Kubernetes or cloud resources.
So like you can think of the cloud
as an entire operating system.
So like I think the name like DBOS right
now really focuses on how to operate
those, applications at scale and reliably.
So it's I would say it's eventually
at a grand vision, we hope everything
will be backed by a database,
Nik: Yeah.
Qian: then that will be like
a super operating system.
Yeah.
Nik: Yeah this makes sense in, in
broader meaning operating system.
Yeah.
Not just like Linux or Windows
or something, Right.
I get this.
And also like there are even broader
systems like there, there are companies
like which are building like an
operational-- operating system for
businesses in broader meaning, right?
I also remember when Anthropic released
I think Ultracode with workflows.
I remember on Hacker News
top both topics were present.
One was about their workflows,
another was about some blog
post from your blog, actually.
I remember.
It was like-- And for me, it was
like this is two different things.
And I remember internal discussion in
our team actually, that we use these
workflows in Claude Code, but workflows
which are like saving some state
in database is something different.
And then I remember an aha moment when
we realized we actually have agentic
workflows ins-internally already
working, and we save state in Postgres.
So I realized it's very close topics.
I think you also use this resonating
moment when they released it and you like
to discuss workflows in database, right?
So I have one specific technical question
though because Peter, you mentioned
that if something crashes, right?
And ch- this checkpoint and database were
all good, like we ha- we have stayed safe.
I don't like fully understand why
checkpoint is needed because we always
can replay more after checkpoint.
There are WALs and so on, right?
But anyway, we
Michael: checkpoint
Nik: Ah, okay, a checkpoint there.
But what wonders me, if, for example,
we se-send an email but we don't
know the result of that yet, right?
I'm like moving us slowly to the topic
of two-phase commit or something, right?
How do you handle that?
Peter: Yeah.
So if your step is taking an action
in an external system and it fails
in the middle of the step, then we're
going to have to retry that step, and
that, that's unavoidable in any kind
of workflow or durability system.
So our recommendation then is for
individual steps that take-- have
side effects, external systems
to make those steps idempotent.
And, we provide help for that.
Every workflow has a unique ID
that you can use as an idempotency
key in systems that support that.
Many email systems do
support idempotency keys.
Some problems are fundamental
to distributed systems.
If you're taking a side effect
somewhere else and it fails and you
don't know whether it succeeded,
you're gonna have to retry it.
And so you should really try to make
sure that, that action's idempotent
Michael: And another thing I didn't
fully appreciate till recently, I kept
focusing on the word durable I see
durable workflows mentioned quite often.
I'm thinking about reliability and
retries, and that all makes sense.
The thing I didn't really
appreciate was actions that
quite-- could be quite costly.
If you've got a five-step workflow and
you've spent a lot of tokens or a lot
of money, or you've sent physical goods
or something like that in steps one,
two, and three, and it fails at step
four, you can avoid the c- the cost
of redoing steps one, two, and three.
Like it, the-- that hadn't really clicked
for me, that sometimes it's about other
side effects, like might just be cost
or it might be safety or it might be
something else that you don't have to risk
re-replaying is that a big part of it at
the moment in terms of… or are there
parts of that might be helpful to explain?
Qian: Yeah, definitely.
I think especially nowadays,
everyone's building AI agents
and those new models are becom-
becoming more and more expensive.
So if you have already asked the
model about something, you want to
use that output as much as possible.
And if something crashes, you want
to resume from where it left off.
Say, like you already asked the
model what to do next, then you
should continue from that step
instead of asking the models again.
Because otherwise you have to burn all the
tokens and this will quickly become too
costly if you're having like processing
thousands of documents and then you
want to do it in a more efficient way.
That's where DBOS is used a
lot, like building agents and
building AI-powered pipelines.
I think cost saving is
definitely… It's like becoming
more and more important, I'd say.
Yeah.
Michael: Makes sense.
Interesting
Qian: And also compute resources, right?
Even if you don't have to pay those,
Even for some people who will self-host
their GPUs and - self-host their model
inference, then you don't want to
burn all the compute resources again.
It's all about efficiency.
I think yeah, durability itself
sounds like not, doesn't sound like
a very useful word, but it indicates
a lot about cost savings and also
in- indicates about after you've done
something, you don't repeat it again.
So it's indicates about
correctness as well.
Yeah
Nik: I have a question about why
should it be inside Postgres?
We know there is-- there are systems
which do the same outside, right?
Temporal is one of the
most popular systems.
I even from my personal experience,
I even had a moment when one of our
clients reimplemented our Postgres
major upgrade workflow in Temporal.
it was, It was Gadget
Michael: They spoke
about it on the episode.
Nik: Yeah, we had an episode
about that, and it was like we
always used Ansible and so on.
Of course it's very different, right?
When you have workflow, you
save everything, it's great.
But you move further, let's bring
the whole thing inside Postgres.
What are pros and cons and, why do
you think this is a winning strategy?
Peter: Yeah.
So I'd, what I'd ask is why not Postgres?
The temporal model is that you are
taking… is that you're outsourcing
the control flow of your program to
an external orchestrator, and that's
a lot of additional infrastructure.
You can either self-host it, in which case
to run your workflows, you have to spin
up highly available temporal cluster, a
database for it, which is Cassan- and its
database is Cassandra and Elasticsearch.
And now you're spinning up three
new distributed systems to run your
workflows, and all three of those systems
are totally on your critical path.
If anything happens to
them, Nothing will work.
Your workflows will not function.
Your business grinds to a halt.
So you're putting three complex
distributed systems on your critical path.
Or - you use their cloud service.
Now you're putting an external
SaaS on your critical path.
You don't need to do that.
You just need a database.
And what we're trying to do in DBOS is
totally replace all of those distributed
systems, all those external orchestrators
with your Postgres database so that you
can use your database as an orchestrator.
It's already on your critical path.
It's already something that you're
making sure is highly available.
It's already critical for
your application to work.
Why not also use it as your workflow
orchestrator so that you have
less infrastructure, so that your
operations are simpler, so that
there are fewer things that can break
and bring down everything you have
Nik: Two things here.
One is who will-- like Postgres
doesn't have scheduler, right?
You can use pg_cron or something,
or you need to still need
external help to tick, right?
To move forward.
And another thing is that if it's all
running on the primary and primary CPU,
first of all, is not infinite, right?
So you need to avoid heavy things
and have them outside still, right?
Peter: Yeah, and that's
the reason Postgres is
the orchestrator.
The actual business logic
of your workflows is still
running in your application.
The scheduler is running in your
application, for example, and
then Postgres is the orchestrator.
So your applications are running
a scheduler, and your applications
will enqueue when the sched- when
the cron fires, your, one of your
application servers will enqueue a
scheduled workflow into Postgres.
And then Postgres there
does orchestration.
It coordinates multiple servers to
make sure that only one of those
servers actually executes the scheduled
workflow when its cron tick fires.
So your applications your regular
servers are doing the work, and
Postgres is orchestrating them to
make sure that every, all the work
is being done totally reliably, that
everything happens exactly once.
Nik: Makes sense.
So this is when you say critical
path, you don't include things
that like sending email can be done
from multiple servers and they are
replaceable like stateless and so on.
Yeah, I get that.
It feels slightly awkward for
me to try to criticize the idea.
I'm a big fan of myself, like
maybe Michael should join
and find some other questions
Michael: I was actually gonna
ask a question that probably
goes even more positive.
M- or maybe not, but I would expect
there to be performance benefits to
using your already h- used database for
this rather than an external service.
So I was only gonna say What are, what are
the performance trade-offs and what do you
do to minimize the impact you're having
on primary CPU and that kind of thing?
Peter: Yeah, absolutely.
So latency in particular gets a lot better
because now the latency of executing
a step is just one write to your local
Postgres as opposed to a async dispatch
from somebody else's cloud service.
So definitely latency improves.
Now throughput then
becomes database bounded.
You can process as many
workflows per second as, as your
Postgres allows if you want.
And if you need to scale beyond
that, you need to shard across
multiple Postgres databases.
The good news is that these
operations are fairly light.
So our rule of thumb is that four Postgres
cores can handle 1,000 actions per second.
So for a large database, that means
you can vertically scale for a large
Postgres database up to… we've
benchmarked around 40,000 actions per
second on a single Postgres database.
And then of course, you need more
than that, you can shard or you can
use multiple Postgres databases.
So your throughput does become
bounded by your database, but the
good news is that your database
can handle a lot of throughput
Nik: Yeah.
Yeah.
Michael: and we're
talking… so let's say we've
got a workflow with six steps.
We've got one write at the beginning, one
write per step, and one write at the end.
So we're still only talking eight writes
total for a si- and this workflow's having
to do things in the meantime, it's not
gonna be running through them instantly.
So yeah, great.
Okay, cool.
Peter: And you can handle 40,000 of
those actions per second on one database
Nik: Yeah, I'm curious.
I researched a little bit and I noticed
y-that you started with repeatable
read isolation l-level and then reduced
it to default read committed, right?
I'm very curious what was behind that.
Is it the throughput
question or anything else?
Peter: So we use isolation levels
there's a lot of different parts
of our system that use isolation
levels for different reason.
we've designed the system so that
almost everything is a single statement.
So it can just be a, it can just
execute a recommitted, and that
makes things far more efficient.
As many things as possible execute
as a single Postgres statement,
so they can just be atomic and you
don't have to worry about isolation.
You set it to default recommitted.
The one thing that we can't do
that for is the main DQ query.
this is probably the single most
important s- query in the entire system,
and it's the query that every worker
runs periodically on every queue to
dequeue the latest work off the queue
And that's a very complex query we've
put a ton of effort in optimizing.
That query has a, actually has a
conditional isolation level, s- depending
on what, how you've configured your queue.
So if your queue uses global flow control
primitives, if your queue, for example,
has a global concurrency limit or a global
rate limit, so you say, for example,
that this queue can only execute one
operation at a time across every worker,
then that requires global coordination,
which means we have to use a high
isolation level like repeatable read.
And that has coordination costs, but
if you have those global limits, you're
probably fine paying the cost because
you're only executing one workflow
at a time across all your servers.
th- your throughput was limited
anyways in practice though, what we
see is that high throughput queues
usually only use local limits.
They might say only execute 10
workflows at a time per worker.
And those local limits don't
require global coordination.
And that means that it's perfectly safe
to run the queues query at a very low
isolation level at at read committed.
And that way you can have this query
running across hundreds of servers at the
same time, or thousands of servers at the
same time without them conflicting because
they're all running read committed.
And that lets you get this thirty, forty
thousand dequeues, dequeued workflows per
second, actions per second throughput.
And it really caps out at thirty
thousand dequeues per second on a single
Postgres across thousands of workers
because we've optimized this query
Nik: And in case of sharding
solution re-repeat-repeatable read
wouldn't be available anyway, right?
So because like global
limits it's… Yeah.
You
Peter: But in practice, global limits tend
to go with relatively low throughputs.
Nik: And it's flexible now, right?
So u-u-user can control it
and decide what, what's in.
That's great.
And I also noticed listen to
file was recently added, right?
Or not recently, maybe I'm wrong.
Qian: We've been having listen notify,
but recently we've been optimizing it
Nik: yeah.
We ha-- Yeah, I think it was last year,
Recall AI they discovered this awful
global lock on commit for Notifier, right?
What's your deal with this right now?
Peter: Listen/notify is really powerful
but has multiple performance issues.
There was that issue that… I forget.
There was that issue that reached
top of Hacker News last year.
That was actually not
the issue we ran into.
That issue was solved in Postgres 19.
That is not the issue we ran into.
that issue is that notify had
terrible perform- notify's broadcast
mode had terrible performance for
large numbers of sparse readers.
Uh,
that's actually an unrelated issue.
We do not have that.
We have dense readers.
We don't have sparse readers.
Nik: Can you explain please the
sparse readers versus dense readers?
Peter: Oh, sorry.
The problem that everybody was talking
about last year was that if you're
broadcasting to a huge number of
readers, each of which is only reading
a small fraction of all messages,
that had terrible performance.
So that's actually not
the issue we ran into.
The way DBOS is set up, pretty much
all workers are listening to all
messages and that performs fine.
The issue we ran into was
the global lock at notify.
When you commit a transaction that
performs a notify, it has to acquire a
global lock for the entire duration of
the commit, and that includes the fsync.
And what that means is that these
transactions can't be group committed.
They have to commit sequentially, which
essentially bounds the throughput of
any operations that perform notify.
You can't perform more than a
certain number of them per second
because you can't group commit.
So you're stuck waiting out the
entire duration of the fsync.
the optimization that we settled on
there to make listen notify, because
we really want to use listen notify.
It provides incredibly low
latency, and when it works, it
provides incredibly low latency.
So w- the optimization we
settled on was notify batching.
So instead of sending a notify,
originally, we were sending notifies
in a trigger every single time you,
for example, wrote to a stream.
And the optimization was instead it
was removing the trigger and instead
buffering stream writes in a background
thread and then sending all the
notifies in the batch and send that
batch e-every ten milliseconds or so.
A huge batch of notifies is
actually very fast because you
only have to hold the global lock
for the duration of that commit.
that's fast.
And what this does is this allows us to
use listen notify without re- running
it, worrying about the global lock
because we're batching commits and
the global lock's only required for
commits, and still getting the benefits
of low latency because we can still
emit these every, every few milliseconds
Qian: I think, the overall observation is
that we don't really need that global o-
ordering when we're doing the application
level streaming, like streaming,
for example, results to the client.
Then what do you-- we're leveraging the
listen/notify to do is to notify like,
"Hey, we have some results available."
So we don't really need
that strict ordering.
And I think that was the main aha moment
for us that, okay, we don't need to
limit ourselves to that exclusive locks.
We can do batching.
Yeah.
Nik: And yeah, and this is… okay.
So and also the problem is happening.
You, Peter mentioned that it was
fixed in 19, and it's happening when
commit has a lot to write, right?
So like it's this fsync.
Basically, transaction is significant in
terms of how much it's writing, right?
So th-this increases the problem.
But in your case, you have only
like brief writes in transaction.
Not a lot, right?
Not like a lot of JSONs to be
written and fsynced during commit,
So the problem shouldn't be huge
a-already if I'm not mistaken.
and you decided to group it.
This is interesting optimization.
I, I wanted to raise
this question, of course.
You use skip locked updates and
what's happening if we have some
xmin horizon blockers, so long
transactions or lagging logical slots?
Obviously, a lot of dead tuples
should be accumulated, right?
Is it a requirement if you use DBOS
at, like at high rates, at a lot
of events per second and so on?
Is it a requirement I need to watch
closely what is my xmin horizon?
Don't allow long-running transactions,
don't allow logical… lagging
logical replication slots long
transactions, so on standbys with
hot standby feedback on and so on.
Is it a requirement or you solve
this somehow I don't know, like
maybe mitigate-mitigating bloat with
repacking, reindexing and so on?
Peter: Got it.
So just to be clear, we're only using
skip locked on our own workflow status
table, and that's typically isolated
within its own Postgres database.
So our recommendation is Don't take
out ultra long-running transactions
inside the DBOS database, and you
probably weren't doing that anyways
because DBOS certainly doesn't do that.
And then the rest should be fine.
The DBOS operations are isolated here
Nik: So you don't use skip locked
for like events t- tables where
events or workflow data is stored?
Peter: It's only used for deques off of
the main workflow status table, and that's
usually pretty isolated from user data
Nik: But still, it's you need a s- single
update on every status change, right?
Peter: Yes, and that does lead
to dead tuple accumulation.
but that's a separate issue that
y-yes, at ma- at massive, at
really high throughputs, like when
we were doing these benchmarks at,
40,000 workflows per second, we
saw high CPU usage due to dead
tuple cleanup and autovacuum because
we're turning on these indexes.
And we've done a lot of work
to optimize indexes, so most,
almost every index is partial.
So most indexes are only being
maintained either for a small
subset of workflows or only for a
small subset of workflow lifetime.
But there's still a fair amount of index
churn on the order of… And this, of
course, not as hot a dead tuple, and it's
going to create a bunch of dead index.
It's going to create two or
three dead index entries that are
going to have to be cleaned up.
At really high throughputs, this can
become the bottleneck but that sets in
around 20 or 30,000 actions per second
is when we start seeing the tuple
accumulation really becoming a problem,
because there really aren't that…
Tuple accumulation become
a problem, because we have
optimized this as much as we can.
Nik: Yeah, I see it very differently.
I see it like when you say 20,
30,000 per second, it means for me it
becomes 2,000, 3,000 or 200, 300 per
second if we talk about really long
transaction happening in parallel
because they block vacuum, uh, work.
We cannot delete the tuples, and at
very high throughput with shorter
transactions will be-become the same
if you have much lower throughput,
Peter: Yeah, which is why
our recommendation is isolate
the DBOS system database
from the database we're using, we're
using long-running transactions.
These don't have to be in the same, in
the… These don't have to be in the
same Postgres database, and they probably
shouldn't be, especially for long-running
transactions that could block Autovacuum
Nik: Yeah, this is what my… Yeah,
th-this is exactly what I was asking.
It's not like like requirement, but
it definitely if you have long-running
transactions or any other explain
horizon blockers performance of
DB-DBOS will, will suffer eventually.
Peter: Yeah, but these don't, these
can be isolated from each other.
They don't have to run in the same
place, and they probably shouldn't run
in the same place, especially at scale
Nik: This is interesting.
We have a lot of common things.
I agree with putting everything
to Postgres open source.
I w- didn't mention that the thing
you're building is open source, which
is great, and like this is super cool.
And and like we don't need
extra things on critical path.
That's great.
Also I guess you have self-served
option as well, right?
If it is open source, you
can self-host yourself.
Like freedom, right?
It's great.
And you run also y-you
can run DBOS in, on RDS.
Absolute fr-freedom.
But when you say let's split it,
it's against the first principle.
Like first principle, let's
have it everything in one place.
Because if we have, this thing
and we have other tables, we can
organize code right inside database.
Sometimes it's a bad idea if
it's very long, if CPU-consuming.
But if it's something simple, I
want to update everything inside,
like using triggers, PostgreSQL
code functions, and so on.
I don't want to split.
But once I have database, say terabyte in
size, and I start some analytical queries
right there because I'm not I'm not grown
enough to have ClickHouse or something.
I have only Postgres, right?
Those long-running queries
will take time, right?
And in this case updates and data, MVCC
in Postgres actually is not a good thing
to deal with, as we all know, right?
This is I'm j- I'm asking because, like
you m- you know that I'm trying to revive
this PGQ from Skype, which is bloat-free.
No, almost no updates.
For event table, there
are no updates there.
But I don't see how it will… I
don't see clearly how it will be
used to implement workflows yet.
But for many tasks, it's great, and we
don't have problems with bloat there.
And I'm trying to understand
how our operate properly.
Like in, in case of updates, we
need to establish some rules.
Like for example, we should stop
allowing long-running transactions.
I'm I'm glad I participated in
building transaction timeout.
So we set transaction
timeout, say like 10 minutes.
That's it.
And I'm very curious, like maybe
there is a way to define some
boundaries and rules when it's time
to move away and to like to split to
different Postgres cluster, right?
To split these workloads.
M- And there are no good rules yet.
Th-This is a problem
Peter: One is that you don't have to split
multiple Postgres clusters or servers.
You can, if I remember how Autovacuum
works correctly, it is isolated across
multiple databases on the same cluster.
Nik: Logical databases.
Peter: Yes.
So like the xmin horizon
is set per database.
So so you don't have to split
your physical infrastructure.
You can share physical infrastructure
Nik: Yeah that's a good point.
I agree.
Still, I feel like it would be great
to have some benchmarks or something to
define when it's time, when it's time
to split, when it's fine, and which
transactions should be disallowed.
I think it-- you're very right.
If you have 30,000 workflows per
second it-- your requirements become
much stricter in terms of what means
long-running transaction, right?
How much xmin horizon is lagging.
Anyway, thank you for
diving into this topic.
I'm also trying to learn this myself
Qian: Yeah.
I think that's actually a good, really
good point because you are right that
if you put… Y- there are benefits
of co-locating the workflow tables
with your actual application data.
One thing we were talking about
in some of our blog posts is this
transactional outbox pattern.
If you say someone, like we updated
the customer data, now we want to
kickstart some of the workflows,
then by co-locating them in the same
database, you can do it in a trigger.
Say, whenever you update this customer
data, automatically start or enqueue
a DBOS workflow in the same database,
and that's really convenient and
that, that's a way that you can
guarantee whenever there's updates
in this table, you'll kickstart a
workflow that is durable, that will,
that DBOS will guarantee will finish.
And that's a pattern that is
really difficult to do with,
say, like external orchestrator
because there will always be a gap.
And by co-locating in the same database,
there's a way to close this gap.
But everything has a trade-off.
Like you said, if you put in the
same database, you have to be really
careful about what you, what queries
you put in that database, like how
to avoid head of line blocking, how
to avoid bloating in that database.
So I think that's a topic we're
continuously, benchmarking and
also by talking to users and see
what kind of workflows and what
kind of workloads they're running.
And we're, we are also trying to
categorize like a more detailed,
guidelines for people as well.
Nik: Yeah, interesting.
But any-anyway I'm glad that this, this
topic is becoming more and more popular
and other companies started to join
t- like M-Microsoft recently, right?
With pgDurable.
What do you think about that system?
Qian: Yeah.
So this is great.
I think pgDurable is mostly
for pure SQLs, right?
It's, it doesn't really work for
if you want to send a email or
interact with external systems.
So we'll definitely, take a look and
see if there are any ways to collaborate
or borrow ideas from pgDurable.
But I think in general it's
another validation of the Postgres
Nik: yeah.
yeah.
Everything more and more people
start looking in the same direction.
I think yeah, the topic is warming up.
I agree with you here.
Also, there was a system called
Absurd, which got my attention.
Single SQL file as well.
It… I think it was
released last November.
And yeah.
I noticed in pgdurable is that the
tendency to have a SQL PL, PostgreSQL
code quite ef-ephemeral way.
And this is w- like you're just
passing it as a parameter, like
to lump the functions, right?
And this concerns me because I want
my code still to be in Git, right?
To be versionable, fix,
reviewable, and so on, right?
So this leads me to question, what
are the best use cases, case studies
you ha- you had already, you where
you observed debor… I'm sorry,
like I pronounce it DBOS for myself.
I don't know why.
What are the best use case studies,
use cases you have, like where
it shines in terms of how like,
like it suits really well, right?
Sending emails or like processing orders
in e-commerce or something like this.
What are the best cases?
Peter: Yeah.
the thing about workflows is that
they're really powerful f- they're
really powerful for a lot of things.
So of course, the, the really
hype new use case we see is AI
agents and operations around them.
So people using workflows both to
make their actual agents durable.
This is particularly important for
long-running interactive agents that
might, talk to a person or do multiple
rounds of conversation with a person
or require approvals for a person
over the course of hours or days.
Similarly, data pipelines like document
processing pipelines for agents often
require durability, and, you know,
workflows can really help there.
So those are kind of
the, the new use cases.
And then there's this whole host of
traditional business workflows that
have always needed durability and
where Postgres backed durability
just makes it easier to provide it.
And that's things like logistics.
It's things like, like
a- like lab automation.
It's things like new user registration,
making sure new users are properly
updated in every single one of your
cor- of your corporation's databases.
So we see this really broad spectrum
of use cases for workflows because
really any important operation that
touches customer data, touches important
data, it probably should be a workflow
if you're really operating at scale
and you really care about reliability
Qian: I think in summary it's we
really view Postgres as the central
orchestrator to connect things together.
You can connect external systems
to your local database, or you
can do event processing to connect
multiple systems like your other
databases or your email server,
payment system, all sorts of things.
So we re- try to make sure your
Postgres is the glue for everything.
Yeah
Nik: And speaking of Postgres
maybe last question from me.
So now Postgres 19 beta 2
just released, Postgres 20
development has started already.
What what do you think should be changed
in Postgres or brought to Postgres to make
the product you are building even better?
Peter: I think we do have to go…
I would like to go back to notify.
Removing that global lock is not easy,
and I'm not sure if it's doable with the
way notify is currently implemented, but
that area of the code hasn't really been
worked on much since Postgres 9 and,
maybe there's something that could be done
there to remove the footguns from notify.
And even if you don't remove them,
I think notify's really complicated
performance characteristics should
probably be, should probably be actually
documented instead of having to figure
this out like through by… I mean,
we figured this out basically by,
by reading the Postgres source code.
That, that's one thing.
Qian: Yeah, I think another thing
is about, like, how to ho- better
s- even better support for larger
larger blobs or larger columns.
when you-- when people are using DBOS,
sometimes they want to checkpoint, say, a
PDF or something as part of the output.
And still I know Postgres has some good
support for larger blobs right now.
But I think most of the time, we still
recommend people to say "Upload your
large documents to S3, then store a
pointer in the database." But that still
leaves, a little bit gap in the durable
checkpointing, because there could be
the case where you upload something
but you don't checkpoint or vice versa.
It'll be great if we can really put
more, like, larger data into Postgres.
Michael: There is a nice change,
I think, coming in 19 around that
in that the, I think the default
TOAST compression is changing from
like a, an older PGLZ, like a
Postgres specific compression
algorithm to, I think it's LZ4.
but yeah only minor on, on
the grand scheme of things.
nice one
Nik: Yeah.
And speaking of notify, I think, yes,
global lock is still there, not removed.
I remember some work
last year in PostgreSQL
Peter: There was work in 19 on
improving the performance of
broadcast, of the notify broadcast
when not all listeners are listening
for all messages, which is great.
That's a real performance improvement.
The global lock is much harder to get rid
of, and I'm not sure if it's possible.
But that is…
Nik: work on removing that lock.
I remember that, that work.
I also remember I just founded my
email to document, as you said,
the limitations from July 10, 2025.
Nobody answered my email.
So there is a patch proposed.
Let's document it at least.
Yeah,
Peter: Yeah, the I, certainly 19 doesn't
include any work on the global lock.
Maybe there's some in
development for 20, I'm not
Nik: Yeah.
Yeah.
Yeah.
It's worth checking.
And that documentation should be changed.
I agree with you.
So maybe someone listening to us will
go and comment on that proposal, and
we will get it documented at least.
Great.
Thank you so much.
I enjoyed it a lot.
I wish you all the best
with this wonderful product.
I'm going to try it in a couple
of places, and I encourage
our listeners to try it out.
Especially it's open source, so
it's so easy to start, right?
Thank you
Michael: Nice one.
Thanks very much, both of you
Peter: Yeah, thanks a lot
Nik: Yeah, have a great week.
Qian: You
too.
Nik: Bye-bye