生产线分配问题
现在有这样一个场景:
模拟一个生产线生产问题。每天在不固定时间有大量客户订单来,每个订单都有客户指定的
交货时间,每个订单下面有很多产品。每个产品分为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个带到下个工期,防止下个工期因意外情况不能按时交工。
[其他解释]
这个分发模块速度要达到如何程度?每个队列分发多少为合适?每件工作(A或B)完成时间在5分钟,如果我要考虑每个订单的交货时间(不能可一个做,也不能全数并行做),产品的产生顺序(B只有A完成后才会生成),工人的成本(会B又会A的工人成本高,尽量让做B)。另外插队列的代价如何?或者取消队列(比如某人突然离开生产线,工作又特别急)
[其他解释]
你说的这些都是你的业务问题,我给出的只是结构设计,具体细节如果我帮你都做了,你打算把这个项目的预算分多少给我呢?
[其他解释]
分发模块负责数据维护,避免了并发,员工都从分发模块中取数据,搞队列
[其他解释]
在实际工厂里,只有办公室的人才会听计算机的指挥。只要东西出了办公室,那就由不得计算机了。事情由人完成,这事的听人滴,工人听组长安排,组长听队长安排。到了人头上,个人都要维护自己的利益,这哪是计算机能控制的事情。
[其他解释]
上亿条是一天的量。
[其他解释]
说是工厂,实际上我们是操作电脑的人员,因为是做的计算机方面的发包产品的,
所以基本上所谓的产品都是在电脑里操作,你可以理解为做一个word文档之类的。
体制上也没有那么复杂,既然是操作电脑,基本是扁平化的管理。因为交货时间
最短的在4小时,所以一个人头安排一个人头下来,可能会赶不上。基本上客户给了
我们数据,我们工厂的人员马上就能看到并且进行操作。现在的问题是怎样保证每个客户
交货时间都不延迟的情况下,让1000人工作最大化的问题。
[其他解释]
感谢方案,我也打算按照这个方案再次尝试下。
我担心的是分发模块速度问题。我以前做过一个类似的生产计划模块,结果不是很成功。
具体的就是做好的生产计划跟不上工厂变化的形势。比如有的工人停工了,有突然紧急工单等。
就导致了上述的每个人丢列的不平衡性(比如有工单快到期了,还排在队列中)。不知道你以前
有过这方面的经验没有,这个难度有多大?提示一点也好。
比如分发模块多久计算一次(根据交工时间,现场工人数量)重新分发?
还有就是分发时是给每个队列把所有产品都分发完,还是只分发一部分即可(比如对队列只有5个),其他未完的不在任何队列。
[其他解释]
比如分发模块多久计算一次(根据交工时间,现场工人数量)重新分发?
还有就是分发时是给每个队列把所有产品都分发完,还是只分发一部分即可(比如对队列只有5个),其他未完的不在任何队列。
可以是实时分发,按照一定的算法先分发到各个队列。
至于意外情况,如停工啊,紧急工单啊,可以用另一套机制来处理。
先说停工,也就是某一个队列需要清空,把队列中的任务分给别的队列。这个你只需要把任务重新分发就好了,可能优先级要变变。
紧急工单啊,看有多紧急,是插到队列的最前面还是说停下手中的任务,改为处理紧急任务。不管怎么说,紧急任务也是任务,优先级高而已。具体的处理逻辑属于业务部分。
[其他解释]
1、确定分发多大的数据量给每个工人,假如是15分钟的工作量。对于紧急单子,就会排在队列前头,优先发给工人,最差情况就是刚刚分发了1000人*15分钟的工作量出去,15分钟后,做完了,这个最新最紧急的才会发出去,实际上,每个人的工作效率不同,所以不会这样。
2、多长时间分发?实际上是每完成一个部分,也就是交给你的15分钟工作量,你就会去队列取下一个15分钟的工作量。