Является ли использование столбца mySQL разумным способом достижения глобальной блокировки?

Я создаю приложение, которое включает значительную обработку изображений. Мы строим его в распределенной усадьбе с произвольным количеством машин для рендеринга, получающих запросы на рендеринг изображений от обмена RabbitMQ.

Поскольку запрос на изображение может поступить в то время, когда рендеринг уже выполняется, и поскольку я не хочу, чтобы два сервера рендеринга дублировали работу, я создал столбец в таблице изображений mySQL с именем _рендеринг. как логическое значение.

Когда сервер рендеринга получает запрос на рендеринг, он выполняет ряд шагов, которые выглядят следующим образом:

  1. Выберите для обновления строки изображения
  2. Если есть _рендеринг == true прервать запрос на рендеринг
  3. Установить is _rendering == true и зафиксировать транзакцию
  4. Визуализировать изображение и сохранить эскиз в глобально доступном хранилище
  5. Установить is _rendering == false и вернуть

Это определенно работает, но я Я беспокоюсь, что эти частые обновления базы данных кажутся немного глупыми. Кроме того, я рассматриваю крайний случай, когда сервер рендеринга выходит из строя в середине рендеринга и оставляет _rendering == true, предотвращая рендеринг этого изображения. Решение, которое я рассматриваю для этой проблемы, состоит в том, чтобы изменить столбец рендеринга is _с tinyint (1 )на поле даты и времени и сохранить дату блокировки как «истинное» значение, а null как «ложное» значение. Периодическая проверка работоспособности службы может выбрать все строки со значением рендеринга is _после определенного периода времени и в этом случае снять блокировку.

Является ли это разумным подходом к этой проблеме, или есть другие, более элегантные подходы, которые мне следует рассмотреть?

7
задан Andrew 28 April 2012 в 22:32
поделиться