8

我的标题不是很好,因为我发现很难用一个小片段来解释我想要什么......所以我会深入尝试!

我正在使用 Phoenix Web 框架编写一个 Elixir 应用程序。

我想做的是:

  • 调用 phoenix 处理并传递给控制器​​的 web 路由
  • 控制器启动要移交给消息队列的进程
  • 当资源可用时,队列中要处理的最新项目(即 CPU/内存/等)

该进程不需要返回到 web 路由(即它的 Async)

我知道如何使用消息队列(Beanstalk、RabbitMQ、sidekiq)在其他语言中处理这个问题,并有一些东西将“工作”交给工作人员,然后编写一个工作人员来处理队列上的工作。

但是....我知道在 Elixir 中默认情况下它有队列,因为所有内容都被推入“邮箱”(在 youtube 视频中看到它:p)

但是我找不到任何像样的代码示例来展示如何让控制器(在凤凰城中)产生一个异步进程,该进程将从消息队列中处理。

有谁知道任何体面的资源可以显示我正在寻找的东西,或者有没有人有任何代码片段可以让我对如何做到这一点进行基本描述。

谢谢 :)

编辑:

正如评论中提到的,我创建了一个基本教程,介绍如何在 Elixir 应用程序中启动和运行 Poolboy。我希望它对人们有帮助(并且是正确的!):)

https://github.com/thestonefox/elixir_poolboy_example

4

2 回答 2

9

如果作业是“重要的”,您仍然希望使用一些存储来持久化它们。否则,如果节点因任何原因出现故障,您将丢失系统中的所有作业。如果是这种情况,您可以使用 RabbitMQ 之类的东西并在您的应用程序中创建一堆工作人员:

children = [
  worker(QueueConsumer, [], id: :consumer_1),
  worker(QueueConsumer, [], id: :consumer_2),
  worker(QueueConsumer, [], id: :consumer_3),
  worker(QueueConsumer, [], id: :consumer_4)
]

消费者将从 RabbitMQ 获得下一条消息,并在它们到来时对其进行处理。

如果您不关心持久化它们,或者如果您想根据 CPU 使用率等其他标准来调节它们,那么我建议您查看作业库(在 Erlang 中):https ://github.com/uwiger/jobs

于 2015-05-05T19:37:59.357 回答
5

听起来你在描述 Poolboy。

http://hashnuke.com/2013/10/03/managing-processes-with-poolboy-in-elixir.html

于 2015-05-05T17:57:57.620 回答