|
|
1
3
如果请求必须可靠,则需要将其写入数据库。如果您的返回意味着“我已向商户付款”,那么在您在数据库中实际提交之前,您不能返回。如果处理时间长,则存在基于数据库的异步模式,使用表作为队列或使用内置队列,如 Asynchronous procedure execution . 但是,当需要进行繁重而冗长的处理时,而不是简单的日志插入时,这些方法适用。 当您只想插入日志记录(访问者/url跟踪内容)时,最简单的解决方案是使用CLR的线程池,只需 queue the work ,例如:
这是快速而简单的,它释放了ASP处理程序线程以尽快返回响应。但它也有一些缺点:
SqlCommand.BeginExecuteXXX 以及设置 AsynchronousProcessing 关于与true的连接。不幸的是,AFAIK EF还没有真正的异步执行,因此您必须求助于SqlClient层(SqlConnection,SqlCommand)。但这种解决方案无法解决第一个问题,因为页面点击率太高,日志记录(即每次点击页面时写入)成为一个关键瓶颈。
|
|
|
2
1
过去一年左右,我一直在研究多层解决方案,这些解决方案需要这种功能,而我就是这样做的。
我有一个单身汉,负责在后台基于
|
|
|
3
1
创建一个监视全局内存队列的单独线程。让您的请求将其信息放在队列中并返回,然后线程将该项从队列中取出并将其发布到DB。 在重载情况下,如果线程延迟请求,那么队列将增长。 此外,如果您丢失了计算机,您将丢失所有未处理的队列条目。
|
|
|
4
0
这取决于:当您返回到客户端时,是否需要100%确保数据存储在数据库中? 以这种情况为例:
您还需要通过启动新线程而不是保存到数据库来检查节省了多少毫秒。 与节省响应时间相比,增加的复杂性和维护成本可能过高。而且响应时间的节省可能非常少,以至于不会被注意到。 |