为erlang寻找持久的,分布式的工作队列

时间:2013-03-19 16:52:21

标签: erlang queue worker elixir

在重新发明轮子之前,我正在寻找满足这些要求的开源项目的指针。

  • 在erlang中实现虽然go或C是可能的,如果没有太多的包袱(例如:扭曲依赖的迷宫。)
  • erlang中的端点或客户端(例如:我希望在我完成这些工作时运行erlang代码。)
  • 将作业分配给节点,并调用一些erlang函数来完成这些作业。
  • 以某种方式坚持工作
  • 没有主节点,没有单点故障
  • 同质架构
  • 管理可能会备份的作业队列,而不会丢弃作业
  • 不止一次完成的工作没问题
  • 像Riak或Couchbase这样的操作配置文件(例如:启动一个节点,然后启动其他节点并指向它们。)

强烈偏爱轻量级的东西。在erlang中有很多过度的企业级解决方案,看起来他们需要花费很长时间来学习,因为我将从头开始重新创建这个(事实上,我基本上构建了一个解决这个问题的解决方案来回答某人其他的问题在stackoverflow上。我可以构建我所描述的内容,但这似乎正是在erlang设计的中间需要之一。)

我考虑过的事情: - ejabbered - 更多的消息传递框架 - rabitmq - 理论上这样做但每次我去他们的网站我都淹没在抽象的海洋中。它似乎准备好做所有事情。我甚至无法判断它是否有任何持久性。

编辑添加:这是使用储物柜进行分布式锁定的幻灯片。似乎它解决了问题的关键部分(如果想要自己推出。) http://www.slideshare.net/knutnesheim/locker-distributed-consistent-locking

进一步编辑:我真的在寻找比RabbitMQ更轻量级的东西。我知道它可以做我想要的,但似乎学习它的成本与自己做的成本相当,最终定制解决方案将更接近我真正需要的。

2 个答案:

答案 0 :(得分:5)

我们使用RABBITMQ将所有应用程序绑定到一组完整的东西中。在整个设置中是一个中央RABBITMQ服务器,系统创建队列,无论是持久的还是临时的。由于RABBITMQ的可用性,我们的整个分发系统都在其上运行。使用不同技术构建的系统通过RABBITMQ从其他系统发送和接收任务。

我们提出了一种消息格式,它可以是JSON或XML,系统之间相互通信。它太快了。但是,有很多细节我不会在这里讨论但是,我必须在顶级RABBITMQ客户端上编写一个OTP应用程序来抽象erlang程序员的所有AMQP内容。所有程序员都知道是APi,比如我正在向System A发送请求,只需准备消息格式,M并调用API:zeenode_amqp:req(SystemA,Message)。系统可以发送synchronousasynchronous个请求。

你应该从中得到什么:RABBITMQ非常适合排队系统。事实上,在我们的设置中,RABBITMQ pushes一旦从客户端访问RABBITMQ,就会直接向服务器发送消息。通过精心设计的队列和交换命名约定,并仔细了解各种AMQP用例模型,它将非常适合您。

我认为可以使用像Gproc这样的流程词典和Erlang Queue Module以及Poolboy来推广自己的词典。无论如何,我会推荐RABBITMQ。让我知道,我可以寄给你一些图书馆,所以你研究它们,看看它们是否适合你。一旦你有一个良好的RABBITMQ设置,配置良好,遵循他们网站上的文档,然后,你也安装了Erlang amqp客户端,然后就可以动态创建队列和交换(无论你是否想要它们是持久的,取决于你在做什么)。您甚至可以对RABBITMQ服务器进行集群,以确保可用性。

答案 1 :(得分:1)

我们将RabbitMQ用于此类任务。 RabbitMQ交换队列绑定模型支持灵活配置。您发布到交换,绑定确保消息到达队列。一个或多个工作进程可以订阅队列。队列和交换可以是持久的。有人说完全了解RabbitMQ大约需要半年时间。