2009-10-08 64 views
1

我试图实现一个应用程序,该应用程序可协调调度独占资源的多个用户。计划数据必须在具有单个主节点的网络上保持强大的一致性。计划资源可以是从会议室到工作场所的工作人员的任何资源。资源调度应用程序

我们假设会议室不能同时安排两次会议,并且一个工作人员不能同时在两个工作地点上。应用程序的业务逻辑不允许用户“超额预订”资源。

我无法弄清楚的是如何表示数据,以便如果两个或多个用户同时在计划中操作并且存在冲突,则其中一个更新将中止。

到目前为止,我所见过的唯一解决方案是跟踪每个排除资源的时隙。因此,如果会议室以5分钟的间隔使用,并且它被安排在9-9:30am,那么9-9:30am对应的5分钟时隙全部返回TRUE,而未计划的时隙将返回FALSE或NULL 。然后数据库事务会将会议室对象拉出商店,检查所有时隙,并在更新与现有时隙冲突时中止。

但是,这似乎会变得非常大,非常快。也许它可能是垃圾收集?此外,设计的目标之一是支持可变粒度,因此一些对象将按分钟到分钟进行计划,而另一些则可能在日常基础上进行,而这种数据设计并不能很好地支持这一点。

目前,我正试图在Google App Engine上使用Python实现此功能,但我真的很想看到针对此问题的一些更一般的解决方案。我提出的所有Google搜索都是安排重复执行的任务,或执行一次性操作以自动构建优化时间表的算法。

+0

另一种可能的解决方案是将资源“锁定”存储在数据存储中。然后要求客户在以可写形式向用户呈现时间表之前异步获取锁。在客户端获取锁之前,日程表是只读的。这有效地将操作序列化,并允许将业务逻辑移动到客户端,但问题将是确定可接受的资源争用的上限。 – 2009-10-08 23:36:56

回答

3

您需要跟踪每个排除资源的开始和结束时间。问题中的数据存储实际上是一个简单的部分 - 硬件(呃)部分是制定查询来查找时间间隔中的冲突。

如果我的逻辑在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! 
+1

不幸的是,应用引擎不支持你提出的查询。最棘手的部分是它只允许在一个属性上进行不等式过滤。另外,我不认为它也允许OR查询。你可以通过将查询分成三部分来解决这个问题(“meeting.start BETWEEN proposed.start AND proposed.end”和“meeting.end BETWEEN proposed.start AND proposed.end”)都是有效的。但最后一个条款将需要更改为不使用2个不等式过滤器。 http://code.google.com/appengine/docs/java/datastore/queriesandindexes.html#Restrictions_on_Queries – 2009-10-08 21:19:19

+1

为了避免我听起来太挑剔,我想补充一点,一般的想法很好地解决了这个问题,没有存储开销每种可能的资源的每个可能的槽的数据。 – 2009-10-08 21:23:01

+0

这个查询看起来是正确的,但是就像Peter所说的那样,它需要一些工作来使用App Engine数据存储。这应该是可能的,但我需要研究它。 – 2009-10-08 23:26:04

1

自动优化学校或大学(或甚至其它问题)的时间表,看看下面的Java工具:

TimeFinderUniTimeDrools Solver

与用户交互的问题并不像你想象的那样容易解决,因为还可能有其他约束违规(时间安排可能会变得更加复杂)。

首先,我只允许时间表访问/更改时间表数据。其次,我会为每个时间表创建一个独立的解决方案,然后用上面提出的工具优化这个解决方案。解决方案然后可以存储到数据库,时间表可以使用它们来进一步优化时间表或与其他解决方案进行比较。