我们已经建立了一个调度系统来控制我们客户的约会。这个 系统类似于Prometric用于安排考试的系统。主要的 关注的是:保证没有超额上市,至少支持一个 每月十万次约会并允许增加/减少 测试中心的容量很容易。
我们基于容量向量设计了以下设计。我们认为 每次约会至少需要五分钟。矢量由288组成 插槽(每小时24小时* 12个插槽),每个插槽由一个字节表示。该 vector允许系统每五个代表最多255个约会 分钟。使用的信息由两个向量组成:一个用于存储 测试中心容量(NOMINAL CAPACITY),另一个用于存储已用容量 (使用容量)。要恢复当前容量(CURRENT 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
如果客户决定安排约会,系统将锁定所选的 day(#USED CAPACITY表中的一行)并增加相应的字节。
系统现在运行良好,但我们预见到争用问题 约会人数增加太多。
是否有人对此问题或建议有更好/另一种模式 改善它?
我们已经考虑通过潜水表示来避免争用 矢量在小时,并改为乐观的锁定策略。例如:
| TEST_CENTER_ID | DATE | USED_CAPACITY_0 | USED_CAPACITY_1 | ... | USED_CAPACITY_23
| 1 | 01/01/2010 | 000000101010 | 1010... | ... | ...0000
这种方式不需要锁定行并减少碰撞事件。
答案 0 :(得分:0)
以下是一个想法:
您可以对当前设计使用乐观锁定。不是使用单独的版本号或时间戳来检查整行是否已被修改,而是在读取行时保存used_capacity数组的纪念品。您只能锁定更新,此时只比较修改的插槽字节以查看它是否已更新。如果没有,您可以将新值嵌入到该元素中而不修改其他元素,从而保留自初始读取以来由其他进程执行的对其他插槽的修改。
对于长度超过5分钟的约会,这应该适用于一组相邻的字节。
如果您在最初阅读时知道有问题的插槽,那么您只需保存起始数组索引和显着值,而不是整个数组。