Mongo 作为循环缓冲区

时间:2021-06-16 08:51:03

标签: mongodb circular-buffer

我正试图找出一种将 Mongo 用作循环缓冲区的方法。 目前使用 SQL Lite 但性能方面不适合我们的情况。 需要满足的规格是: 集合必须每 x 秒清空一次。 当满足 y 个文档的限制时,集合必须自行清空。

通过 Mongo 文档,限制集合和更改事件似乎是一种方法。

https://docs.mongodb.com/manual/core/capped-collections/

https://docs.mongodb.com/manual/reference/change-events/

在文档中指出:“上限集合的工作方式类似于循环缓冲区”

但是我不知道如何:

  1. 每 x 秒清空一次集合。 Mongo TTL 功能不可行,因为有上限的集合不支持 TTL。其他替代方案?
  2. 检索任何“已删除的文档”。 替换操作类型的更改事件似乎是一种方法。其他替代方法?

有没有人试过使用 Mongo 作为循环缓冲区? 上面的-Capped Collections/Change Events- 是实现它的方法吗?

感谢您的回复。

1 个答案:

答案 0 :(得分:1)

来自https://en.wikipedia.org/wiki/Circular_buffer

<块引用>

循环缓冲区 [...] 是一种数据结构,它使用单个固定大小的缓冲区,就像端到端连接一样。

恐怕您引用的“上限集合的工作方式类似于循环缓冲区”正是使用了循环缓冲区的这个定义。

上限集合受文档大小和/或数量的限制。旧文件不是由计时器删除,而是由新文件删除。把它想象成新文件覆盖旧文件。

不幸的是,此功能无法从集合 https://docs.mongodb.com/manual/core/capped-collections/#document-deletion 中删除文档。既不是通过 TTL 也不是明确的。并且由于没有正式删除,因此变更流中没有删除事件。

简单来说,如果您需要检索从缓冲区驱逐的文档,您需要自己实现。

TTL 索引可能适合您,但它是有时间限制的,而不是大小限制。它将向变更流发出删除事件,但需要考虑以下三点:

  • 您需要保持 changestream 客户端运行以确保捕获所有事件。
  • TTL 索引过程是有成本的。 Mongodb 每分钟都会运行 TTL Monitor 线程来删除过时的文档。它消耗资源。不如 sqlite,但系统性能可能会下降,并且如果它忙于其他一些操作,文档可能不会在指定的时间后完全删除。

建议您自己控制和选择/删除文档。我知道您已经有一些使用 sqlite 的实现,因此只需将其调整为使用 mongodb。

db.collection.find({}).sort({_id:-1}).limit(1)

将返回给您最旧的文档。它使用默认索引并且应该表现良好。