基于Erlang OTP的应用程序体系结构思想

基于Erlang OTP的应用程序体系结构思想,erlang,otp,Erlang,Otp,我正在尝试编写一个Erlang应用程序(OTP),它将解析一个用户列表,然后启动工人,他们将全天候工作,从远程服务器收集用户数据(使用三种不同的API),并将其存储在ets中 这种应用程序的理想体系结构是什么。我是否启动了一组工作人员-每个用户一个(假设用户数量较少)?如果用户数量快速增长,会发生什么 另外,要调用不同的API,我需要在工作进程中设置一个计时器机制 任何提示都会得到真正的赞赏。 < P>如果你用Python或C++写这个,你会担心你创建了多少个对象吗?只有在极端情况下。在Erla

我正在尝试编写一个Erlang应用程序(OTP),它将解析一个用户列表,然后启动工人,他们将全天候工作,从远程服务器收集用户数据(使用三种不同的API),并将其存储在ets中

这种应用程序的理想体系结构是什么。我是否启动了一组工作人员-每个用户一个(假设用户数量较少)?如果用户数量快速增长,会发生什么

另外,要调用不同的API,我需要在工作进程中设置一个计时器机制


任何提示都会得到真正的赞赏。

< P>如果你用Python或C++写这个,你会担心你创建了多少个对象吗?只有在极端情况下。在Erlang中,相同的一般规则适用于进程。不要担心你创造了多少

至于体系结构,在您的问题中,唯一的体系结构问题是您应该设计一个固定工作池还是一对一工作池。监督树的形状将取决于您选择的任何方式

如果您正在抓取数据,那么真正的瓶颈不是您拥有多少进程,而是您在试图访问的每个API上每秒能够发出多少网络请求。你几乎肯定会被扼杀

(几个月前,我编写了一个与您描述的非常类似的系统的测试演示。限制因素是来自fb、YouTube、g+、Yahoo等提供商的API请求限制,而不是进程数。)

和Erlang一样,首先编写一些系统,然后在担心性能之前对其进行实际的基准测试。您通常会发现性能不是一个问题,当性能成为问题时,您会发现优化现有系统的一小部分要比从头开始设计优化的系统容易得多。所以现在就开始写一些基本上满足你需要的东西,在你有了基本上满足你需要的东西之后,再担心优化调整。在获得一些具体的性能数据(内存、请求延迟等)之后,是开始考虑性能的时候了


您的问题几乎肯定会出现在API提供商方面或您的网络延迟上,而不是Erlang VM中的拥塞。

为每个用户生成新进程不是一个坏主意。有一些http服务器可以为每个连接执行此操作,它们做得非常好

首先,创建新流程的成本是最低的。维护流程的成本甚至更小。如果其中一个无事可做,它就什么也不会做;没有(几乎)来自非活动进程的运行时开销,这最终意味着您只做了必须做的工作(这实际上是Erlang系统反应性的来源)

一些问题可能是内存使用。每个进程都有自己的内存堆栈,在实际不需要存储任何内部数据的用例中,您可能会分配一些不必要的内存。但这也可以修改(即使在运行时),在大多数情况下,这样的内存将被垃圾收集

其实我不会太快就担心这些事情。您可能遇到的问题可能取决于许多因素,主要是外部数据量或用户活动,您无法真正设计这些因素。很可能在相当长的一段时间内你都不会遇到它们。没有必要进行过早的优化,特别是如果您可以将自己绑定到会减慢其他开发过程的设计中。在Erlang中,由于进程是抽象的主要来源,您可以轻松地将每个用户的进程与工作池交换,将ets与外部服务交换。但前提是你真的需要它

最重要的是,将“用户”表示为流程最接近问题域。“用户”是独立的实体,应该有独立的流程(他们有自己的状态,可以独立地行动或反应)。这与在其他语言中使用对象和类非常相似(这过于简化了,但应该可以让您继续)