Как Trello показывает историю так быстро?

Trello показывает исторический журнал всего, что любой пользователь сделал с момента создания Совета. Аналогично, если вы нажмете на определенную карту, она покажет историю всего, что кто-либо сделал, связанного с этой картой.

отслеживание каждого изменения / добавления / удаления, которое хранится бесконечно, должно собирать тонну данных, а также потенциально узкое место при записи в журнал истории (при условии, что он сразу записывается в хранилище данных). Я имею в виду, это не похоже на них хранят все в файлах журналов, разбросанных по 1000-м серверам, которые они собирают и анализируют только тогда, когда им нужно что-то найти-они отображают всю эту информацию все время.

Я знаю, что это не единственная услуга, которая предоставляет что-то вроде этого, но как бы вы могли создать такую систему?

3 ответов


Я в команде Trello. Мы используем коллекцию действий в нашем экземпляре MongoDB с составным индексом на идентификаторах моделей, к которым он относится (карта является моделью, а также членом) и датой выполнения действия. Нет причудливого кэширования или чего-либо еще, за исключением того, что индекс и недавно использованные документы хранятся в памяти БД. Акции-Наша самая большая коллекция.

стоит отметить, что большая часть данных, необходимых для отображения действия, хранится денормализовано в документе действия, так что значительно ускоряет процесс.


самый простой способ, который приходит на ум, - это иметь таблицу типа:

create table HistoryItems (
ID INT PK,
UserID INT PK,
DateTime datetime,
Data varbinary(max)/varchar(max)/...)

индексирование этого на UserID позволяет быстро извлекать. Индекс покрытия позволит получать историю всего пользователя на одном диске независимо от того, как долго он находится.

эта таблица может быть кластеризована (UserID asc, DateTime desc, ID), поэтому вам даже не нужно иметь любой индекс вообще и по-прежнему имеют оптимальную производительность.

любая легкая проблема для реляционного база данных.


у меня есть что-то очень похожее на @Brett из Trello Ответил выше в моем PHP + MySQL приложение, которое я использую для отслеживания активности пользователей в нашем заказе и управления производством приложение для нашего интернет-магазина.

у меня есть таблица деятельности, который содержит:

  • user_id: пользователя, который выполнил действие
  • action_id: действие, которое было выполнено (например, создание, обновление, удаление и так далее...)
  • resource: перечисление список ресурсов (модели) это действие было выполнено (например, заказы, счета-фактуры, продукты и т. д...)
  • resource_id: PK ресурса, на котором было выполнено действие
  • description: текстовое описание действия (может быть null)

это действительно большая таблица, но с правильными индексами она очень хорошо справляется. Он действует, это цель. Это просто и быстро. В настоящее время он держит 200k рекордов и растет с cca. 1000 новых записей в день.