Обработка одновременного чтения и записи Entity Framework при развертывании нескольких экземпляров (в облаке) - PullRequest
0 голосов
/ 22 апреля 2019

В недавнем проекте, в котором мы используем EF6 (в веб-приложении ASP.Net MVC) и развертываем решение для облачного сервиса из 12 экземпляров, с которым мы сталкиваемся с некоторыми серьезными проблемами параллелизма. Несмотря на то, что это типичная проблема, связанная с развертыванием нескольких экземпляров Azure, я полагаю, что эта проблема должна быть применима и к веб-садам и веб-фермам.

В таблице, например, " Fulfillment_Request ", у нас есть запросы на выполнение в различных состояниях (Запланировано, Ожидание, Выполняется, Завершено, Сбой и т. Д.) В веб-приложении есть фоновый процесс, который периодически просыпается и извлекает все «ожидающие» ..

Поскольку существует 12 экземпляров с кодом доступа к данным, во многих случаях фоновое задание вызывается одновременно в нескольких экземплярах и извлекает один и тот же набор ожидающих запросов. Поскольку обработка является сложным и длительным процессом рисования, мы не можем ждать, пока обработка не будет завершена, а затем удастся разрешить только одному набору, а остальные потерпят неудачу (на основе столбца метки времени). Нам нужно ограничить выборку только одним экземпляром. Вдохновленный другим ответом stackoverflow на аналогичную проблему ( Как я могу заблокировать таблицу на чтение, используя Entity Framework? ), я поместил следующий код в код таблицы Read:

"SELECT TOP 1 KeyColumn FROM MyTable WITH (TABLOCKX, HOLDLOCK)"

К сожалению, это не решается, поскольку 2 или более потоков, вероятно, одновременно входят в контекст и получают блокировку, и таблица теперь заблокирована ..

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

В настоящее время мы обходим эту проблему, либо используя Stored Proc, который имеет эксклюзивный код блокировки таблицы ИЛИ , помещая извлеченные значения в очередь, которая вызывает событие у одного из слушателей в экземпляры и сообщение обрабатывается.

...