Подтвердить что ты не робот

Почему не удалось изменить масштаб, добавив серверы таким сайтам, как facebook?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Я думаю, что это видео - лучший ответ на ваш вопрос:

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

Ответ 6

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

Ответ 7

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

По большей части, однако, добавление серверов не увеличивает производительность линейно (т.е. 10 серверов не в 10 раз быстрее, чем 1 сервер), а это означает, что любой выигрыш, который вы можете сделать на одном сервере, будет иметь гораздо большее влияние чем просто добавление серверов. Это не похоже на то, что у Twitter нет кучи серверов, не так ли?