我想标题很混乱,但我找不到更好的。
我在 MongoDB 中有一个事件流,有多个生产者和一个消费者。为了确保我以正确的顺序准确读取每个事件一次,我使用 MongoDB 时间戳类型作为递增值,由服务器填充。在 SQL 世界中,我可能会使用自动递增的整数。
我的消费者只是轮询 MongoDB 并询问自它看到的最后一个时间戳以来的所有事件。在其中一种环境中,我们意识到有时消费者不会处理所有事件。它不会经常发生,就像错过了 50.000 个事件之一,但理想情况下它根本不应该发生。
我的假设是 MongoDB 在内部做了类似的事情。
ParseDocument(doc);
lock
{
SetTimestamp(doc);
}
WriteDocument(doc);
UpdateIndex(doc);
因此,当消费者查询事件时,可能会在很短的时间内无法使用文档,因为只有事件 #1、#2 和 #4 被写入,而事件 #3 在几分之一毫秒后写入.
我已经在 Docker 中使用 C# 客户端和 MongoDB 4.2 看到了这一点,但我想客户端在这里无关紧要。
这个假设是否正确,如果是,我该怎么办?
我的想法是改变我的消费者以询问自最后一个时间戳减去几秒钟以来的所有事件,然后过滤掉消费者中已经收到的事件。
但是有更优雅的解决方案吗?也许某种方式来强制收集级别的写锁或事务可以帮助吗?