Мы создали систему планирования для контроля встреч наших клиентов. Эта система аналогична той, которую Prometric использует для планирования экзаменов. Основные заботы: гарантировать отсутствие перепланировок, поддерживать не менее ста тысяч назначений в месяц и позволять легко увеличивать/уменьшать пропускную способность центра тестирования.
Мы разработали следующий дизайн на основе векторов емкости. Мы исходили из того, что каждая встреча требует не менее пяти минут. Вектор состоит из 288 слотов (24 часа * 12 слотов в час), каждый из которых представлен одним байтом. Вектор позволяет системе представлять до 255 встреч каждые пять минут. Используемая информация состоит из двух векторов: один для хранения мощности центра тестирования (НОМИНАЛЬНАЯ МОЩНОСТЬ), а другой для хранения используемой мощности (ИСПОЛЬЗУЕМАЯ МОЩНОСТЬ). Чтобы восстановить текущую мощность (ТЕКУЩАЯ МОЩНОСТЬ), система берет НОМИНАЛЬНУЮ МОЩНОСТЬ тестирования и вычитает ИСПОЛЬЗУЕМУЮ МОЩНОСТЬ.
База данных имеет следующую структуру:
НОМИНАЛЬНАЯ МОЩНОСТЬ
Номинальная мощность представляет собой мощность за рабочие дни (пн-пт).
| 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
Таким образом, не нужно будет блокировать строку и уменьшать количество коллизий.