【问题标题】:ASP.NET + Entity Framework - handling intermittent traffic spikesASP.NET + Entity Framework - 处理间歇性流量峰值
【发布时间】:2015-09-11 20:32:02
【问题描述】:

我有一个 MVC 和 WebAPI 应用程序,需要将用户执行的活动记录回我的数据库。这几乎总是一次插入到少于 5 列的表中(即很少有数据通过网络)。我目前使用的数据接口是Entity Framework 6

每隔一段时间,我就会有大量用户需要记录他们执行了一项活动。在这种情况下,“大量”可能是每秒几百个请求。这通常最多只会持续几分钟。其余时间,我看到网站的流量非常可控。

当流量激增时,我的一些客户端会出现超时错误,因为在服务器将数据插入数据库之前页面没有完成加载。现在,将数据实际插入数据库对于用户继续使用应用程序来说是不必要的,因此我可以将这些请求缓存在本地某处,然后再批量插入它们。

对于 ASP.NET MVC 有没有什么好的解决方案来缓冲传入的请求数据,然后每隔几秒将它们批量插入到数据库中?


就我的环境而言,我有几台服务器在负载平衡的 Web Farm 中运行 Server 2012 R2。如果可能的话,我宁愿保持无状态,因为用户可能会在每个请求中访问不同的服务器。

【问题讨论】:

  • 不知何故,我在想“这就像分析跟踪(事件等)”,所以我的大脑朝那个方向发展 - 有什么东西阻碍了客户端的方法吗?收集数据并在客户端上持续存在直到您定义为“批处理”的“某个时间”?有点像“可怜的 (wo)man/s 消息队列”:) 或者,如果你想一想,它就像一个“客户端购物车”(根据需要添加、删除、刷新)。

标签: c# asp.net entity-framework web-traffic


【解决方案1】:

当流量激增时,我的一些客户端会收到超时错误,因为在服务器将数据插入数据库之前页面没有完成加载。

我建议使用消息队列。让网站渲染代码简单地将一个对象发布到代表操作的队列中,并让一个单独的进程(例如 Windows 服务)读取队列并使用实体框架写入数据库。

更新

或者,您可以记录对文件的访问(快速),并让单独的进程读取文件并将信息写入数据库。

我更喜欢消息队列选项,但它确实增加了另一部分架构。

【讨论】:

  • 什么样的消息队列? MSMQ 是一种我不太熟悉的技术,所以如果有另一个队列服务在 IIS(或 Server 2012 R2)之上运行,我会非常有兴趣了解它。顺便说一句,我在网络场中有多个服务器,所以如果这可以是无状态的,那将是我的设置的理想选择。我会把它添加到我的问题中
  • 注意:如果您可以接受偶尔丢失一些用户活动记录,您可以使用单独的线程和类似 BlockingCollection() 的东西而不是消息队列。应用域回收时未处理的数据会丢失stackoverflow.com/questions/10852515/…
  • 我实际上最终将高事务数据从 SQL 转移到了 Redis。这些数据几乎没有关系,所以我能够很快地重写所有内容。获取数据需要更多思考,但是速度很快!
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多