【问题标题】:Resource scheduling application资源调度应用
【发布时间】:2010-12-04 20:35:02
【问题描述】:

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

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

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

到目前为止,我看到的唯一解决方案是跟踪每个排他性资源的时间段。因此,如果会议室每隔 5 分钟使用一次,并且安排在上午 9 点到 9 点 30 分,那么上午 9 点到 9 点 30 分对应的 5 分钟时间段都将返回 TRUE,而未安排的时间段将返回 FALSE 或 NULL .然后,DB 事务会将会议室对象从存储中拉出,检查所有时隙,如果更新与现有时隙冲突,则中止。

但是,这似乎会变得非常大,非常快。也许它可以被垃圾收集?此外,设计的目标之一是支持可变粒度,因此某些对象将按分钟安排,而其他对象可能按天安排,这种数据设计不能很好地支持这一点。

目前,我正在尝试使用 Python 在 Google App Engine 上实现这一点,但我真的很想看到一些更通用的解决方案来解决这个问题。我在谷歌上搜索到的只是安排重复性任务,或执行一次性操作以自动构建优化计划的算法。

【问题讨论】:

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

标签: python google-app-engine resources scheduling schedule


【解决方案1】:

您只需要跟踪每个排他性资源的开始时间和结束时间。您的问题中的数据存储实际上是容易的部分 - 困难的(更)部分是制作查询以查找时间间隔内的冲突。

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

【讨论】:

  • 很遗憾,应用引擎不支持您提出的查询。最棘手的部分是它只允许对一个属性进行不等式过滤。此外,我认为它还不允许 OR 查询。您可以通过将查询分成 3 个部分来解决这个问题(大部分情况下)——“meeting.start BETWEEN proposal.start AND proposal.end”和“meeting.end BETWEEN proposal.start AND proposal.end”都是有效的。但是最后一个子句需要更改为不使用 2 个不等式过滤器。 code.google.com/appengine/docs/java/datastore/…
  • 以免我听起来太挑剔,我想补充一点,总体思路确实很好地解决了问题,而无需为每个可能的资源的每个可能的插槽存储数据的开销。
  • 这个查询看起来是正确的,但就像 Peter 所说的那样,它需要一些工作才能使用 App Engine 数据存储区。这应该是可能的,但我需要调查一下。
【解决方案2】:

要自动优化学校或大学的时间表(甚至是其他问题),请查看以下 Java 工具:

TimeFinderUniTimeDrools Solver

用户交互的问题并没有你解释的那么容易解决,因为可能还有其他违反约束的情况(时间表可能会变得更加复杂)。

首先,我只允许时间表制定者访问/更改时间表数据。

其次,我将为每个时间表创建一个独立的解决方案,然后使用上面建议的工具优化这个解决方案。然后可以将解决方案存储到数据库中,并且时间表可以使用它们来进一步优化时间表或与其他解决方案进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2022-07-03
    • 2014-06-16
    相关资源
    最近更新 更多