gpt4 book ai didi

mongodb - 我应该如何使用 MongoDB 实现 "get objects changed since"模式?

转载 作者:IT老高 更新时间:2023-10-28 13:30:38 25 4
gpt4 key购买 nike

我有一个对象集合,假设它们是“帖子”,并且可以修改这些对象。我想在客户端显示一个动态更新的列表。因此,在客户端,如果通过轮询执行此操作,客户端将调用如下 API:

getPostsChangedSince(serial)

其中 serial 可能是一个单调递增的数字,可能是一个时间戳。客户端获取自那时以来已更改的帖子列表,存储一个新的最新序列,并在下次客户端轮询时请求自该最新序列以来的更改。

我认为这个问题(关于 ASP.NET)的基本思想是相同的:How to implement "get latests changed items" with ADO.NET Data Services?

我正在尝试找到在 MongoDB 中实现此功能的最佳方法。

我喜欢将时间用于串行的想法,因为即使有多个应用服务器,它也会自动至少大部分正确地工作。序列号将存储在每个帖子对象中,并在对象被修改时更新。

基于时间戳的序列可以实现为:

解决方案中的一些不错的功能包括:

  • 确保在操作系统计时器分辨率内​​创建然后立即更新对象仍会增加序列,尽管它是相同的时间
  • 更好的是保证所有对象的全局单调增加,而不仅仅是保证更改给定对象会影响该对象上的序列(如果没有这个,getPostsChangedSince() 调用可能需要及时向后模糊,以避免丢失更改 - 以两次更改为代价)
  • mongodb 端时间戳可能会很好,因为在应用中获取时间会在获取时间与保存新对象并在查询中可用之间产生间隙
  • 使用包含旧序列号的查询使用 findAndModify() 进行更新,因此“冲突”(一次两次更改)将引发错误,允许应用重试

我意识到这里的一些极端案例有点“学术”,很可能在现实生活中被捏造。

到目前为止,我的方法是:

  • 使用日期类型作为序列号
  • 修改对象时,获取当前时间,如果它与对象的旧序列匹配,则添加 1 毫秒(是的,如果您快速进行两次修改而不从 mongodb 重新获取,这会中断,但这似乎没问题)
  • 使用 findAndModify(),但基于 https://jira.mongodb.org/browse/JAVA-276可能无法检测它是否最终找不到任何要修改的内容(即第二个更改被忽略,以防发生冲突)

问题:

  • 我觉得我应该改用 Timestamp;真的?有什么缺点吗?
  • 如果您有一个 mongo 集群,以毫秒为单位的时间可能比 Timestamp 的以秒为单位的时间加一个数字更独特和正确,而使用一个 mongod Timestamp 更独特?
  • 有没有办法检测 findAndModify() 是否更新了什么?
  • 对此问题有任何一般性建议/经验吗?你会怎么做?

最佳答案

您是否考虑过“外部化”序列号生成器? MongoDB 精度的时间很好,但在涉及多台机器时可能会变得难以同步。一种选择是您可以使用 memcached 或类似的基于内存、速度极快且可以序列化的工具(memcached 具有 CAS 操作)。

所以你要做的就是在 memcached 中存储一个“种子”,用一个键说,计数器。每次应用需要执行插入操作时,它都会从 memcached 中获取下一个数字并递增计数器。

再想一想,您甚至可以取消 memcached,而只使用只有计数器的单行(抱歉文档)集合。您可以获取计数器并将其递增,这将是一个非常快速的操作,模仿 memcached。

然后自然地,您可以适本地索引数据。但是,我想知道这会导致索引非常不平衡(右侧倾斜)。根据具体情况,探索使用上限收集可能是值得的。因此,当您将数据插入主集合时,还要将其插入上限集合并从该集合中读取数据。

关于mongodb - 我应该如何使用 MongoDB 实现 "get objects changed since"模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5759782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com