我试图编写一个Erlang应用程序(OTP)来解析用户列表,然后启动工作程序,这些工作程序将24X7工作以从远程服务器收集用户数据(使用三种不同的API)并将其存储在ETS。
这种应用程序的理想架构是什么?我是否会启动一堆工作人员 - 每个用户一个(假设用户数量很少)?如果用户数量增长很快会发生什么?
另外,要调用不同的API,我需要在工作进程中建立一个Timer机制。
任何提示都会非常感激。
答案 0 :(得分:1)
如果你用Python或C ++编写这个,你会担心你创建了多少个对象吗?只有在极端情况下。在Erlang中,相同的一般规则适用于流程。不要担心你创造了多少。
至于体系结构,问题中唯一的一个体系结构问题元素是您是应该设计一个固定的工作池还是一个一对一的工作池。监督树的形状将是您选择的任何方式的结果。
如果您正在抓取数据,那么您的真正瓶颈并不是您拥有多少个进程,那么您尝试访问的每个API每秒可以进行多少次网络请求。你几乎肯定会受到限制。
(几个月前,我写了一个与你所描述的非常相似的系统的测试演示。限制因素是来自fb,YouTube,g +,Yahoo等提供商的API请求限制,而不是进程数。)
与Erlang一样,首先编写某些系统,然后在担心性能之前将其标记为真实。您通常会发现性能不是一个问题,而您的时间会发现,优化现有系统的一小部分比设计优化系统更容易 从头开始。所以,只需要去做并写一些基本上你现在想要的东西,并且在你有基本上做你想要的东西之后担心优化调整。获得一些具体的性能数据(内存,请求延迟等)后,就可以开始考虑性能了。
您的问题几乎肯定会出现在API提供商身上。方或你的网络延迟,而不是Erlang VM内的拥塞。
答案 1 :(得分:1)
为每个用户生成新流程并不是一个坏主意。有http服务器为每个连接执行此操作,并且它们做得非常好。
首先,创建新流程的成本很低。维护流程的成本更低。如果其中一个无所事事,就什么都不做;没有(几乎)非活动进程的运行时开销,这最终意味着你只做你必须做的工作(这实际上是Erlang系统反应的来源)。
某些问题可能是内存使用情况。每个进程都有自己的内存堆栈,在使用情况下,当它们实际上不需要存储任何内部数据时,您可能会分配一些不必要的内存。但这也可以修改(即使在运行时),并且在大多数情况下这样的内存将被垃圾收集。
其实我不会太担心这些事情。您可能遇到的问题可能取决于许多事情,主要是外部数据或用户活动的数量,而您无法真正设计这些问题。很可能你很长一段时间都不会遇到它们中的任何一个。不需要过早优化,特别是如果您可以将自己绑定到会降低开发过程的其余部分的设计。在Erlang中,流程是主要的抽象源,您可以轻松地将每个用户的流程与工作池交换,并与外部服务交换。但只有你真的需要它。
最重要的是将“用户”表示为流程最接近问题域的事实。 “用户”是独立的实体,并且应该具有独立的流程(它们具有自己的状态,并且它们可以彼此独立地行动或做出反应)。它与在其他语言中使用对象和类非常相似(它过于简化,但它应该让你去。)