Если бы вы переопределили твиттер, что бы вы сделали по-другому?
Я только что увидел веселый "Взлет и падение Twitter", который заставил меня задуматься:
если бы вы переопределили твиттер, что бы вы сделали по-другому?
Какие технологии вы бы использовали? Какие языки?
Как вы обеспечиваете масштабируемость сервиса?
Что еще вы бы изменили?
5 ответов
Я бы реализовал это на GAE, вот так:
У каждого пользователя будет таблица с твитами подписчиков. Эта таблица будет иметь ключ (пользователь, временная метка по убыванию).
У каждого пользователя также есть таблица follower_ranges, которая отображает пользователя в набор смежных диапазонов идентификаторов подписчиков. Для большинства пользователей, у которых всего несколько тысяч подписчиков, в этой таблице будет одна запись (-inf..+inf); это будет подразумеваемое значение по умолчанию. Для пользователей с большим количеством подписчиков каждый диапазон в таблице будет иметь несколько тысяч пользователей. Диапазоны будут сбалансированы с течением времени, чтобы число пользователей в каждом из них оставалось в пределах некоторого интервала, например, больше 1000, меньше 10000. Объединение всех диапазонов будет включать все идентификаторы пользователей.
Всякий раз, когда создается операция user -> follower, она кодируется как действие и добавляется в очередь. Каждый элемент в очереди - это кортеж (отправитель, действие, полезная нагрузка, подчиненный поддиапазон). Работники очереди берут предмет, находят всех последователей в данном поддиапазоне и применяют действие к каждому из них. (Обратите внимание, что действие может быть "добавить твит", "удалить твит", "редактировать твит" и т. Д. В основном все, что необходимо применить ко всем подписчикам.)
Применение действия очереди к каждому подписчику будет связано с выдачей соответствующих записей и удалений в таблицу твитов каждого пользователя. Барьер в очереди будет означать, что запись не будет появляться мгновенно, но должна быть возможность удерживать задержку ниже нескольких секунд.
Показывать пользователю их твиты будет дешевой операцией: "ВЫБЕРИТЕ * ИЗ ТИПОВ, ГДЕ user_id =:user_id ORDER BY (made_at DESC) LIMIT:max_per_page". Это отсканирует одну таблицу и будет очень быстрой операцией. (Снизить задержку блокировки пользователя - это хорошо!)
Я думаю, что этот дизайн изначально неплохо масштабируется. Каждый компонент системы теперь можно легко масштабировать:
- Хранилище очереди может быть поддержано GAE и масштабировано согласно любой таблице хранилища данных
- Внешние интерфейсы можно масштабировать естественным образом, и нет необходимости в липкости
- Больше процессоров очереди может быть добавлено в любое время
- Фактические таблицы хранения будут расти естественным образом и должны масштабироваться в Datastore.
Тем не менее, я могу придумать пару будущих улучшений, которые я хотел бы рассмотреть сразу:
- Уменьшите хранение редко показанных данных. Этот дизайн денормализует каждый твит в копию для каждого подписчика. Однако обычно доступны только самые последние твиты. Удалив пользовательскую копию твитов после того, как им исполнилось N дней, мы сможем восстановить большой объем памяти. Если пользователь пытается просмотреть что-то из древней истории, мы получаем данные из денормализованных таблиц. Это будет медленнее, но не будет происходить слишком часто, и экономия будет значительной. Экономия памяти: (#avg_followers - 1) / #avg_followers
- Шаблон записи неоптимален. Через несколько элементов очереди каждый работник очереди будет писать в таблицу твитов каждого пользователя, таким образом, расположение записей будет не очень хорошим. (В худшем случае, у нас будут #processor * #storage серверные соединения.) Это можно исправить, применив несколько обновлений для каждого диапазона пользователей. Например, если два действия A и B должны применяться к диапазону [0, 10000), то один обработчик очереди может применить эти два действия одновременно.
- Это уже делается, Часть II - Месть: http://identi.ca/ (которая находится над Лаконикой)
- Это уже делается Часть III - С темной стороны: yammer
VBG! (-:
Я начну с предпосылки вернуться к этому снова и снова: что бы я сделал по-другому, был ли я тогда в твиттере?
Ничего.
Твиттер продолжал сосредотачиваться на том, что имеет значение: предоставление услуги, которую люди действительно хотят использовать
Я хотел бы поработать над продуктом, который стал настолько популярным за такой короткий период времени, что его самой большой угрозой стала его собственная масштабируемость. Это значит, что ты выиграл. С успехом приходят ресурсы и внимание, чтобы извлечь выгоду из успеха.
Я бы с самого начала разработал его масштабируемый как ад.
Я выбрал бы платформу Microsoft, C#, IIS, SQL Server, Memcached (или Velocity, если он окончательный и работает хорошо, когда я начинаю;-)