我有一个非常快速/轻量级的mvc动作,这是经常请求的,我需要在重负载下保持最短的响应时间。
我需要做的是,不时根据条件向sql server插入少量数据(记录统计信息的唯一ID,~1-5%的查询)。
我不需要为响应插入数据,如果由于应用程序重启或smth而丢失部分数据,我将继续存在。
我想我可以以某种方式排队插入并在后台执行,甚至可以进行某种缓冲 - 比如等待队列收集100个插入,然后一次通过。
我很确定,以前有人必须完成/看过这样的实施,没有必要重新发明轮子,所以如果有人指向正确的方向,我会很感激。
答案 0 :(得分:5)
你可以从你的控制器动作触发一个后台任务来执行插入(发射并忘记):
public ActionResult Insert(SomeViewModel model)
{
Task.Factory.StartNew(() =>
{
// do the inserts
});
return View();
}
请注意,IIS可以随时回收应用程序,这会导致任何正在运行的任务。
答案 1 :(得分:1)
我同意@Darin Dimitrov的方法,虽然我想补充说你可以简单地使用这个任务写入机器上的MSMQ。从那里你可以编写一个读取队列并将数据插入数据库的服务。这样你就可以限制读取数据的服务,甚至可以将队列移到另一台机器上。
如果您想更进一步,可以使用nServiceBus和pub / sub模型之类的东西将事件写入数据库。
答案 2 :(得分:1)
创建一个类,用于存储需要推送到服务器的数据,以及一个用于保存对象队列的队列
Queue<LogData> loggingQueue = new Queue<LogData>();
public class LogData {
public DataToLog {get; set}
}
在应用程序中创建一个计时器或其他一些方法,这些方法将不时被触发,然后将排队的数据发布到数据库