Каков наилучший способ выполнения сложных вычислительных задач в Erlang без жертв от масштабируемости?
В руководстве по взаимодействию Erlang обсуждаются различные механизмы взаимодействия. Вот мои выводы:
Программы для портов и Erl_Interface: запланированная ОС, ограничение масштабируемости.
Драйверы портов: опасно, потому что сбой в драйвере порта также приводит к эмулятору.
Узлы C: Сервер узла должен масштабироваться так же, как и приложение Erlang, чтобы избежать жертв масштабируемости.
НИФы: Лоик хорошо их подводит.
Некоторые выступают за использование OpenCL, в основном делегируя ресурсоемкие вычисления GPU, позволяя эмулятору Erlang владеть процессором. Это звучит фантастически, но тогда у вас есть требования к вашим серверам, имеющим подходящий графический процессор.
Использование JInterface и взаимодействие с процессом Java, который порождает поток для каждого запроса, может быть вариантом.
Так кто-нибудь сталкивался с решением, которое было проверено на практике и оказалось хорошо работающим?
1 ответ
На самом деле все решения имеют место. Поскольку я плотно работал с некоторыми из них, я мог сказать следующее:
Порты безопасны, но связь с портами медленная. Если порт выходит из строя, ВМ продолжает работать. Если вы плохо общаетесь со своим портом или не доверяете порту - это ваш выбор
NIFs очень быстро. Если ваш поток данных велик, вы должны использовать их. Конечно, они небезопасны, поэтому вы должны тщательно программировать библиотеку NIF, и вам лучше изучить некоторые C (точка, которую пропускает большинство создателей NIF). На самом деле проблемы планирования легко решаются с помощью конкретного шаблона. Вы должны запустить новый поток C, который выполняет реальную работу, сразу после получения данных из Erlang и отсоединения обработки от потока Erlang. Таким образом, вы очень быстро выходите из функции NIF, возвращаясь обратно в Erlang и ожидая сообщения из C-кода.
Узлы Java или узлы C предназначены для задач, которые можно полностью переместить на узел. Это долгая и тяжелая работа.
Принимая во внимание вышеизложенные соображения, вы выбираете способ, который наилучшим образом соответствует вашей задаче.