14

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

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

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

(A) OTP.net,一个开源的 .net 库,实现“本机”erlang 通信协议

这里的问题:

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

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

这里的问题:

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

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

我应该使用 OTP.net 库来满足我的需求还是尝试从头开始实现一个新协议?

JSON 或 REST 解决方案呢?是否有任何 erlang 库可以解决问题?

4

7 回答 7

16

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

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

这种方法的优点是:

  1. 您可以在未来轻松扩展和更改协议
  2. 它比 REST 方法更有效
  3. 它目前被 Google 用于其几乎所有的内部 RPC 协议和文件格式
于 2009-05-04T13:14:18.523 回答
4

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

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

有许多关于如何做到这一点的教程,包括来自 Pragmatic Programmers的截屏视频集。

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

于 2009-04-30T15:59:09.223 回答
2

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

于 2009-04-30T15:07:52.030 回答
2

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

于 2009-04-30T15:28:37.940 回答
2

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

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

然后你总是可以尝试 CouchDB。

于 2009-05-01T20:01:36.247 回答
0

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

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

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

  • 您可以连接到安全模型(HTTPS 或身份验证)
  • 您可以从任何可以发出 Web 请求的东西中调用 API(我们有很多旧的 perl 代码和 Excel 工作表 - 将它们整理出来是微不足道的)
于 2009-06-07T16:55:24.630 回答
0

我们已经重写了 OTP.NET

这个库成熟了很多倍,因为它是为 .NET/CLR 从头开始​​重写的,(不像它的前身是从 Java 转换而来的)

看看这个帖子:

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

于 2013-11-23T02:17:09.000 回答