2015-09-11 6 views
1

У меня есть приложение MVC и WebAPI, которое должно регистрировать действия, выполняемые пользователями, обратно в мою базу данных. Это почти всегда одна вставка в таблицу, которая имеет менее 5 столбцов (т. Е. Очень мало данных пересекает провод). Интерфейс данных, который я использую в настоящее время, является Entity Framework 6ASP.NET + Entity Framework - обработка прерывистых трафик трафика

Время от времени я получаю большое количество пользователей, которым необходимо зарегистрировать, что они выполнили одно действие. В этом случае «Большой номер» может составлять пару сотен запросов каждую секунду. Обычно это будет продолжаться всего несколько минут. В остальное время я вижу очень управляемый трафик на сайт.

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

Есть ли хорошие решения для ASP.NET MVC для буферизации входящих данных запроса, а затем их вставки в базу данных каждые несколько секунд?


Что касается моей среды, у меня есть несколько серверов, на которых работает сервер 2012 R2 в балансировке нагрузки Web Farm. Я бы предпочел остаться без гражданства, если это вообще возможно, потому что пользователи могут поражать разные серверы за запрос.

+0

Каким-то образом я думаю, что «это похоже на отслеживание аналитики (события и т. Д.)», Поэтому мой мозг идет в этом направлении - что-то препятствует приближению клиентской стороны? Собирать данные и сохраняться на клиенте до тех пор, пока «какое-то время» вы не определите «пакет»? Вид «бедной (wo) мужской/мужской очереди сообщений» :) Или, если вы думаете об этом, это как «корзина покупок на стороне клиента» (добавьте, удалите, при необходимости промойте). – EdSF

ответ

2

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

Я бы предложил использовать очередь сообщений. Попросите код рендеринга веб-сайта просто отправить объект в очередь, представляющую действие, и иметь отдельный процесс (например, службу Windows), который считывает очередь и записывает в базу данных с помощью Entity Framework.

UPDATE

В качестве альтернативы вы можете войти доступ к файлу (быстро), и имеют отдельный процесс чтения файла и записывать информацию в базе данных.

Я предпочитаю вариант очереди сообщений, но он добавляет еще одну часть архитектуры.

+0

Какая очередь сообщений? MSMQ - это технология, с которой я не очень хорошо знаком, поэтому, если есть еще одна служба очереди, которая работает поверх IIS (или Server 2012 R2, если на то пошло), мне было бы очень интересно узнать об этом. Кстати, у меня несколько серверов в веб-ферме, поэтому, если это может быть без гражданства, это было бы идеально для моей настройки. Я добавлю, что на мой вопрос –

+0

Я использовал MSMQ и Rabbit MQ. https://www.rabbitmq.com/ Оба будут работать нормально. –

+0

Примечание. Если вы в порядке, очень иногда теряя часть регистрации активности пользователя, вы можете использовать отдельный поток и что-то вроде BlockingCollection(), а не очередь сообщений. Необработанные данные будут потеряны, когда домен приложения переработает http://stackoverflow.com/questions/10852515/correctly-implement-background-process-thread-in-asp-net –