我正在设计一个应用程序,它需要一组分布式处理工作人员,这些工作人员需要在特定流中异步使用和生成数据。例如:
组件 A 获取页面。
组件 B 分析来自 A 的页面。
组件 C 存储来自 B 的分析过的点点滴滴。
显然,涉及的组件不止三个。
进一步要求:
每个组件都需要是一个单独的进程(或一组进程)。
生产者对他们的消费者一无所知。换句话说,组件 A 只生成数据,不知道哪些组件使用该数据。
这是一种由Storm等面向拓扑的系统解决的数据流。虽然 Storm 看起来不错,但我持怀疑态度;它是一个 Java 系统,它基于 Thrift,我都不喜欢这两个系统。
我目前倾向于使用 AMQP 作为数据传输的 pub/sub 风格的方法,使用 HTTP 作为数据共享/存储的协议。这意味着 AMQP 队列模型变成了一个公共 API——换句话说,消费者需要知道生产者使用哪个 AMQP 主机和队列——我对此并不特别满意,但可能值得妥协。
AMQP 方法的另一个问题是每个组件必须具有非常相似的逻辑:
连接到队列
处理连接错误
将数据序列化/反序列化为通用格式
运行实际的工作人员(goroutines 或 fork 子进程)
工人的动态扩展
容错
节点注册
处理指标
队列限制
队列优先级(一些工人不如其他工人重要)
...以及每个组件都需要的许多其他小细节。
即使消费者在逻辑上非常简单(想想 MapReduce 工作,比如将文本拆分为标记),也有很多样板。当然,我可以自己完成所有这些工作——我非常熟悉 AMQP 和队列以及其他一切——并将所有这些都包装在一个由所有组件共享的公共包中,但是我已经开始发明一个框架了。
这种东西是否存在一个好的框架?
请注意,我是专门询问 Go 的。我想避免使用 Hadoop 和整个 Java 堆栈。
编辑:为清楚起见添加了一些要点。
一只甜甜圈
元芳怎么了
慕姐4208626
相关分类