是否有分布式数据处理管道框架,或组织一个好方法?

Ale*_*ubo 6 mapreduce distributed-computing go

我正在设计一个应用程序,它需要一组分布式处理工作程序,这些工作程序需要异步使用并在特定流程中生成数据.例如:

  • 组件A获取页面.
  • 组件B分析来自A的页面.
  • 组件C存储来自B的分析的位和片段.

显然,涉及的不仅仅是三个组成部分.

进一步要求:

  • 每个组件都需要是一个单独的进程(或一组进程).
  • 生产者对消费者一无所知.换句话说,组件A只生成数据,而不知道哪些组件使用该数据.

这是一种由Storm等面向拓扑的系统解决的数据流.虽然风暴看起来很好,但我持怀疑态度; 它是一个Java系统,它基于Thrift,我都不喜欢它.

我目前倾向于使用AMQP作为数据传输的pub/sub-style方法,使用HTTP作为数据共享/存储的协议.这意味着AMQP队列模型成为公共API - 换句话说,消费者需要知道生产者使用哪个AMQP主机和队列 - 我不是特别高兴,但它可能值得妥协.

AMQP方法的另一个问题是每个组件必须具有非常相似的逻辑:

  • 连接到队列
  • 处理连接错误
  • 将数据序列化/反序列化为通用格式
  • 运行实际的工作人员(goroutines或分叉子进程)
  • 动态扩展工人
  • 容错
  • 节点注册
  • 处理指标
  • 队列限制
  • 队列优先级(一些工人不如其他工人重要)

......以及每个组件需要的许多其他细节.

即使消费者在逻辑上非常简单(想想MapReduce作业,比如将文本分成标记),也有很多样板.当然,我可以自己完成所有这些 - 我非常熟悉AMQP和队列以及其他所有内容 - 并将所有这些包装在一个由所有组件共享的公共包中,但后来我已经在发明框架了.

这类东西是否存在良好的框架?

请注意,我特别询问Go.我想避免使用Hadoop和整个Java堆栈.

编辑:为清晰起见添加了一些要点.

Mos*_*afa 0

我猜您正在寻找消息队列,例如beanstalkdRabbitMQ\xc3\x98MQ(发音为零 MQ)。所有这些工具的本质是它们为 FIFO(或非 FIFO)队列提供推送/接收方法,有些甚至还提供发布/订阅。

\n\n

因此,一个组件将数据放入队列中,而另一个组件则读取数据。这种方法在添加或删除组件以及放大或缩小每个组件方面非常灵活。

\n\n

这些工具中的大多数已经具有 Go(\xc3\x98MQ 在 Gophers 中非常流行)和其他语言的库,因此您的开销代码非常少。只需导入一个库并开始接收和推送消息。

\n\n

为了减少这种开销并避免对特定 API 的依赖,您可以编写一个精简包,它使用这些消息队列系统之一来提供非常简单的推送/接收调用,并在所有工具中使用该包。

\n