2

我们建立了一个调度系统来控制我们客户的约会。该系统类似于 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

这种方式不需要锁定一行并减少碰撞事件。

4

1 回答 1

0

这是一个想法:

您可以在当前设计中使用乐观锁定。不要使用单独的版本号或时间戳来检查整行是否已被修改,而是在读取行时保存 used_capacity 数组的备忘录。您只锁定更新,此时您只比较修改后的插槽字节以查看它是否已更新。如果没有,您可以将新值嵌入到该元素中而不修改其他元素,从而保留自您初始读取以来对其他进程执行的其他槽的修改。

对于超过 5 分钟的约会,这也应该适用于一组相邻字节。

如果您在最初阅读时知道有问题的插槽,那么您可以只保存开始的数组索引和显着值而不是整个数组。

于 2014-03-29T17:16:47.260 回答