Erlang vs The Real/Вне мира, как общаться?

Я изучаю erlang, и меня очень очаровывает mnesia db. Я хочу создать некоторое приложение реального мира в С#/F #, используя erlang как backend.

Я ищу хорошее решение для общения с узлами erlang из внешнего мира.

Что я нашел до сих пор:

(A) OTP.net, библиотека с открытым исходным кодом .net, реализующая "родной" протокол связи erlang

Проблемы здесь:

  • Библиотека не очень зрелая.
  • Мне не нравится модель объекта, перенесенная с Java (слишком много почти точных копий классов BCL)
  • Мне не нравится использование потоковой модели для соединений.
  • Требуется много открытых TCP-портов
  • Отсутствие безопасности

(B) Использовать порты/сокеты в erlang и реализовать собственный протокол.

Проблемы здесь:

  • У меня нет опыта.
  • Трудно поддерживать/расширять для будущих версий

Есть ли у вас какие-либо советы, опыт в этой теме?

Должен ли я работать с библиотекой OTP.net, чтобы соответствовать моим потребностям или пытаться реализовать новый протокол с нуля?

Как насчет решения JSON или REST? Есть ли библиотека erlang, которая бы сделала трюк?

Ответы

Ответ 1

Решение порта/сокета - хорошая идея и не сложно, как может показаться. Буферы протокола Google - это именно то, что вам нужно. Он очень прост в использовании, эффективен и удобен в обслуживании. Он имеет реализации для С#, erlang, java, python и многих других (см. OtherLanguages и руководство разработчика)

Вы можете использовать буферы протокола для определения структуры протокола запроса и ответа. Затем используйте его для связи между erlang и любым другим поддерживаемым языком. tutorial объяснит все это. После этого все, что вам нужно сделать, это отправить ответ по порту.

Преимущество этого подхода состоит в том, что:

  • Вы можете легко расширить и изменить протокол в будущем
  • Это намного эффективнее, чем Подход REST
  • В настоящее время он используется Google для почти все его внутренние RPC протоколов и форматов файлов

Ответ 2

Если вы хотите внедрить REST API в Erlang, нужно только одно. Используйте отличный MochiWeb Kit для создания собственного HTTP-сервера, который реализует ваш протокол.

Не паникуйте, это действительно легче, чем кажется.

Существует ряд учебников о том, как это сделать, включая screencast set от прагматичных программистов.

Он поставляется с полным набором json-библиотек, поэтому вы будете в порядке!

Ответ 3

Конечно, вы можете сделать REST с Erlang, см., например, http://www.infoq.com/articles/vinoski-erlang-rest - если это необходимо для потребностей ваших приложений, REST - отличный подход. (Pycon Italia Tre, на следующей неделе во Флоренции, проводит сессии по сотрудничеству Erlang/Python, см. Www.pycon.it, если вы близки к Тоскане; -).

Ответ 4

Существует также библиотека JSON для Erlang, которую вы, возможно, захотите изучить. Я не использовал его, поэтому я ничего не могу сказать об этом по опыту.

Ответ 5

Хотя я согласен с тем, что какое-то решение REST полезно, используете ли вы Yaws или Mochikit, вы обнаружите, что пытаетесь определить некоторый промежуточный "язык", чтобы генерировать запросы, которые Mnesia сможет обрабатывать.

Поэтому я предлагаю этот совет; любой проект, который вы имеете в виду для себя, просто реализуйте его в erlang и используйте доступные инструменты. Вы будете вознаграждены многими способами.

Затем вы всегда можете попробовать CouchDB.

Ответ 6

Мы делаем это с помощью YAWS и простой реализации запроса/ответа HTTP на стороне клиента. Реализация YAWS просто делегирует вызов соответствующему процессу gen_server после извлечения аргументов.

Единственным недостатком такого подхода является то, что он не так быстр (буферы протокола Google будут лучше) - и, поддерживая соединение "живым" в языке HTTP, помогло снизить всю стоимость установки и уменьшить количество устаревших сокетов соединения. Если вы возвращаете большие наборы данных, вам нужно немного поработать с потоковой передачей результатов. Для большинства наших запросов данных это не было проблемой - ответ мог легко вписаться в память.

Некоторые ошибки, если исходная производительность протокола не так важна:

  • Вы можете подключиться к модели безопасности (HTTPS или аутентификации).
  • Вы можете вызвать API из всего, что может сделать веб-запрос (у нас было много старого кода perl и листов Excel, которые висят вокруг - сортировка их была тривиальной)

Ответ 7

С тех пор мы переписывали OTP.NET

Эта библиотека во много раз более зрелая, поскольку она была переписана с нуля для .NET/CLR,  (в отличие от своего предшественника, который был просто преобразован с Java)

Взгляните на это сообщение:

http://blog.aumcode.com/2013/10/nfx-native-interoperability-of-net-with.html