日期:2014-05-17  浏览次数:20741 次

生产线分配问题
现在有这样一个场景:
模拟一个生产线生产问题。每天在不固定时间有大量客户订单来,每个订单都有客户指定的
交货时间,每个订单下面有很多产品。每个产品分为A阶段加工和B阶段加工(A完了B)
工人们通过程序去下载产品,然后提交完成后的产品,每个订单下所有产品完成后订单提
交给客户。

各项指标:
每天大概有100万订单,来的时间不固定,每个订单下面大概有1000个产品。交货时间从
半天到一周不等。工人大概有1000名,其中大概500名工人只能做A产品,另外500人A产品
和B产品都能做。

我设计一个怎样的系统既能保证这1000名工人不闲,又能保证每个订单交货时间都不延迟。
比如有个订单比较紧急,那么就优先所有人紧急对应,有的订单交货时间不急,那么就慢慢
做。在做不急的订单时,突然来紧急订单时,全员紧急切换至紧急订单工作上。

我数据库设计上,为了这1000人都能够灵活的随时切换订单,就把所有订单的所有产品都放在
一个大的表里(亿级别),1000人按照交货时间优先到这个表里下载工作。现在的问题是:
1000人同时访问一个数据库表,返回一个未完成的工作,会产生很大的并发竞争性能问题。
现在有一个方案,就是用上简单的生产计划,新的产品订单到来时,按照工人的能力(A,B产品),事先在这1亿表里按照工人编号预分配好,这样工人下载工作时,只按照自己编号下载即可。但问题是有的工人做的快有的做的慢,如果工人编号指定死,那么可能会导致某个时间,
有的工人没活干,有的工人活剩下很多。或者,有特急订单到来时,做到让所有工人都特急对应
比较困难。

不知道大家有没有遇到过这样的事例,一般如何来设计?
------最佳解决方案--------------------
1000人同时访问一个数据库表,返回一个未完成的工作,会产生很大的并发竞争性能问题。

这是你的本质问题。

你应该把1000个人想象成1000个队列,当然,这个队列有些特殊,其中500人只能处理A,剩下的500人可以处理A或B。这个队列需要支持插队功能,这个比较特殊一点。

然后,你需要一个分发模块,这才是核心的东西,这东西按照规则,根据当前队列的压力去分发任务,把需要做的事情放到1000个队列中。

至于那1000个人,只需要干活,干完手上的活从队列中取下一个任务就可以了。

当然我说的只是思路,实际情况会更复杂一点,不过抽象的逻辑基本就是这个样子,不会有太大出入。
------其他解决方案--------------------
我是这么想的,首先你要做一下数据统计,获得一些参数,比如说:A工段,平均完成时间,B工段平均完成时间,假设都是5分钟,再考虑下一个参数,一次分发多少个产品给一个员工,才能效益最大化?假设3~6个,那么每次发包,都给一个员工5*3=15分钟的工作,他完成后,就从分发模块取下一个数据包,数据包在有效时间内未反馈,即认为数据包丢失,将重新分发给下一个人,这里就会出现你说的,某个人走了,他的工作做到一半怎么办?其实,他的数据就丢失了,下次,他接着做,会提示,数据已过期,需要重新下载数据包,也就说,要浪费当前正在做的这个工段的材料而已。

队列优先级还是按照时间,另外,按照日或者更短时间来安排队列,而不是从上亿条记录中处理,即,第一步将上亿条记录中,优先级安排在今天的取出,以后,再插入数据的时候,判断优先级,是放到今日还是以后去做。


------其他解决方案--------------------
不必考虑,你按当前已知情况排班即可。
另外一种方式是把任务分解的班组,由班组自己分配。

我估计你没有在工厂呆过,实际工厂里根本就不是你认为的这种方式运作滴
真实场景是,情况总在变动,细节总在调整,俺们不是上帝也不可能知道所有情况,所以企图用计算机去控制基本是不可能滴,另外一个基本观念是越是完美到细节的玩意,越是不可能玩意,一个细节跟不上,蝴蝶翅膀一动,到你的系统里就变成了飓风。

所以不必考虑细节,你只管按一个固定周期给班组排工,细节让班组人员自行调整。

ps:如果你真正在工厂呆着,你就知道其实各个班组都有自己的应对,你要下1000个零件的活,只要班组长知道这是长期任务,他都会排1200个零件的活?why?现在有能力加个1200个,那就加工来,多余的放着。防止你突然的任务,或着把这200个带到下个工期,防止下个工期因意外情况不能按时交工。
------其他解决方案--------------------
引用:
1000人同时访问一个数据库表,返回一个未完成的工作,会产生很大的并发竞争性能问题。

这是你的本质问题。

你应该把1000个人想象成1000个队列,当然,这个队列有些特殊,其中500人只能处理A,剩下的500人可以处理A或B。这个队列需要支持插队功能,这个比较特殊一点。

然后,你需要一个分发模块,这才是核心的东西,这东西按照规则,根据当前队列的压力去分发……


这个分发模块速度要达到如何程度?每个队列分发多少为合适?每件工作(A或B)完成时间在5分钟,如果我要考虑每个订单的交货时间(不能可一个做,也不能全数并行做),产品的产生顺序(B只有A完成后才会生成),工人的成本(会B又会A的工人成本高,尽量让做B)。另外插队列的代价如何?或者取消队列(比如某人突然离开生产线,工作又特别急)



------其他解决方案--------------------
你说的这些都是你的业务问题,我给出的只是结构设计,具体细节如果我帮你都做了,你打算把这个项目的预算分多少给我呢?
------其他解决方案--------------------
分发模块负责数据维护,避免了并发,员工都从分发模块中取数据,搞队列
------其他解决方案--------------------
在实际工厂里,只有办公室的人才会听计算机的指挥。只要东西出了办公室,那就由不得计算机了。事情由人完成,这事的听人滴,工人听组长安排,组长听队长安排。到了人头上,个人都要维护自己的利益,这哪是计算机能控制的事情。
------其他解决方案--------------------
引用:
我是这么想的,首先你要做一下数据统计,获得一些参数,比如说:A工段,平均完成时间,B工段平均完成时间,假设都是5分钟,再考虑下一个参数,一次分发多少个产品给一个员工,才能效益最大化?假设3~6个,那么每次发包,都给一个员工5*3=15分钟的工作,他完成后,就从分发模块取下一个数据包,数据包在有效时间内未反馈,即认为数据包丢失,将重新分发给下一个人,这里就会出现你说的,某个……

上亿条是一天的量。
------其他解决方案--------------------
引用:
在实际工厂里,只有办公室的人才会听计算机的指挥。只要东西出了办公室,那就由不得计算机了。事情由人完成,这事的听人滴,工人听组长安排,组长听队长安排。到了人头上,个人都要维护自己的利益,这哪是计算机能控制的事情。