将操作推送到消息 queue 以便在能够处理时进行处理
Pushing operations to a message queue for processing when able to
我的标题不是很好,因为我发现很难用一个小片段来解释我想要的东西...所以我会深入尝试!
我正在使用 Phoenix 网络框架编写 Elixir 应用程序。
我想做的是:
- 调用 phoenix 处理并传递给控制器的网络路由
- 启动要传递给消息的进程的控制器queue
- 资源可用时要处理的 queue 中的最新项目(即 CPU/Memory/etc)
进程不需要return返回网络路由(即它的异步)
我知道如何使用消息 queue(Beanstalk、RabbitMQ、sidekiq)在其他语言中处理这个问题,并且有一些东西可以将 "job" 交给工作人员,然后写一个工作人员处理 queue.
上的工作
但是....我知道在 Elixir 中默认情况下它有 queues,因为所有内容都被推入 "mailbox"(在 youtube 视频中看到它:p)
但我找不到任何合适的代码示例来展示如何让控制器(在 phoenix 中)生成一个异步进程,该进程将根据消息进行处理 queue。
有没有人知道显示我正在寻找的东西的任何体面的资源,或者有没有人有任何代码片段可以给我一个如何做的基本描述。
谢谢:)
编辑:
如评论中所述,我创建了一个基本教程,介绍如何在 Elixir 应用程序中启动 Poolboy 和 运行。我希望它对人们有帮助(并且是正确的!):)
听起来你在描述 Poolboy。
http://hashnuke.com/2013/10/03/managing-processes-with-poolboy-in-elixir.html
如果作业是 "important",您仍然希望使用一些存储来保存它们。否则,如果节点因任何原因宕机,您将丢失系统中的所有作业。如果是这种情况,您可以使用 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
我的标题不是很好,因为我发现很难用一个小片段来解释我想要的东西...所以我会深入尝试!
我正在使用 Phoenix 网络框架编写 Elixir 应用程序。
我想做的是:
- 调用 phoenix 处理并传递给控制器的网络路由
- 启动要传递给消息的进程的控制器queue
- 资源可用时要处理的 queue 中的最新项目(即 CPU/Memory/etc)
进程不需要return返回网络路由(即它的异步)
我知道如何使用消息 queue(Beanstalk、RabbitMQ、sidekiq)在其他语言中处理这个问题,并且有一些东西可以将 "job" 交给工作人员,然后写一个工作人员处理 queue.
上的工作但是....我知道在 Elixir 中默认情况下它有 queues,因为所有内容都被推入 "mailbox"(在 youtube 视频中看到它:p)
但我找不到任何合适的代码示例来展示如何让控制器(在 phoenix 中)生成一个异步进程,该进程将根据消息进行处理 queue。
有没有人知道显示我正在寻找的东西的任何体面的资源,或者有没有人有任何代码片段可以给我一个如何做的基本描述。
谢谢:)
编辑:
如评论中所述,我创建了一个基本教程,介绍如何在 Elixir 应用程序中启动 Poolboy 和 运行。我希望它对人们有帮助(并且是正确的!):)
听起来你在描述 Poolboy。
http://hashnuke.com/2013/10/03/managing-processes-with-poolboy-in-elixir.html
如果作业是 "important",您仍然希望使用一些存储来保存它们。否则,如果节点因任何原因宕机,您将丢失系统中的所有作业。如果是这种情况,您可以使用 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