Trello 如何如此迅速地展示历史?
Posted
技术标签:
【中文标题】Trello 如何如此迅速地展示历史?【英文标题】:How does Trello show history so quickly? 【发布时间】:2012-05-17 08:08:26 【问题描述】:Trello 显示自董事会成立以来任何用户所做的所有事情的历史日志。同样,如果您单击特定卡片,它会显示任何人与该卡片相关的任何操作的历史记录。
跟踪无限期保存的每个更改/添加/删除必须收集大量数据,并且还可能成为写入历史跟踪日志的瓶颈(假设它被立即写入各种数据存储)。我的意思是,他们并不是将所有内容都存储在分布在 1000 台服务器上的日志文件中,他们只在需要查找某些内容时才收集和解析——他们一直在显示所有这些信息。
我知道这不是唯一提供此类服务的服务,但您将如何构建这样一个系统?
【问题讨论】:
您会惊讶于您的 RDBMS 到底有多好。日志不存储在文件中 - 它们存储在具有一些不错索引的数据库中。 【参考方案1】:我是 Trello 团队的一员。我们在 MongoDB 实例中使用 Actions 集合,在它所引用的模型的 id 上具有复合索引(Card 是模型,Member 也是)和执行操作的日期。没有花哨的缓存或任何东西,除了索引和最近使用的文档由数据库保存在内存中。 Actions 是迄今为止我们最大的集合。
值得一提的是,显示动作所需的大部分数据都以非规范化方式存储在动作文档中,因此大大加快了速度。
【讨论】:
因此,您将操作与时间戳和索引一起存储在两者上,以便您可以快速查找,如此简单!什么是“行动文件”? 我们使用 MongoDB,因此“动作文档”相当于传统关系数据库中的“动作表中的行”,但它保存的是任意 JSON 文档而不是高度结构化的数据。 @Brett,写入是否会受到影响(变慢),因为您的数据都已非规范化?【参考方案2】:想到的最简单的方法是有一个像这样的表:
create table HistoryItems (
ID INT PK,
UserID INT PK,
DateTime datetime,
Data varbinary(max)/varchar(max)/...)
在 UserID 上对此进行索引可以快速检索。覆盖索引可以在一次磁盘搜索中获取整个用户的历史记录,无论它有多长。
此表可以聚集在 (UserID asc, DateTime desc, ID) 上,因此您甚至根本不需要 任何 索引并且仍然具有最佳性能。
关系数据库的任何简单问题。
【讨论】:
也许读取并没有那么糟糕......但是将所有数据写入一个表不会有非常糟糕的锁定问题吗? 通常没有。每个事务的少量写入(这里就是这种情况)仅锁定行。插入可以以这种方式同时发生。【参考方案3】:我在我的 php + mysql 应用程序中的回答与来自 Trello 的 @Brett 非常相似,我用它来跟踪我们在线网上商店的订单和生产管理应用程序中的用户活动。
我有一些表格活动:
user_id
:执行操作的用户
action_id
:已执行的操作(例如创建、更新、删除等...)
resource
:执行操作的资源(模型)的 ENUM 列表(例如订单、发票、产品等)
resource_id
: 执行操作的资源的 PK
description
:动作的文字描述(可以为空)
这确实是一张大表,但它的索引正确,处理得非常好。它执行它的目的。简单快捷。目前它拥有 20 万条记录,并且随着 cca 的增长而增长。每天 1000 个新条目。
【讨论】:
以上是关于Trello 如何如此迅速地展示历史?的主要内容,如果未能解决你的问题,请参考以下文章