Почему нельзя щебетать, добавляя серверы так, как это делают такие сайты, как Facebook? - PullRequest
51 голосов
/ 17 марта 2012

Я искал объяснение того, почему Twitter пришлось перенести часть своего промежуточного программного обеспечения с Rails на Scala. Что мешало им масштабировать, как это сделал Facebook, добавляя серверы по мере расширения своей базы пользователей. Точнее, как насчет технологии Ruby / Rails, которая помешала команде твиттера воспользоваться этим подходом?

Ответы [ 7 ]

57 голосов
/ 17 марта 2012

Дело не в том, что Rails не масштабируется, а в том, что запросы на «живые» данные в Ruby (или любом интерпретируемом языке) не масштабируются, поскольку они сравнительно намного дороже с точки зрения использования процессора и памяти, чем ихскомпилированные языковые аналоги.

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

Как Basecamp Next стал настолько чертовски быстрым

Однако Twitter не отказался от Rails только за проблемы масштабирования, они сделали выборпотому что Scala, как язык, предоставляет определенные встроенные гарантии о состоянии вашего приложения, которое не могут обеспечить интерпретируемые языки: если оно компилируется, ошибки, тратящие время, такие как опечатки с ошибками, неправильные вызовы методов, неправильные объявления типов и т. д., простоне может существовать.

Для Твиттера TDD было недостаточно.Цитата из Дейкстры в Программирование в Scala иллюстрирует этот момент: «тестирование может только доказать наличие ошибок, но не их отсутствие».По мере того как их приложения росли, они сталкивались со все более и более трудными поисками ошибок.Волшебный таинственный тур становился помехой для выступлений, поэтому они сделали выбор.По большому счету, Twitter является для Scala тем же, чем Facebook для PHP (хотя Facebook использует свой сверхбыстрый препроцессор C ++, так что немного обманывает; -))

Подводя итог, Twitter сделал переход для обоихпроизводительность и надежность.Конечно, Rails, как правило, находится на переднем крае инноваций, поэтому приложения с трафиком на уровне 99%, не использующие Твиттер, всего мира могут прекрасно справляться с интерпретируемым языком (хотя сейчас я твердо стою на стороне скомпилированного языка., Scala слишком хороша!)

11 голосов
/ 17 марта 2012

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

Если вы когда-либо играли в такие игры, как Transport Tycoon или Settlers, где вам нужно перемещать ресурсы, вы узнаетевам нужно быть в курсе модернизации инфраструктуры по мере увеличения использования.

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

Бросить серверы на проблему не всегда ответ, и иногда может вызвать больше проблем.

9 голосов
/ 17 марта 2012

http://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster ссылки на ряд сообщений об изменениях, в том числе приличную историю шагов, предпринятых с течением времени.

Короткая версия заключается в том, что Ruby и Rails не обеспечивали производительностьи надежность они необходимы для обслуживания.Учитывая масштаб, это не удивительно;большинство решений COTS не подходят для сверхбольших масштабов.

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

5 голосов
/ 17 марта 2012

Они могли бы бросить больше оборудования на проблему, но это намного дороже, чем просто написание более эффективного кода.Как и многие высокоуровневые фреймворки, Ruby on Rails хорош во многих вещах, но высокая производительность не входит в их числоСкомпилированные языки всегда будут быстрее интерпретируемых языков.

1 голос
/ 09 июня 2014

Facebook (и Google) масштабируются, добавляя больше серверов, но в то же время они разбивают свое приложение на различные сервисы.Эти сервисы взаимодействуют через согласованный интерфейс и тип, и теперь они могут свободно создавать эти сервисы с использованием любой технологии, которую они считают подходящей.То, что вы читаете, что Facebook использует php, не означает, что все их серверные службы обслуживаются php (и это также не имеет смысла, поскольку в SOA вы можете выбрать любой технический стек).Это видео является лучшим ответом на ваш вопрос:

"От Ruby до JVM" https://www.youtube.com/watch?v=ohHdZXnsNi8

0 голосов
/ 22 марта 2012

Линейные усиления с параллелизмом (то есть, что такое несколько серверов) чрезвычайно редки и сильно зависят от приложения. Да, он существует - именно так GPU выполняет большую часть своей работы. Если вы обслуживаете статические страницы без состояния сеанса, это также имело бы место.

Однако, по большей части, добавление серверов не увеличивает линейно производительность (т. Е. 10 серверов не в 10 раз быстрее, чем 1 сервер), а означает, что означает, что любой выигрыш можно получить на одном Сервер будет иметь гораздо большее влияние, чем просто добавление серверов. Не то чтобы в Твиттере не было нескольких серверов, не так ли?

0 голосов
/ 19 марта 2012

Я думаю, что здесь упущен один важный бит - платформа.Да, у нас был скомпилированный аргумент против интерпретированного и несколько других.Но одним очень важным аспектом была действительно платформа.Существуют разные виртуальные машины Ruby, но ни одна из них не понравилась твиттеру, хотя и настроила их совсем немногоНо Scala работает на JVM, и инженеры в Твиттере с этим неплохо справляются.Почему они не пробовали / выбирали JRuby?Ну, я думаю, что причины, упомянутые выше, вступают в игру.

...