获取 QuestDB 表更改通知的最佳方式是什么?我已经搜索了文档,但我所能找到的只是对 QuestDB 的引用:“变更数据捕获的目的地”。我想要的是相反的。我想知道数据何时进入 QuestDB。 目前我正在做我的长民意调查版本,每隔几秒钟我就打电话给
select * from table where timestamp > latest_known_timestamp
。但这有一些缺点,例如不知道数据是否已更新/更新插入而不是附加,或者在极少数情况下数据会晚到并且在我的轮询间隔已经过去之后才到达。
wal_transactions('table_name')
。
此功能提供最新数据库事务的详细信息。这包括一些可能有用的关键字段。sequencerTxn
timestamp
walId
segmentId
segmentTxn
structureVersion
minTimestamp
maxTimestamp
rowCount
alterCommandType
默认情况下,
minTimestamp
、
maxTimestamp
和rowCoun
字段将始终为空。为了纠正这个问题,我们可以设置以下配置:cairo.default.sequencer.part.txn.count=180000
这设置了在滚动之前该表中保留的事务数量。当数量超过180k时,表将被截断。一天有 86400 秒,因此根据您向 QuestDB 发送事务的频率,示例中的 180K 数字可能太大/太小。您可以根据需要调整此数字。
然后,您的应用程序可以读取此表,并使用元数据来了解行何时被插入到数据库中。如果您只需要知道插入的行以及插入的行数,则不需要其他任何内容。如果您还想从新行中获取数据,则始终可以从原始表中进行选择。请注意,这仅在附加数据并且您没有无序数据或更新时才有效。如果您确实有无序数据或更新,您仍然会知道在哪个时间戳范围内进行了更改(通过
minTimestamp
maxTimestamp
)以及有多少行受到影响 (
rowCount
)。
解决此问题的一种方法是添加审核时间戳,即 Updated_at 或与表类似的时间戳。这可以在应用程序端通过发送当前时间戳或使用
now()
作为 Postgres INSERT
语句的一部分来设置。
拉取新行时,您可以拉取最小和最大时间戳定义的范围,然后按此审核时间戳过滤它们。