Mongo作为循环缓冲区



我正试图找到一种将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作为循环缓冲区吗?上面的上限集合/变更事件是实现它的方法吗?

感谢您的回复。

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

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

恐怕;带帽集合的工作方式类似于循环缓冲区";您引用的正是循环缓冲区的定义。

有上限的集合按文档的大小和/或数量设置上限。旧文档不会被计时器删除,而是被新文档删除。把它想象成新文档覆盖旧文档。

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

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

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

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

建议您自己控制并选择/删除文档。我知道您已经有了一些使用sqlite的实现,所以只需要将其调整为使用mongodb即可。

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

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