寻找适用于erlang的持久化、分布式的工作队列

7
在重新发明轮子之前,我正在寻找符合以下要求的开源项目的指针。
  • 使用Erlang实现,尽管如果没有太多的附属问题(例如:依赖关系的迷宫),则可以使用Go或C。
  • 在Erlang中有端点或客户端(例如:当我执行作业时,我希望运行Erlang代码。)
  • 将作业分配给节点,并调用一些Erlang函数来执行作业。
  • 以某种方式保留作业
  • 没有主节点,没有单点故障
  • 同质化架构
  • 管理可能会积压的作业队列,而不会丢弃作业
  • 重复执行作业是可以接受的
  • 类似于Riak或Couchbase的操作配置文件(例如:启动一个节点,然后启动其他节点并将它们指向该节点。)
强烈偏爱轻量级解决方案,而不是那些过于复杂的企业级Erlang解决方案,这些看起来好像需要花费相当长的时间来学习。实际上,我基本上已经针对StackOverflow上其他人的问题架构出了一个解决方案,可以从头开始创建这个解决方案。(事实上,这似乎正是Erlang设计的中心需求之一。)
我考虑过以下解决方案: - ejabbered——更像是一个消息框架 - rabitmq——理论上可以实现该功能,但每次我访问其网站都会被抽象概念淹没。它似乎准备了做任何工作。我甚至无法确定它是否具有任何形式的持久性。
编辑添加:这是一个关于使用locker进行分布式锁定的幻灯片。看起来它解决了问题的关键部分(如果想要自己编写)。 http://www.slideshare.net/knutnesheim/locker-distributed-consistent-locking 进一步编辑:我真的想找比RabbitMQ更轻量级的东西。我知道它可以做我想要的事情,但学习它的成本似乎与自己完成相当,最终定制解决方案会更接近我真正需要的东西。
2个回答

5
我们使用RABBITMQ将所有应用程序绑定成一个完整的集合。在整个设置中,有一个中央的RABBITMQ服务器,系统可以创建持久或临时队列。由于RABBITMQ的可用性,我们的整个分发系统都运行在它之上。使用不同技术构建的系统通过RABBITMQ相互发送和接收任务。

我们设计了一种消息格式,可以是JSON或XML格式,各系统之间进行通讯。这样非常快速。然而,这里有很多细节我不会详细介绍,但我必须在RABBITMQ客户端上编写一个OTP应用程序,以将所有AMQP内容从erlang程序员中抽象出来。程序员只需要知道一个API,比如我要向System A发送请求,只需准备好消息格式M并调用API:zeenode_amqp:req(SystemA,Message)。系统可以发送同步异步请求。

你应该得出这样的结论:RABBITMQ非常适合排队系统。事实上,在我们的设置中,RABBITMQ在客户端将消息发送到它后立即将其推送到服务器。通过使用精心设计的队列和交换命名约定以及仔细理解各种AMQP用例模型,它将非常适合您。

我认为有可能自己构建,使用进程字典,如与Erlang Queue ModulePoolboy结合使用的Gproc。不管怎样,我会推荐RABBITMQ。让我知道,我可以给你发送一些库,这样你就可以研究它们并看看它们是否适合你。一旦你有一个良好的RABBITMQ设置,并按照官方文档进行了良好的配置,然后安装了Erlang amqp客户端,那么就可以动态地创建队列和交换(无论您是否希望它们持久)。您甚至可以将RABBITMQ服务器集群,以确保可用性。

1
很高兴知道RabbitMQ可以与JSON一起工作并持久化。如果您有关于RabbitMQ库的建议,我会非常感激。我知道一个叫做bunny的库和其他在RabbitMQ网站上的库。我的问题之一是RabbitMQ提供了太多的选项-例如三种不同的集群策略,很难知道哪个是正确的。我想我可以阅读更多文档。很高兴听到人们正在将其用于这种类型的工作,这也是我担心的部分。 - nirvana

1
我们使用RabbitMQ来处理这样的任务。RabbitMQ的交换-队列-绑定模型支持灵活的配置。您可以发布到一个交换机,绑定会确保消息到达队列。一个或多个工作进程可以订阅一个队列。队列和交换可以是持久化的。有些人说需要大约半年时间才能完全理解RabbitMQ。

花费半年时间来完全理解RabbitMQ,比我认为需要一个月左右来构建自己的解决方案要长得多,而且从一开始就可以完全理解。我认为这就是我对RabbitMQ的担忧。它可以做任何事情,并且是“企业级”的,但也有陡峭的学习曲线。很高兴知道它可以做我需要的事情,我会进行更多的调查,看看是否能够弄清楚如何持久化并设置它以满足我的需求。 - nirvana
1
尝试使用RabbitMQ。相比于自己的解决方案,你将从中获得更多收益。 - Tilman
1
学习RabbitMQ应该比自己编写要简单得多。关键部分->交换机绑定到队列。消息发布到交换机,然后向绑定的队列传递。队列是您使用消费者接收消息的地方。有大量使用RabbitMQ库的示例。 - Travis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接