Most active commenters
  • williamdclt(5)
  • gunnarmorling(3)
  • cryptonector(3)

←back to thread

570 points davidgu | 14 comments | | HN request time: 1.031s | source | bottom
Show context
cpursley ◴[] No.44525353[source]
Right, plus there's character limitations (column size). This is why I prefer listening to the Postgres WAL for database changes:

https://github.com/cpursley/walex?tab=readme-ov-file#walex (there's a few useful links in here)

replies(3): >>44525747 #>>44526330 #>>44526350 #
1. williamdclt ◴[] No.44525747[source]
I found recently that you can write directly to the WAL with transactional guarantees, without writing to an actual table. This sounds like it would be amazing for queue/outbox purposes, as the normal approaches of actually inserting data in a table cause a lot of resource usage (autovacuum is a major concern for these use cases).

Can’t find the function that does that, and I’ve not seen it used in the wild yet, idk if there’s gotchas

Edit: found it, it’s pg_logical_emit_message

replies(3): >>44526012 #>>44528978 #>>44533458 #
2. cyberax ◴[] No.44526012[source]
One annoying thing is that there is no counterpart for an operation to wait and read data from WAL. You can poll it using pg_logical_slot_get_binary_changes, but it returns immediately.

It'd be nice to have a method that would block for N seconds waiting for a new entry.

You can also use a streaming replication connection, but it often is not enabled by default.

replies(1): >>44526264 #
3. williamdclt ◴[] No.44526264[source]
I think replication is the way to go, it’s kinda what it’s for.

Might be a bit tricky to get debezium to decode the logical event, not sure

replies(2): >>44527457 #>>44528991 #
4. cyberax ◴[] No.44527457{3}[source]
Sure, but the replication protocol requires a separate connection. And the annoying part is that it requires a separate `pg_hba.conf` entry to be allowed. So it's not enabled for IAM-based connections on AWS, for example.

pg_logical_slot_get_binary_changes returns the same entries as the replication connection. It just has no support for long-polling.

5. gunnarmorling ◴[] No.44528978[source]
pg_logical_emit_message() is how I recommend users on Postgres to implement the outbox pattern [1]. No table overhead as you say, no need for housekeeping, etc. It has some other cool applications, e.g. providing application-specific metadata for CDC streams or transactional logging, wrote about it at [2] a while ago. Another one is making sure replication slots can advance also if there's no traffic in the database they monitor [3].

[1] https://speakerdeck.com/gunnarmorling/ins-and-outs-of-the-ou...

[2] https://www.infoq.com/articles/wonders-of-postgres-logical-d...

[3] https://www.morling.dev/blog/mastering-postgres-replication-...

replies(2): >>44529870 #>>44533192 #
6. gunnarmorling ◴[] No.44528991{3}[source]
Debezium handles logical decoding messages OOTB. There's also an SMT (single message transform) for decoding the binary payload: https://debezium.io/documentation/reference/stable/transform....
7. williamdclt ◴[] No.44529870[source]
Ha, your [2] is how I learnt about it! Thanks :)
8. brightball ◴[] No.44533192[source]
You know, this would be a great talk at the 2026 Carolina Code Conference...
replies(1): >>44542105 #
9. cryptonector ◴[] No.44533458[source]
`pg_logical_emit_message()` is great and better than `NOTIFY` in terms of how it works, but...

`pg_logical_emit_message()` perpetuates/continues the lack of authz around `NOTIFY`.

replies(1): >>44533495 #
10. williamdclt ◴[] No.44533495[source]
What do you mean by this? What authz would you expect/like?
replies(1): >>44535874 #
11. cryptonector ◴[] No.44535874{3}[source]
I'd like to say that only some roles can NOTIFY to some channels. Similarly for alternatives to LISTEN/NOTIFY.
replies(1): >>44541453 #
12. williamdclt ◴[] No.44541453{4}[source]
Right. It’s not something I’ve had to handle, I’ve always worked in environments where db clients are well behaved and under my control, what’s your use case out of interest?
replies(1): >>44546833 #
13. gunnarmorling ◴[] No.44542105{3}[source]
Ha, that's interesting :) Do you have any more details to that one?
14. cryptonector ◴[] No.44546833{5}[source]
Security in depth. If I have to give someone login access, I should be able to control what they do.