Усовершенствованный `confirmed_flush_lsn` в PostgreSQL 18 без таблицы пульса, когда `pgoutput` пропускает пустые транзакJAVA

Программисты JAVA общаются здесь
Anonymous
Усовершенствованный `confirmed_flush_lsn` в PostgreSQL 18 без таблицы пульса, когда `pgoutput` пропускает пустые транзак

Сообщение Anonymous »

После обновления до PostgreSQL 18 pgoutput больше не отправляет BEGIN/ для транзакций, которые касаются только таблиц за пределами публикации. Это сделано специально (см. соответствующий вопрос). Подтвержденный_flush_lsn нашего слота репликации перестает продвигаться во время рабочих нагрузок со многими такими «пустыми» транзакциями.
Мы используем специального потребителя Spring Boot, читающего из логического слота репликации через PGReplicationStream (

Код: Выделить всё

pgoutput
, proto_version=4). Подтвержденный LSN выдвигается только тогда, когда мы получаем и обрабатываем сообщения из потока.
Мы уже пробовали/исключили:
  • Таблица Heartbeat (вне публикации)
    Запись в фиктивную таблицу, отсутствующую в публикации, используемой для генерации BEGIN/ пары в PG17. PG18 полностью исключает эти пары, поэтому подход мертв.
  • Таблица Heartbeat внутри публикации
    Работает механически, но мы пересылаем все декодированные сообщения в Kafka, поэтому каждая запись Heartbeat создает ложное событие изменения, которое потребители должны отфильтровывать. Мы хотим избежать загрязнения темы Кафки.
  • Код: Выделить всё

    status-interval-sec > 0
    (периодические обновления статуса ожидания)[/b]
    Дополнительные возможности write_lsn/

    Код: Выделить всё

    flush_lsn
    в pg_replication_slots, но не продвигает подтвержденный_flush_lsn, что нам действительно нужно для предотвращения накопления WAL.
Есть ли способ продвигать подтвержденный_flush_lsn в слот логической репликации pgoutput в PostgreSQL 18 без таблицы контрольных сигналов при рабочей нагрузке состоит в основном из транзакций вне публикации?
В частности, я ищу:
  • Опцию WAL sender / pgoutput (опция слота, proto_version, параметр публикации и т. д.), которая заставляет сервер выдавать какой-то периодический маркер позиции или поддерживать активность, которая содержит текущую позицию WAL — то, что клиент может использовать для вызоваstream.setFlushedLSN() / stream.forceUpdateStatus() осмысленно.
  • Или механизм на стороне сервера (GUC, команда репликации и т. д.) для периодической очистки слота до текущей позиции WAL без необходимости видимого для клиента события изменения.
Среда:
  • PostgreSQL 18.2
  • Драйвер JDBC 42.7.x, PGReplicationStream
  • Код: Выделить всё

    pgoutput
    , proto_version=4
  • Java 17 / Spring Boot 2.4.13

Вернуться в «JAVA»