将操作推送到消息队列以便在能够

时间:2015-05-05 17:39:27

标签: elixir phoenix-framework

我的头衔不是很好,因为我发现很难用小片段解释我想要的东西......所以我会深入尝试!

我正在使用Phoenix网络框架编写Elixir应用程序。

我想做的是:

  • 调用一个网络路由,凤凰处理并传递给控制器​​
  • 用于启动要切换到消息队列的进程的控制器
  • 资源可用时要处理的队列中的最新项目(即CPU /内存/等)

该过程不需要返回到Web路由(即其异步)

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

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

但是我找不到任何合适的代码示例来说明如何让控制器(在phoenix中)产生一个异步进程,该进程将在消息队列中处理。

有没有人知道任何可以显示我正在寻找什么的合适资源,或者是否有人有任何代码片段可以给我一个基本的描述如何去做。

谢谢:)

编辑:

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

https://github.com/thestonefox/elixir_poolboy_example

2 个答案:

答案 0 :(得分: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 < / p>

答案 1 :(得分:5)