分布式任务 分配,调度,汇总的问题。

Grrrr 发布于 2013/05/03 14:44
阅读 703
收藏 2
先吐槽几句,做了快8个月的分布式开发了,一行一行的敲出来,收获很多,前阵子应聘了一家分布式架构的岗位,从头到尾介绍了我自己做的小东西。虽然面试失败了, 但是我给自己一个 ‘优’,再接再厉!

接下来说说现在遇到的问题,关于分布式任务分配,调度和处理的问题,简单的举个例子:

http://www.wolframalpha.com/input/?i=sinx

拿Mathematica这个例子来说,我的输入仅仅是一个sinx,但是输出却很丰富,有它的导数,有它的函数图像,有不定积分等等。。。其实这些一个一个的结果都是由集群里面不同的Mathematica服务算出来的(当然一个机器可以开很多个这样的服务)
最后将这些结果汇总起来,最终形成结果展示在页面上。暂且认为这样的一个输入为一个Job,一个一个的结果为Task,那么一个Job可以划分为若干个Task.

怎么在集群里面调度,汇总这些Task感觉对自己来说是一个瓶颈,想了很多天也没一个满意的方案。

网上查了很多资料,里面研究的更复杂,就不说了。这里假设每个Task是没有权重的感念。每个服务的处理性能都是一样的。每个Task的耗时是一样的。
这样分配,调度问题就解决了,即按照Load Balancer的算法顺序分配给对应的服务就可以了。调度为FIFO.

我目前的做法:
定义一个ConcurrentLinkedQueue<Task>列队,以及一个监测线程。各个子服务在zookeeper注册服务节点,load balance监测服务节点。
各服务线程和load balance用长链接RPC方式通信。

1.客户端生成job,遍历job的list<Task>,把task状态置为NEW丢进列队.并在列队这里等候,同时把状态为SCCUESS的,job id 相同的task拿出来,重新装到list<Task>.一直等到list<Task>装满(或超时限),则job处理完成。

2.监测线程发现列队有状态为NEW/FAILED的task,拿出来,根据load balance分配到对应的服务。

3.各个子服务处理task,将结果放进task.不管成功是否(SCCUESS/FAILED)都丢进列队.

我想把job/task的这种提交方式做成一个很通用的,即以后更新cache,db,搜索,各种任务都是以这种方式弄的。

大家都可以说说自己的想法,或者可以指点一下我目前的方案。PS:写到最后发现越来越像Message Queue......
加载中
0
专业打酱油
专业打酱油

好高端,不太懂!

但是感觉这个例子不属于分布式!

Grrrr
Grrrr
哪里感觉不像呢?
0
PaulWong
PaulWong

http://code.taobao.org/p/tbschedule/wiki/index/

有个现成的。

返回顶部
顶部