Вставка данных в фоновом / асинхронном задании, как лучше всего? - PullRequest
6 голосов
/ 17 октября 2011

У меня очень быстрое / легкое действие mvc, которое запрашивается очень часто, и мне нужно поддерживать минимальное время отклика при большой нагрузке.

Что мне нужно сделать, так это время от времени в зависимости от условий вставлять небольшой объем данных на сервер sql (регистрировать уникальный идентификатор для статистики, для ~ 1-5% запросов).

Мне не нужны вставленные данные для ответа, и если я потеряю их из-за перезапуска приложения или чего-то еще, я выживу.

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

Я почти уверен, что кто-то уже делал / видел такую ​​реализацию раньше, нет необходимости изобретать колесо, поэтому, если кто-то может указать правильное направление, я был бы благодарен.

Ответы [ 3 ]

5 голосов
/ 17 октября 2011

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

public ActionResult Insert(SomeViewModel model)
{
    Task.Factory.StartNew(() =>
    {
        // do the inserts
    });
    return View();
}

Примите во внимание, что IIS может перезапустить приложение в любое время, что приведет к остановке любого работающегозадачи.

1 голос
/ 17 октября 2011

Создайте класс, который будет хранить данные, которые необходимо отправить на сервер, и очередь для хранения очереди объектов

Queue<LogData> loggingQueue = new Queue<LogData>();

public class LogData {

   public DataToLog {get; set}

}

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

1 голос
/ 17 октября 2011

Я согласен с подходом @ Darin Dimitrov, хотя я бы добавил, что вы можете просто использовать это задание для записи в MSMQ на машине. Оттуда вы можете написать сервис, который читает очередь и вставляет данные в базу данных. Таким образом, вы можете ограничить службу, которая читает данные, или даже переместить очередь на другой компьютер.

Если вы хотите сделать еще один шаг вперед, вы можете использовать что-то вроде nServiceBus и модель pub / sub для записи событий в базу данных.

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