资源调度应用程序
我正在尝试开发一个应用程序,用来协调多个用户安排独占资源的事情。这个日程数据必须在一个有单一主节点的网络上保持强一致性。被安排的资源可以是会议室,也可以是工地上的工人。
我们假设会议室不能同时安排两个会议,工人也不能同时在两个工地上工作。这个应用的业务逻辑必须防止用户“超额预订”资源。
我现在搞不明白的是,如何表示这些数据,以便如果两个或更多用户同时操作日程,并且出现冲突时,其中一个更新会被中止。
到目前为止,我看到的唯一解决方案是跟踪每个独占资源的时间段。所以如果会议室以5分钟为间隔被使用,并且安排在早上9点到9点半,那么对应的9点到9点半的5分钟时间段都会返回TRUE,而未安排的时间段则返回FALSE或NULL。数据库事务会从存储中取出会议室对象,检查所有时间段,如果更新与现有时间段冲突,就会中止。
不过,这样似乎会很快变得非常庞大。也许可以进行垃圾回收?另外,设计的一个目标是支持不同的粒度,所以有些对象会按分钟安排,而其他的可能按天安排,而这种数据设计对此支持得并不好。
目前,我正在尝试在Google App Engine上使用Python实现这个功能,但我真的很想看看一些更通用的解决方案。我通过谷歌搜索到的只是安排重复任务,或者执行一次性操作的算法来自动构建优化的日程。
2 个回答
如果你想自动优化学校或大学的课程表(甚至其他问题),可以看看以下这些Java工具:
TimeFinder、UniTime 或 Drools Solver
关于用户互动的问题,解决起来没有你想的那么简单,因为可能还会有其他的限制条件(课程安排可能会变得更加复杂)。
首先,我会只允许课程安排人员访问或修改课程表数据。
其次,我会为每个课程安排人员创建一个独立的解决方案,然后用上面提到的工具来优化这个解决方案。这样,解决方案就可以存储到数据库中,课程安排人员可以用它们来进一步优化课程表,或者与其他解决方案进行比较。
你需要记录每个排除资源的开始和结束时间。其实在你的问题中,数据存储是比较简单的部分,真正难的地方是写出查询来检查时间段是否有冲突。
如果我在熬了21个小时后逻辑没错的话,下面的伪代码应该可以用来检查会议是否有冲突。
# Set up your proposed meeting
proposed.start = <thursday, 1pm>
proposed.end = <thursday, 2pm>
# Look for meetings that intersect with or straddle proposed meeting
conflicts = <SELECT * FROM meeting WHERE
meeting.start BETWEEN proposed.start AND proposed.end OR
meeting.end BETWEEN proposed.start AND proposed.end OR
meeting.start <= proposed.start AND meeting.end >= proposed.end>
if conflicts.length > 0:
# We have a conflict!