ejabberd - це одне з найвідоміших застосувань erlang і те, з чим я дізнався erlang.
Я думаю, що це один із найцікавіших проектів для вивчення ерланг, оскільки він справді спирається на сили Ерланга. (Однак деякі будуть стверджувати, що це не OTP, але не хвилюйтеся, все ще існує чудовий код великого коду ...)
Чому?
Сервер XMPP (наприклад, ejabberd) може розглядатися як маршрутизатор високого рівня, маршрутизуючи повідомлення між кінцевими користувачами. Звичайно, є й інші функції, але це найважливіший аспект сервера обміну миттєвими повідомленнями. Він повинен одночасно маршрутизувати багато повідомлень та обробляти багато з’єднань TCP / IP.
Отже, у нас є 2 функції:
- обробляти безліч з'єднань
- маршрутні повідомлення з урахуванням деяких аспектів повідомлення
Це приклади, коли світить ерланг.
обробляти безліч з'єднань
Дуже легко створити масштабовані неблокуючі сервери TCP / IP за допомогою erlang. Насправді вона була покликана вирішити цю проблему. І з огляду на те, що він може породити сотні тисяч процесів (а не ниток , це підхід без участі, який простіший у проектуванні), 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
і вбивання бібліотеки дуже легко врізати)
Менше місцевих місцевостей
Є також ця стаття Річарда Джонса. Він переписав програму з C ++ на erlang: на 75% менше рядків у erlang.