ejabberd - одно из самых известных приложений на эрланге, с которым я выучил эрланг.
Я думаю, что это один из самых интересных проектов по изучению эрланга, потому что он действительно опирается на силу эрланга. (Однако некоторые будут утверждать, что это не OTP, но не волнуйтесь, внутри все еще есть масса отличного кода ...)
Зачем ?
Сервер XMPP (например, ejabberd) можно рассматривать как маршрутизатор высокого уровня, маршрутизирующий сообщения между конечными пользователями. Конечно, есть и другие функции, но это самый важный аспект сервера обмена мгновенными сообщениями. Он должен одновременно маршрутизировать много сообщений и обрабатывать множество TCP / IP-соединений.
Итак, у нас есть 2 функции:
- обрабатывать много соединений
- Маршрут сообщений с учетом некоторых аспектов сообщения
Это примеры, где эрланг сияет.
обрабатывать много соединений
С помощью erlang очень легко создавать масштабируемые неблокирующие серверы TCP / IP. Фактически, это было разработано, чтобы решить эту проблему. И, учитывая, что он может порождать сотни тысяч процессов (а не потоков , это подход без разделения ресурсов, который проще проектировать), ejabberd разработан как набор процессов erlang (которые могут быть распределены по нескольким серверам):
- процесс подключения клиента
- процесс роутера
- процесс чата
- межсерверные процессы
Все они обмениваются сообщениями.
Маршрут сообщений с учетом некоторых аспектов сообщения
Еще одна привлекательная особенность erlang - это сопоставление с образцом . Он используется во всем языке.
Например, в следующем:
access(moderator, _Config)-> rw;
access(participant, _Config)-> rw;
access(visitor, #config{type="public"})-> r;
access(visitor, #config{type="public_rw"})-> rw;
access(_User,_Config)-> none.
Это 5 разных версий access
функции. Эрланг выберет наиболее подходящую версию с учетом полученных аргументов. ( Config
это структура типа, #config
которая имеет type
атрибут).
Это означает, что это очень просто и намного понятнее, чем создание цепочки if/else
или switch/case
создание бизнес-правил.
Упаковать
Написание масштабируемых серверов - вот и весь смысл Erlang. Все разработано, чтобы сделать это легко. К двум предыдущим функциям я бы добавил:
- горячее обновление кода
mnesia
Распределенная реляционная база данных (входит в базовый дистрибутив)
mochiweb
, на котором основано большинство серверов http erlang
- двоичная поддержка (декодирование и кодирование двоичного протокола легко, как никогда)
- большое сообщество с большими проектами с открытым исходным кодом (
ejabberd
, couchdb
но также webmachine
, riak
и убивание библиотеки очень легко врезать)
Меньше LOCs
Есть также эта статья от Ричарда Джонса. Он переписал приложение с C ++ на erlang: на Erlang на 75% меньше строк.