Если бы вы повторно реализовали твиттер, что бы вы сделали по-другому?

Я только что увидел веселый «Взлет и падение Twitter», который заставил меня задуматься:

если бы вы повторно реализовали твиттер, что бы вы сделали по-другому?

Какие технологии вы бы использовали? Какие языки?

Как обеспечить масштабируемость сервиса?

Что бы вы еще изменили?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
456
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Это уже делается: Лаконика

Я бы с самого начала спроектировал его чертовски масштабируемым.

Я бы выбрал платформу Microsoft, C#, IIS, SQL Server, Memcached (или Velocity, если он окончательный и работает хорошо при запуске ;-)

Причина, по которой Twitter было трудно масштабировать, заключалась в использовании SQL. Использование SQL означает, что вам нужно будет разбить или разбить вашу базу данных на сегменты для масштабирования. Это не очень хорошо работает для варианта использования Twitter, плюс, если вы используете SQL-сервер, вам придется платить за новую лицензию на каждой машине.

0124816 18.09.2008 07:47

Вы правы, проблема заключалась в том, что они использовали SQL, а не сам SQL, и что плохого в том, чтобы платить деньги за то, что помогает вам вести их бизнес? Считаете ли вы, что на платформе MS невозможно запустить такое приложение, как Twitter? Это определенно.

JRoppert 27.09.2008 20:13
  1. Это уже делается. Часть II - Месть: Identi.ca (которая находится над Лаконикой)
  2. Это уже делается. Часть III - Темная сторона: болтовня

VBG! (-:

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

Ничего.

Твиттер по-прежнему сосредоточился на самом важном: предоставлении услуги, которой на самом деле могут пользоваться люди хотеть.

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

Масштабируемость может быть проблемой «высокого класса», но это все еще проблема. Его спорно, но многие утверждают, что Friendster уступило свое место в социальной сети № 1 в связи, по крайней мере, частично, в его неспособности масштаба.

sanity 18.09.2008 08:23
Ответ принят как подходящий

Я бы реализовал это на GAE, вот так:

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

У каждого пользователя также есть таблица follower_ranges, которая сопоставляет пользователя с набором непрерывных диапазонов идентификаторов последователей. Для большинства пользователей, у которых всего несколько тысяч подписчиков, в этой таблице будет одна запись (-inf .. + inf); это будет подразумеваемым значением по умолчанию. Для пользователей с большим количеством подписчиков каждый диапазон в таблице будет иметь несколько тысяч пользователей. Диапазоны будут сбалансированы с течением времени, чтобы количество пользователей в каждом оставалось в пределах некоторого интервала, например больше 1000, меньше 10000. Объединение всех диапазонов будет включать все идентификаторы пользователей.

Всякий раз, когда создается операция пользователь -> подписчик, она кодируется как действие и добавляется в очередь. Каждый элемент в очереди представляет собой кортеж (отправитель, действие, полезная нагрузка, подчиненный поддиапазон). Работники очереди берут предмет, находят всех последователей в данном поддиапазоне и применяют действие к каждому из них. (Обратите внимание, что действие может быть «добавить твит», «удалить твит», «отредактировать твит» и т. д. В основном все, что нужно будет применить ко всем подписчикам.)

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

Показывать пользователю их твиты будет дешевой операцией: «ВЫБРАТЬ * ИЗ твитов WHERE user_id =: user_id ORDER BY (created_at DESC) LIMIT: max_per_page». Это просканирует одну таблицу и будет очень быстрой операцией. (Уменьшение задержки блокировки пользователей - это хорошо!)

Думаю, изначально этот дизайн неплохо масштабировался. Теперь каждый компонент системы можно легко масштабировать:

  • Хранилище очереди может поддерживаться GAE и масштабироваться в соответствии с любой таблицей хранилища данных.
  • Интерфейсы можно масштабировать естественным образом, и нет необходимости в липкости
  • Дополнительные процессоры очереди могут быть добавлены в любое время
  • Фактические таблицы хранения будут расти естественным образом и должны хорошо масштабироваться в Datastore.

Тем не менее, я могу придумать пару будущих улучшений, на которые я бы сразу обратился:

  • Уменьшите объем хранилища редко отображаемых данных. Этот дизайн денормализует каждый твит в копию для каждого подписчика. Однако обычно доступны только самые последние твиты. Удаляя индивидуальную копию твитов по прошествии N дней, мы можем восстановить большой объем хранилища. Если пользователь пытается просмотреть что-то из древней истории, мы получаем данные из денормализованных таблиц. Это будет происходить медленнее, но не слишком часто, и экономия будет значительной. Экономия места на диске: (#avg_followers - 1) / #avg_followers
  • Схема записи неоптимальна. В нескольких элементах очереди каждый работник очереди будет писать в таблицу твитов каждого пользователя, поэтому локальность записи будет не очень хорошей. (В худшем случае у нас будет #processor * #storage server connections.) Это можно исправить, применив несколько обновлений для каждого диапазона пользователей. Например, если два действия A и B должны быть применены к диапазону [0, 10000), то пусть один процессор очереди применяет эти два действия одновременно.

Другие вопросы по теме