您如何在OTP中表示多进程逻辑实体?

时间:2011-11-04 16:28:01

标签: erlang otp

想象一下,我们遇到以下问题:

  1. 我们有http客户端执行对我们软件的请求。因此,我们有一个始终可用的进程,并将其请求存储在队列中。
  2. 我们需要将这些请求发送到我们内部网络中的计算机(再次通过HTTP)。
  3. 这种机器并不总是可用的。它是由我们的软件按需启动(并在队列为空时停止)(再次向“经理”机器发送HTTP请求)。
  4. 我们有上面几个(或很多)。
  5. 基本上,我们有一个逻辑实体,为了参数,我们将调用“作业队列”。 每个作业队列都包含多个(异构)进程。一个实现实际队列并始终可用(不阻止)的队列。一个管理工人机器的人。我们还有几个(按需生成)工作者,它们从队列中取出条目,尝试将它们发送到工作机器,解决错误;也许返回(不成功)尝试队列(要重试)等等。我们也可能有一个“经理”过程来协调上面的工作。我们有很多“工作队列”,他们都包含很多流程。

    注意:这可能不是解决这个问题的完美解决方案,但我们假设它是。我的问题不是如何解决问题,而是如何管理代表逻辑实体的流程的“组”。

    那么,你如何在OTP中代表这一点?你有多少监管树,你在“工作队列”实体之间共享主管,或者你是否有每个逻辑实体的主管。 另外,你如何管理整个事情。

    我有一个猜测,但这是一个非常棘手的问题(因为我已经尝试过以几种不同的方式实现它),所以我不会分享我的(也许不是那么糟糕)的想法(现在)。

2 个答案:

答案 0 :(得分:1)

我会为每个逻辑组件使用专用的主管(我猜你的意思是逻辑:http-workers,manager,dispatchers)。其中每个人都会在其中一个班级担任主管。 我喜欢它,因为我可以从控制它的其他工具中受益(计算孩子,在i()中查看它等)并且它很好地将系统分开。

@MinimeDJ提到的Gproc和sync / async是完全不同的东西。

我认为如果你需要在你描述的系统中使用gproc,它不是最好的架构。 重新设计它以尽可能多地建立无状态层。例如。而不是维护调度员=推模型,尝试拉模型=从后端机器拉任务。这个解决方案使队列无状态,你摆脱调度员,如果出现任何问题,后端层将任务再次放入某个队列。 此外,管理员只是简化为队列和一些统计收集器的API。后端工作负载在每个异构后端模块中进行测量和控制(localy!)。

答案 1 :(得分:0)

从上面我们还有一个由许多特殊块组成的系统,我们的第一个架构与你的类似。我们使用RabbitMQ而不是HTTP,我相信在消息交换方面更方便。

但在最终版本发布之前,我们理解维护整个系统的生产将是一项真正的挑战。

所以,我们再次重新设计了它。现在我们将每个逻辑块表示为进程gen_server。每个进程都有一个唯一的名称,并存在于gproc中。由于gproc可以存在于许多节点上,因此我们可以很容易地管理容错系统。

所以,我想说,我们有可管理对象模型(我们称之为MOM,因为我们非常喜欢它)。

所以,对我来说,你的系统似乎过于复杂。我不知道我的答案是否有用,但有时值得以一种你从未想到的方式考虑你的系统。我希望你能找到一种方法来轻松管理它。