我正在学习 erlang,我对 mnesia db 非常着迷。我想使用 erlang 作为后端在 C# / F# 中构建一些现实世界的应用程序。

我正在寻找一个好的解决方案来与外部世界的 erlang 节点进行通信。

到目前为止我发现了什么:

(A) 一次性密码网, ,一个实现“本机”Erlang 通信协议的开源 .net 库

这里的问题:

  • 图书馆还不是很成熟
  • 我不喜欢从 Java 移植的对象模型(太多 BCL 类几乎完全相同的复制品)
  • 我不喜欢用于连接的线程模型。
  • 需要许多开放的 TCP 端口
  • 缺乏安全感

(B) 使用端口/套接字 在 erlang 中并实现自定义协议。

这里的问题:

  • 我没有任何经验
  • 难以维护/扩展未来版本

您对此主题有什么建议或经验吗?

我应该研究 OTP.net 库以使其满足我的需求,还是尝试从头开始实现新协议?

JSON 或 REST 解决方案怎么样?有没有 erlang 库可以做到这一点?

有帮助吗?

解决方案

端口/套接字解决方案是一个好主意,并且并不像看起来那么难。 Google 的协议缓冲区 正是您所需要的。它非常易于使用、高效且可维护。它具有 C#、erlang、java、python 等的实现(请参阅 其他语言开发者指南)

您可以使用协议缓冲区来定义请求和响应协议结构。然后使用它在 erlang 和任何其他支持的语言之间进行通信。这 教程 会解释这一切。之后,您所需要做的就是通过端口发送响应。

这种方法的优点是:

  1. 您可以在将来轻松扩展和更改协议
  2. 它比其余方法要高得多
  3. 它目前被Google用于其几乎所有内部​​RPC协议和文件格式

其他提示

如果你想在 Erlang 中实现 REST API,只需要做一件事。使用优秀的 MochiWeb 套件 构建您自己的 HTTP 服务器来实现您的协议。

不要惊慌,这确实比看起来更容易。

有许多关于如何执行此操作的教程,包括 截屏集 来自务实的程序员。

它附带了一套完整的 json 库,所以你会没事的!

当然,您可以使用 Erlang 进行 REST,请参见例如 http://www.infoq.com/articles/vinoski-erlang-rest - 如果适合您的应用程序的需求,REST 是一种很好的方法。(Pycon Italia Tre 下周将在佛罗伦萨举办有关 Erlang/Python 合作的会议,如果您在托斯卡纳附近,请访问 www.pycon.it;-)。

还有一个 JSON库 对于 Erlang,你可能想研究一下。我没有使用过它,所以我不能从经验上说什么。

虽然我同意某些 REST 解决方案是有用的,但无论您使用 Yaws 还是 Mochikit,您都会发现自己试图定义一些中间“语言”,以便生成 Mnesia 能够处理的查询。

因此我提出这个建议;无论您自己想要什么项目,只需在 erlang 中实现它并使用可用的工具即可。你会在很多方面得到回报。

那么您随时可以尝试 CouchDB。

我们使用 YAWS 和客户端的简单 http 请求/响应实现来完成此操作。YAWS 实现只是在提取参数后将调用委托给适当的 gen_server 进程。

这种方法的唯一缺点是它不是那么快(Google 协议缓冲区会更好),并且通过保持 HTTP 术语中的“活动”连接有助于降低所有设置成本并减少陈旧套接字连接的数量。如果您要返回大量数据,则必须在返回结果时发挥更多创意。对于我们的大多数数据请求来说,这不是问题 - 响应可以轻松装入内存。

如果协议的原始性能不是那么大的问题,则有一些好处:

  • 您可以连接安全模型(HTTPS 或身份验证)
  • 您可以从任何可以发出 Web 请求的地方调用 API(我们有大量旧的 Perl 代码和 Excel 工作表 - 将它们整理出来很简单)

此后我们重写了 OTP.NET

该库的成熟很多倍,因为它已从划痕为.net/clr重新编写(与刚从Java转换的其前任不同)

看看这个帖子:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top