【发布时间】:2016-01-02 00:09:13
【问题描述】:
我正在尝试使用 postgres 数据库实现一个具有多个写入器和多个读取器的可靠队列。当队列读取器扫描表并在读取后提交正在进行的事务时如何避免丢失行。
我们有一个读取器使用“检查点”时间分批选择行,其中每个批次获取上一个批次中最后一个时间戳之后的行,而我们缺少行。 (原因:时间戳值基于插入发生的时间(00.00.00)。在重负载下,如果事务需要更长的时间,它会被插入,比如说 10 秒后(00.00.10),读者会错过这一行(row1) 如果它在那 10 秒内读取并找到其 INSERT 时间比 row1 更晚的时间(00.00.05) 的行。问题的完整描述类似于此博客中所写的。http://blog.thefourthparty.com/stopping-time-in-postgresql/ )
上下文相关的先前问题:Postgres LISTEN/NOTIFY - low latency, realtime?
更新:我已将问题从单个读者更新为多个读者。读者阅读的顺序很重要。
【问题讨论】:
-
所有行都按顺序处理是否至关重要?那么顺序是如何精确地定义的呢?还是您只是想避免丢失行?然后像这里介绍的解决方案应该可以工作:Postgres Update, limit 1
-
真的需要你用postgresql做这个吗?这种需求很容易被 redis 满足
-
@e4c5 是的。我们目前正在使用 postgresql,并且在负载较高时遇到了我在问题中描述的问题。
-
@ErwinBrandstetter 我相信它们必须按照时间戳的顺序排列。如果订单搞砸了,我们就会丢失行。此外,您建议的链接看起来涉及锁定的行,我担心这会严重影响吞吐量。
标签: postgresql concurrency queue