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

Gie*_*ius 7 c# asp.net-mvc asynchronous entity-framework asp.net-mvc-3

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

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

我不需要插入数据用于响应,如果因为应用程序重启或smth而松开了部分数据,我将继续存在.

我想我可以在某种程度上排队插入并在后台进行,甚至可以进行某种缓冲 - 比如等待队列收集100个插入,然后在一次通过中制作它们.

我很确定,之前有人必须完成/看过这样的实现,没有必要重新发明轮子,所以如果有人指向正确的方向,我会感激不尽.

Dar*_*rov 6

您可以通过控制器操作触发后台任务来执行插入(触发并忘记):

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

请注意,IIS可以随时回收应用程序,这将导致任何正在运行的任务.


Kev*_*tch 1

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

如果您想更进一步,您可以使用 nServiceBus 之类的东西和发布/订阅模型将事件写入数据库。