Как реализовать блокировку на ферме серверов? - PullRequest
4 голосов
/ 23 апреля 2009

Существуют ли известные рекомендации по синхронизации задач в ферме серверов? Например, если мой веб-сайт работает на ферме серверов, и два модератора пытаются выполнить какое-либо действие, требующее записи в несколько таблиц в базе данных, а запросы этих модераторов обрабатываются различными серверами на сервере ферма, как можно реализовать некоторые функции блокировки, чтобы гарантировать, что они не смогут выполнить это действие одновременно для одного и того же элемента?

Пока что я думаю об использовании таблицы в базе данных для синхронизации, например, проверьте идентификатор элемента в таблице, если нет, вставьте его и продолжите, в противном случае вернитесь. Также, возможно, для этого можно использовать общий кэш, но я сейчас этим не пользуюсь.

Любой другой способ?

Кстати, я использую MySQL в качестве базы данных.

Ответы [ 5 ]

4 голосов
/ 08 мая 2009

Ваш вопрос подразумевает контроль параллелизма на уровне данных - в этом случае используйте механизмы управления параллелизмом СУБД.

Это не поможет вам, если позже вы захотите контролировать действия на уровне приложения, которые не обязательно отображают один на один для объекта данных (например, доступ к записи таблицы). Общее решение - обратный прокси-сервер, который понимает семантику уровня приложения и, при необходимости, сериализует. (Это отрицательно скажется на доступности.)

Наверное, не мешало бы прочитать и теорему CAP!

2 голосов
/ 23 апреля 2009

Возможно, вы захотите изучить службу распределенной блокировки, такую ​​как Zookeeper . Это повторная реализация службы Google, которая обеспечивает очень высокую скорость координации распределенной блокировки ресурсов для приложений. Однако я не знаю, насколько легко было бы встроиться в веб-приложение.

1 голос
/ 23 апреля 2009

Если все состояние находится в (центральной) базе данных, то транзакции базы данных должны позаботиться об этом за вас.

См. http://en.wikipedia.org/wiki/Transaction_(database)

0 голосов
/ 20 августа 2013

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

Вы можете использовать запрос db «SELECT FOR UPDATE» для объекта блокировки, так что вы фактически используете db для достижения механизма блокировки.

если вы используете ORM, вы также можете сделать это. например, в nhibernate вы можете сделать:

session.Lock(Member, LockMode.Upgrade);
0 голосов
/ 23 апреля 2009

Наличие таблицы блокировок - это хороший способ сделать это просто и работает.

Вы также можете использовать код в качестве службы на одном сервере, более подход SOA.

Вы также можете использовать поле TimeStamp с транзакциями, если временная метка изменилась с момента последнего получения данных, и вы можете отменить транзакцию. Так что, если кто-то входит первым, у него есть приоритет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...