2014-09-11 64 views
-1

我在为实时网络应用构建框架。我开始这样做Elixir,因为 它是现代的方式如何开发应用程序Erlang VM如果你需要并发,容错,可伸缩的应用程序(比如web服务器等),Erlang应该是不错的选择。这正是我需要的。是Erlang这个应用程序的糟糕语言吗?

问题:实时框架总是需要保存关于谁对什么感兴趣的信息。这将通过使用发布/订阅模式来完成。所以我将有1000个客户订阅主题“最新消息”。如果出现主题“最新消息”的内容,我需要将这些客户端(代表每个客户端的进程的pid)保存在某处以便稍后访问它们。 如果Erlang对我的框架非常好,这就是我的困惑。

ETS可能是存储共享数据的唯一选择,但如果您保存/访问记录,ETS始终会复制所有内容。所以这意味着当我需要访问它们时,总是复制1000个pid(而不是仅仅遍历某个列表,如果我将在c/java/python中进行实例)。 如果仍然复制来自ETS(许多客户,许多订阅等)的许多记录,这可能是很大的瓶颈,我是对的?

+2

您将这个框架作为一个关于Erlang的问题来构建,但是在您甚至已经探究到问题空间之前,为这个非常糟糕的架构设置了任意条件。我建议你在跳到更多的结论之前去找#erlang或ML来征求建议。 – zxq9 2014-09-11 10:12:18

+0

看看这个https://github.com/uwiger/gproc – 2014-09-11 10:45:47

+0

RabbitMQ是用Erlang编写的,它完全符合你的需求。看看,他们是如何解决问题或只是使用它。 – tkowal 2014-09-11 11:30:04

回答

0

在我的看法中,如果你打算保存像“谁对什么感兴趣”这样的状态,单独的Erlang可能不是一个好主意。当然,有时将所有信号都传递出去非常方便(就像在Erlang中做的那样),但是当需要存储很多内容时 - Erlang缺少状态会阻碍你而不是帮助。例如,您可以保留Erlang的广泛便利,并将其与Java应用程序一起使用。用于Java的Erlangs接口使您能够轻松连接两种技术,并且同时您可以使用Java应用程序为您存储信息(并在需要时将它们保存在某处)以及用于整个并发信号实时部分的Erlang。甚至比这更好:你仍然可以用这样的体系结构来实现OTP,所以你可以创建一个相当轻量级的应用程序(因为Erlang为你实现的实时逻辑)能够轻松访问存储的数据(因为Java可以帮助你) 。

+0

我会争论使用可以与Erlang交互的数据存储系统,而不是简单地提供另一种语言,在这种语言中必须联系或实现另一个数据存储系统 - 当Erlang程序可以调用时,跳转到Java不必要地使事情复杂化任何ODBC数据库,Postgres或Mnesia直接代替。 – zxq9 2014-09-11 14:39:39

+0

我看你是对的。我打算把它作为一个例子,因为这是我参与过的一个系统,但我知道这可能会让初学者产生误解。 – 3yakuya 2014-09-11 17:16:24

1

分享状态可能是设计不好的标志。例如,您可以为每个队列/主题进行处理,并将存储其自己的订户列表。您向该主题进程发送消息,然后将消息发送给客户端。这样,您不会复制整个订户列表。

如果您需要并行处理它们,则可以在多个进程之间拆分订阅者列表。

Erlang的容错功能已经实现,因为它不会让你分享状态,而且你必须对设计进行更多的考虑,不涉及状态共享,但是效率会很高。这从长远来看将会得到回报,所以Erlang/Elixir绝对是这类应用的良好语言。只要看看RabbitMQ。