Каков наилучший способ выполнения сложных вычислительных задач в Erlang без жертв от масштабируемости?

В руководстве по взаимодействию Erlang обсуждаются различные механизмы взаимодействия. Вот мои выводы:

  • Программы для портов и Erl_Interface: запланированная ОС, ограничение масштабируемости.

  • Драйверы портов: опасно, потому что сбой в драйвере порта также приводит к эмулятору.

  • Узлы C: Сервер узла должен масштабироваться так же, как и приложение Erlang, чтобы избежать жертв масштабируемости.

  • НИФы: Лоик хорошо их подводит.

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

Использование JInterface и взаимодействие с процессом Java, который порождает поток для каждого запроса, может быть вариантом.

Так кто-нибудь сталкивался с решением, которое было проверено на практике и оказалось хорошо работающим?

1 ответ

Решение

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

  • Порты безопасны, но связь с портами медленная. Если порт выходит из строя, ВМ продолжает работать. Если вы плохо общаетесь со своим портом или не доверяете порту - это ваш выбор

  • NIFs очень быстро. Если ваш поток данных велик, вы должны использовать их. Конечно, они небезопасны, поэтому вы должны тщательно программировать библиотеку NIF, и вам лучше изучить некоторые C (точка, которую пропускает большинство создателей NIF). На самом деле проблемы планирования легко решаются с помощью конкретного шаблона. Вы должны запустить новый поток C, который выполняет реальную работу, сразу после получения данных из Erlang и отсоединения обработки от потока Erlang. Таким образом, вы очень быстро выходите из функции NIF, возвращаясь обратно в Erlang и ожидая сообщения из C-кода.

  • Узлы Java или узлы C предназначены для задач, которые можно полностью переместить на узел. Это долгая и тяжелая работа.

Принимая во внимание вышеизложенные соображения, вы выбираете способ, который наилучшим образом соответствует вашей задаче.

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