我们建立了一个调度系统来控制我们客户的约会。该系统类似于 Prometric 用于安排考试的系统。主要关注点是:保证没有过度调度,支持每月至少十万次预约,并允许轻松增加/减少测试中心的容量。
我们基于容量向量设计了以下设计。我们假设每次约会至少需要五分钟。一个向量由 288 个时隙(24 小时 * 12 个时隙/小时)组成,每个时隙用一个字节表示。该向量允许系统每五分钟代表多达 255 个约会。使用的信息由两个向量组成:一个存储测试中心容量(NOMINAL CAPACITY),另一个存储使用容量 (USED CAPACITY)。为了恢复当前容量(CURRENT CAPACITY),系统将测试 NOMINAL CAPACITY 减去 USED CAPACITY。
该数据库具有以下结构:
额定容量
标称产能代表工作日(周一至周五)的产能。
| TEST_CENTER_ID | NOMINAL_CAPACITY
| 1 | 0000001212121212....0000
| 2 | 0000005555555555....0000
...
| N | 0000000000010101....0000
已用容量
此表存储每天/测试中心的已用容量。
| TEST_CENTER_ID | DATE | USED_CAPACITY
| 1 | 01/01/2010 | 0000001010101010...0000
| 1 | 01/02/2010 | 0000000202020202...0000
| 1 | 01/03/2010 | 0000001010101010...0000
...
| 2 | 01/01/2010 | 0000001010101010...0000
...
| N | 01/01/2010 | 0000000000000000...0000
客户选择考试中心和日期后,系统会显示可用的空位,并进行以下计算。例如:
TEST_CENTER_ID 1
DATE 01/01/2010
NOMINAL_CAPACITY 0000001212121212...0000
USED_CAPACITY 0000001010101010...0000
AVAILABLE_CAPAC 0000000202020202...0000
如果客户决定安排约会,系统将锁定所选日期(#USED CAPACITY 表中的一行)并增加相应的字节。
该系统现在运行良好,但如果预约数量增加太多,我们预计会出现争用问题。
有没有人有更好/另一个模型来解决这个问题或改进它的建议?
我们已经考虑通过以小时为单位细分向量的表示并更改为乐观锁定策略来避免争用。例如:
| TEST_CENTER_ID | DATE | USED_CAPACITY_0 | USED_CAPACITY_1 | ... | USED_CAPACITY_23
| 1 | 01/01/2010 | 000000101010 | 1010... | ... | ...0000
这种方式不需要锁定一行并减少碰撞事件。