我正在运行一个ASP.NET应用程序,其中我已向[global] Page_Load添加了插入/更新查询。因此,每次用户点击网站上的任何页面时,它都会使用他们的活动(会话ID,时间,他们点击的页面)更新数据库。我还没有实现它,但这是关于如何跟踪我网站上当前有多少人的唯一建议。
从长远来看,这会破坏我的数据库和/或IIS吗?我们认为该网站一次平均有30,000到50,000个用户。我不能让我的网站不断锁定每个单个用户点击的每个页面的数据库命中。我担心会发生什么,但这是我第一次尝试这样的解决方案,所以我可能只是过于偏执。
答案 0 :(得分:2)
做它异步。
创建一个处理更新的dll,并在页面加载中点火并忘记参数。
答案 1 :(得分:2)
基于插件的设计比基于更新的设计具有更少的锁定。
因此,如果用户登录然后注销,在基于插件的设计中,您将拥有多个行,每个行中包含一个SessionID,每个活动一个,而在基于Update的设计中,您将拥有一个SessionId ,LoginTime和LogoutTime列,您将根据SessionId更新LogoutTime。
我发现Update活动引起的锁定和争用问题多于Insert活动。
计数和将登录链接到注销等活动需要更复杂的查询和更多的资源。
不言而喻,您的查询,尤其是每个页面上运行的查询,应尽可能快,以免该网站对用户显得缓慢。
答案 2 :(得分:1)
要跟踪您网站上当前的用户数量,您可以使用效果计数器。您所描述的内容听起来更像是每个页面的完整日志记录。
假设您确实在任何时候连接了50,000个用户。
只要您在更新之间没有争用(尝试锁定同一记录),数据库就可以跟踪大量的插入和更新。您需要进行一些容量规划以确保可以承载负载。每分钟访问一页页面的50k用户将为您提供每分钟50k的插入和50k更新,大约850次插入和每秒850次更新,这些都必须提交(刷新日志)。除了响应所有请求(读取)之外,您的DB I / O子系统是否支持这样的写入压力负载?
此外,每分钟点击1次的50k用户每天点击次数达到72密耳,72密耳。日志插入,以这样的速度,您需要仔细规划数据库的大小容量,并考虑您将对收集的数据进行何种分析,因为查询20亿行(一个月的数据)将使您无法快速(实际上......很慢)。
执行异步操作可以让您对非常短峰值有所缓解,但从长远来看并非如此。如果您的数据库系统无法处理负载,那么执行异步调用只会在应用程序进程(在ASP应用程序池中)中创建一个积压队列,这将增长直到内存不足,此时所有警惕的IIS将“回收”应用程序池,因此丢失所有挂起的异步更新。
答案 3 :(得分:0)
我认为在开始会话和结束会话中更新数据库将完成这项工作。这将大大减少陈述的数量。
我认为跟踪点击或开始/结束会话没有任何区别。如果遇到命中,您还需要额外的逻辑来减去非活动用户
编辑:会话结束不会始终触发。我建议在另一个会话开始事件(除了其他插入语句之外)调用更新语句/存储过程来修复无效会话。
我认为在每个页面加载事件中都不需要调用此“修复例程”,因为我认为您无法准确计算“当前访问者数量”。
答案 4 :(得分:0)
IIS日志有什么问题?
2009-05-01 12:30:31 207.219.27.35 GET /assocadmin/ibb-reg.asp - usernameremoved 544.566.570.575 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.0;+SLCC1;+.NET+CLR+2.0.50727;+Media+Center+PC+5.0;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30618) 200 0 0 40058
编辑:我想结束这个答案,但我希望留下评论。考虑撤回这个答案。
答案 5 :(得分:0)
我会将此保留在应用程序状态 - 如果可能的话。在ApplicationStart上创建一些保存到App状态的数据结构,您可以从应用程序的任何位置更新 - 会话开始,页面加载,无论在何处。将其保留在数据库之外。您只是用它来跟踪“当前在线”信息,无论如何它听起来像。
如果您有多个应用实例,或者需要维护IIS日志之外的历史信息,那么这显然不会有效。在这种情况下,请使用克里斯的“即发即弃”解决方案。
答案 6 :(得分:0)
如何在会话中添加小对象?
类似于LoggedInUserFlag:IDisposable
在构造函数中,递增计数器,但是你决定实现它。
然后在Dispose方法中,递减计数器。
这样,无论会话如何结束,计数器将始终(最终)递减。
请参阅:
http://weblogs.asp.net/cnagel/archive/2005/01/23/359037.aspx
有关使用IDisposable的信息。
答案 7 :(得分:0)
我根本不是一个ASP人,但是不是记录所有其他信息,而是插入他们的IP地址呢?
如果他们已经有IP地址,那么有一个last_seen
时间戳,每次刷新时只删除10分钟前的任何行?
这就是我对它的看法。它的空间效率更高,但我不确定如此高调的网站上的检查和删除。
答案 8 :(得分:0)
作为您问题的直接答案,是的,与每个请求一起运行数据库查询是一个坏主意:
我回答了关于如何在另一个帖子中计算用户的问题:
Best way to keep track of current online users
如果您在多服务器/负载平衡环境中运行,则实际上可能需要进行数据库访问。在那种情况下:
如果有任何兴趣,我会在本书中详细介绍同步/异步线程问题和上述技术,以及代码示例:Ultra-Fast ASP.NET。