【发布时间】: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