Связь между языком и масштабируемостью - PullRequest
2 голосов
/ 02 декабря 2009

Я обнаружил следующее утверждение в Trapexit, веб-сайте сообщества Erlang:

Erlang - используемый язык программирования построить масштабируемый софт системы реального времени с требованиями к высокая доступность.

Также я вспоминаю, что читал где-то, что Twitter перешел с Ruby на Scala для решения проблемы масштабируемости.

Следовательно, мне интересно, какова связь между языком программирования и масштабируемостью?

Я бы подумал, что масштабируемость зависит только от конструкции системы, обработки исключений и т. Д. Это из-за того, как реализован язык, библиотеки или по каким-то другим причинам?

Надежда на просветление. Спасибо.

Ответы [ 8 ]

7 голосов
/ 02 декабря 2009

Erlang высоко оптимизирован для телекоммуникационной среды, работает без перебоев 5 9 с или около того.

Он содержит набор библиотек, называемых OTP, и можно загружать код в приложение «на лету», не закрывая приложение! Кроме того, существует структура модулей супервизора и т. Д., Так что, когда что-то выходит из строя, оно автоматически перезапускается, иначе сбой может постепенно работать сам по цепочке, пока не дойдет до модуля супервизора, который сможет с этим справиться.

Это возможно и на других языках. В C ++ вы можете перезагрузить dll на лету, загрузить плагин. В Python вы можете перезагрузить модули. В C # вы можете загружать код на лету, использовать отражение и т. Д.

Просто эта функциональность встроена в Erlang, что означает:

  • это более стандартно, любой разработчик Erlang знает, как это работает
  • меньше вещей для самореализации

Тем не менее, между языками существуют некоторые фундаментальные различия в том, что некоторые интерпретируются, некоторые запускаются с помощью байт-кода, некоторые компилируются в нативном режиме, поэтому производительность, доступность информации о типах и т. Д. Во время выполнения отличаются.

Python имеет глобальную блокировку интерпретатора вокруг своей библиотеки времени выполнения, поэтому не может использовать SMP.

Эрланг только недавно добавил изменения для использования SMP.

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

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

4 голосов
/ 02 декабря 2009

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

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

Затем вы понимаете, что нужно автоматически перезапускаться при обнаружении сбоя. И кто-то понимает, что при первом обнаружении чего-то не совсем правильного следует «сбиться», чтобы вызвать перезапуск. Восстановление должно быть оптимизировано, а возможные потери информации должны быть минимальными.

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

Большинство из этих стратегий в форме библиотек в Erlang. Часть, которая является языковой особенностью, состоит в том, что процессы могут «связывать» и «контролировать» друг друга. Первый - это двунаправленный контракт, который «если вы терпите крах, то я получаю ваше сообщение о сбое, которое, если не попадет в ловушку, сломает меня», а второе - «если вы терпите крах, я получаю сообщение об этом».

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

Полная изоляция между кучами процессов - еще одна причина, по которой Эрланг хорошо себя чувствует. За немногими исключениями невозможно «разделить ценности» между процессами. Это означает, что все процессы очень автономны и часто не подвержены сбою другого процесса. Это свойство также сохраняется между узлами в кластере Erlang, поэтому маловероятно обрабатывать сбой узла из кластера. Реплицируйте и отправляйте события изменений, а не используйте одну точку отказа.

Философии, принятые Эрлангом, имеют много названий: «быстрый отказ», «система только при сбое», «ориентированное на восстановление программирование», «выявление ошибок», «микро-перезапуск», «репликация», ...

2 голосов
/ 02 декабря 2009

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

1) Масштабируемость должна быть определена относительно материальной метрики. Я предлагаю деньги .

S = количество пользователей / стоимость

Без адекватного определения мы обсудим этот момент ad vitam eternam . Используя мое предложенное определение, становится легче сравнивать реализации системы. Чтобы система была масштабируемой (читай: прибыльной), тогда:

Масштабируемость растет с S

2) Система может быть выполнена в масштабе, основанном на 2 основных осях:

  • а) Вертикальный
  • б) Горизонтальный

a) Вертикальное масштабирование относится к расширению узлов в изоляции, то есть к большему серверу, большему объему оперативной памяти и т. Д.

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

(Узел => физическое разделение, отличное "разделение судьбы" от другого)

Термин масштабируемость слишком часто используется, к сожалению .


Слишком часто люди путают язык с библиотеками и реализацией . Это все разные вещи. То, что делает язык подходящим для конкретной системы, часто связано с поддержкой этого языка: библиотеками, инструментами разработки, эффективностью реализации (т. Е. Объемом памяти, производительностью встроенных функций и т. Д.). )

В случае с Erlang, он просто был разработан с реальными ограничениями (например, распределенная среда, сбои, необходимость в доступности, чтобы удовлетворить воздействие ликвидированных убытков и т. Д.) В качестве входных требований.

В любом случае, я мог бы продолжать здесь слишком долго.

2 голосов
/ 02 декабря 2009

Erlang - это язык, разработанный с учетом параллелизма. В то время как большинство языков зависят от ОС для многопоточности, параллелизм встроен в Erlang. Программы Erlang могут состоять из тысяч или миллионов чрезвычайно легких процессов, которые могут выполняться на одном процессоре, могут выполняться на многоядерном процессоре или могут работать в сети процессоров. Erlang также имеет поддержку на уровне языка для передачи сообщений между процессами, отказоустойчивости и т. Д. Ядро Erlang - это функциональный язык, а функциональное программирование - лучшая парадигма для построения параллельных систем.

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

1 голос
/ 02 декабря 2009

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

Такие языки, как ruby ​​и python, имеют некоторые особенности, которые отлично подходят для прототипирования и творчества, но ужасны для крупномасштабных проектов. Возможно, их лучшими особенностями являются отсутствие «формальности», что вредит вам в крупных проектах.

Например, статическая типизация мешает мелочам типа сценария и делает языки наподобие Java очень многословными. Но в проекте с сотнями или тысячами классов вы можете легко увидеть типы переменных. Сравните это с картами и массивами, которые могут содержать разнородные коллекции, где, как потребитель класса, вы не можете легко определить, какие данные он содержит. Подобные вещи усложняются по мере того, как системы становятся больше. например Вы также можете делать вещи, которые действительно сложно отследить, например, динамически добавлять биты в классы во время выполнения (это может быть забавно, но кошмарно, если вы пытаетесь выяснить, откуда берется часть данных) или вызывать методы, которые вызывают исключения без принуждения компилятором объявлять исключение. Не то чтобы вы не могли решить такие проблемы с хорошим дизайном и дисциплинированным программированием - это просто сложнее.

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

1 голос
/ 02 декабря 2009

Сначала вы должны различать языки и их реализации. Например, язык ruby ​​поддерживает потоки, но в официальной реализации поток не будет использовать многоядерные чипы.

Затем язык / реализацию / алгоритм часто называют масштабируемым , когда он поддерживает параллельные вычисления (например, через многопоточность) И если он демонстрирует хорошее увеличение скорости при увеличении числа ЦП (см. Amdahl) Закон).

Некоторые языки, такие как Erlang , Scala , Oz и т. Д. Также имеют синтаксис (или хорошую библиотеку), которые помогают писать ясный и красивый параллельный код.

0 голосов
/ 10 декабря 2009

Erlang в своей основе основан на асинхронной связи (как для совместно расположенных, так и для распределенных взаимодействий), и это является ключом к масштабируемости, возможной благодаря платформе. Вы можете программировать с асинхронной связью на многих платформах, но язык Erlang и инфраструктура Erlang / OTP обеспечивают структуру, которая делает его управляемым - как технически, так и в вашей голове. Например: без изоляции, обеспечиваемой процессами эрланга, вы выстрелите себе в ногу. С механизмом связи / мониторинга вы можете быстрее реагировать на сбои.

0 голосов
/ 02 декабря 2009

Твиттер переключил некоторые части своей архитектуры с Ruby на Scala, потому что, когда они начинали, они использовали не тот инструмент для работы. Они использовали Ruby on Rails - который сильно оптимизирован для создания веб-приложений CRUD для «зеленых полей» - для создания системы обмена сообщениями. AFAIK, они все еще используют Rails для CRUD-частей Twitter, например. создать новую учетную запись пользователя, но переместить компоненты обмена сообщениями в более подходящие технологии.

...