在后台/异步任务中插入数据是什么是最好的方法



我有一个非常快速/轻量级的mvc动作,这是经常要求的,我需要在重负载下保持最小的响应时间。

我需要做的,是不时地根据条件插入少量的数据到sql server(日志唯一id的统计,为~1-5%的查询)。

我不需要为响应插入数据,如果我丢失了一些数据,因为应用程序重启或史密斯,我将生存。

我想象我可以以某种方式插入队列并在后台进行,甚至可以做一些缓冲-例如等待队列收集100个插入,然后一次完成它们。

我敢肯定,以前一定有人做过/见过这样的实现,没有必要重新发明轮子,所以如果有人能指出正确的方向,我会很感激。

你可以从你的控制器动作中触发一个后台任务来执行插入:

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

请注意,IIS可以在任何时候回收应用程序,这会杀死任何正在运行的任务。

创建一个类用于存储需要推送到服务器的数据,创建一个队列用于保存对象队列

Queue<LogData> loggingQueue = new Queue<LogData>();
public class LogData {
   public DataToLog {get; set}
}

在应用程序中创建一个计时器或其他方法,它会不时触发,将排队的数据发布到数据库

我同意@Darin Dimitrov的方法,尽管我要补充一点,您可以简单地使用此任务向机器上的MSMQ写入。从那里,您可以编写一个服务,读取队列并将数据插入数据库。这样就可以限制读取数据的服务,甚至可以将队列移到另一台机器上。

如果你想更进一步,你可以使用nServiceBus和pub/sub模型来将事件写入数据库。

最新更新