7

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

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

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

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

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

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

4

2 回答 2

5

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

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

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

我认为可以滚动你自己的,使用 Process 字典,如Gproc结合Erlang Queue Module,和Poolboy. 无论如何,我会推荐 RABBITMQ。让我知道,我可以给你寄一些图书馆,让你研究它们,看看它们是否适合你。一旦你有一个好的 RABBITMQ 设置,按照他们网站上的文档进行了很好的配置,然后,你也安装了 Erlang amqp 客户端,那么就可以动态创建队列和交换(无论你是否希望它们持久化,取决于你在做什么)。您甚至可以集群 RABBITMQ 服务器,以保证可用性。

于 2013-03-20T08:17:40.893 回答
1

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

于 2013-03-19T23:24:29.140 回答