Erlang是否是此应用程序的错误语言?

Erlang是否是此应用程序的错误语言?,erlang,Erlang,我正在为实时web应用程序构建框架。我开始在《长生不老药》中这样做,因为 如何为Erlang虚拟机开发应用程序是一种现代化的方法如果您需要并发、容错、可扩展的应用程序(如web服务器等),Erlang应该很好。这正是我需要的 问题:实时框架始终需要保留关于谁对什么感兴趣的信息。这将通过使用发布/订阅模式来实现。因此,我将有1000名客户订阅“最新消息”主题。我需要将这些客户机(代表每个客户机的进程的pid)保存到某个地方,以便在出现主题“最新消息”的内容时访问它们。 这就是我困惑于Erlang是

我正在为实时web应用程序构建框架。我开始在《长生不老药》中这样做,因为 如何为Erlang虚拟机开发应用程序是一种现代化的方法如果您需要并发、容错、可扩展的应用程序(如web服务器等),Erlang应该很好。这正是我需要的

问题:实时框架始终需要保留关于谁对什么感兴趣的信息。这将通过使用发布/订阅模式来实现。因此,我将有1000名客户订阅“最新消息”主题。我需要将这些客户机(代表每个客户机的进程的pid)保存到某个地方,以便在出现主题“最新消息”的内容时访问它们。 这就是我困惑于Erlang是否真的适合我的框架的地方

ETS可能是存储共享数据的唯一选项,但如果您保存/访问记录,ETS总是复制所有内容。
这意味着在需要访问记录时总是复制1000个PID(而不是在某个列表上迭代,如果我使用c/java/python这样做的话)。
如果仍然从ETS(许多客户端、许多订阅等)复制大量记录,这可能是一个巨大的瓶颈,我是对的?

在我的观点中,如果您计划保存像“谁对什么感兴趣”这样的状态,单靠Erlang可能不是一个好主意。当然,有时以信号形式传递所有内容是非常方便的(就像在Erlang中一样),但是当有很多内容要存储时,Erlang中的状态缺失开始阻碍您,而不是帮助您


另一方面,您可以保留Erlang的广泛便利性,并将其用于Java应用程序。Erlangs interface for Java使您能够非常轻松地连接这两种技术,同时您可以使用Java应用程序为您和Erlang存储整个并发信令实时部分的信息(必要时将其保存在某处)。比这更好的是:您仍然可以使用这样的体系结构实现OTP,这样您就可以创建一个轻量级的应用程序(因为实时逻辑由Erlang为您完成),能够轻松访问存储的数据(因为Java在这里帮助您)。

共享状态可能是一个糟糕设计的标志。例如,您可以为每个队列/主题创建一个进程,它将存储自己的订阅者列表。您向该主题进程发送一条消息,然后主题进程又将该消息发送给客户端。这样,您就不会复制整个订户列表

如果需要并行处理,可以在多个进程之间拆分订阅服务器列表


实现了Erlang的容错性,因为它不允许共享状态,并且您必须对设计进行更多的考虑,这将不涉及状态共享,但将是有效的。从长远来看,这会有回报,因此Erlang/Elixir绝对是这类应用的好语言。看看兔子

您可以将其定义为一个关于Erlang的问题,但在探索问题空间之前,就为架构设置了非常不符合Erlangish的任意条件。我建议您在下任何结论之前,先到#erlang或ML寻求建议。看看这个RabbitMQ是用erlang编写的,它完全符合您的需要。看看,他们是如何解决问题的,还是仅仅使用它。你真的需要分享所有这些PID吗?将它们保存在ETS中的成本很低,即使它确实需要复制,pid也很小。最后一句话:您是在寻找使用erlang的理由,还是在寻找不使用erlang的理由?两件不同的事情。我主张使用能够与Erlang接口的数据存储系统,而不是简单地提供另一种语言,在这种语言中,必须联系或实现另一个数据存储系统——当Erlang程序可以调用任何ODBC数据库时,跳转到Java会使事情变得不必要的复杂化,我看你是对的。我打算把它作为一个例子,因为这是我曾经参与构建的一个系统,但我明白这可能会误导初学者。