2016-11-14 10 views
-2

Я храню данные о событиях в хранилище таблиц. Существует несколько экземпляров рабочей роли, которым необходимо получить к ней доступ. Каждому экземпляру рабочей роли необходимо получить доступ к уникальной строке в этой таблице и выполнить некоторую обработку с помощью этих данных, и если ей удастся, необходимо пометить эти данные как выполненные, чтобы любой другой экземпляр этого не забирал. И хотя во время обработки эта строка должна быть невидимой для других работников, чтобы они также обрабатывали это.Запоминание таблиц в виде лазури - Распределенная блокировка

Есть ли конструкция, которая может решить эту проблему?

+1

Непонятно, что вы пытаетесь выполнить. Вы упомянули Azure Service Bus, а также Azure Tables. Не могли бы вы обновить свой вопрос и предоставить более подробную информацию? –

+0

Добавлен еще один контекст –

ответ

1

Как таковые Лазурные таблицы не имеют запирающего механизма. Он доступен для блоков и очередей.

Один из возможных способов решить эту проблему - использовать Master/Slave Pattern. Итак, давайте предположим, что у вас есть 5 экземпляров рабочей роли. Периодически (скажем, каждые 30 секунд) все эти случаи будут пытаться получить аренду на блобе. Только один экземпляр сможет преуспеть, и этот экземпляр станет мастером (все остальные экземпляры станут подчиненными).

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

Для получения более подробной информации см. Competing Consumer Patterns.

0

Используйте Azure Queues и образец производителя, напишите Unit of Work как сообщение в очередь на стороне производителя и пусть ваши рабочие роли будут потреблять работу из очереди и обрабатывать ее. Очередь обрабатывала бы сделать это сообщение невидимым во время его обработки, чтобы избежать дублирования, каждая рабочая роль может затем удалить сообщение из очереди после успешной обработки.

 Смежные вопросы

  • Нет связанных вопросов^_^