C# ASP.NET应用程序状态-创建“每分钟请求数”计数器

C# ASP.NET应用程序状态-创建“每分钟请求数”计数器,c#,asp.net,vb.net,counter,state,C#,Asp.net,Vb.net,Counter,State,这一定很容易,但我的大脑拒绝解决它 在ASP.net中,直接使用应用程序状态创建全局页面请求计数器。只需增加一个应用程序变量: Application("Hitcount") = Application("HitCount") + 1 或者别的什么。但我如何衡量过去一分钟收到的点击量?我需要在前60秒内持续计算应用程序点击次数,以便对传入请求进行流量管理。例如,如果当前负载超过每分钟1000次点击,则将其重定向到某个位置。您最好使用日志分析工具,通过使用更宽的时间窗口分析请求日志来获得这些统

这一定很容易,但我的大脑拒绝解决它

在ASP.net中,直接使用应用程序状态创建全局页面请求计数器。只需增加一个应用程序变量:

Application("Hitcount") = Application("HitCount") + 1 

或者别的什么。但我如何衡量过去一分钟收到的点击量?我需要在前60秒内持续计算应用程序点击次数,以便对传入请求进行流量管理。例如,如果当前负载超过每分钟1000次点击,则将其重定向到某个位置。

您最好使用日志分析工具,通过使用更宽的时间窗口分析请求日志来获得这些统计信息。有一些非常好的工具可以让你在历史查看时间窗口之间切换,并查看一天、一周、一个月内的峰值流量

我建议你不要在数据库中插入点击记录,除非你的网站容量很小。避免将请求延迟绑定到数据库,除非您确定性能开销在允许的公差范围内。除了非常轻微的开销外,检测应该尽量不影响它所测量的服务器,这就是事后日志分析工作正常的原因

第一步是调整IIS以添加一些非默认字段,这些字段是标准W3C日志格式的一部分

配置这些高级字段的一种方法是通过IIS管理器,在->日志->选择字段下


要使用第三方分析器获得良好的图表,需要诸如bytes recvd/sent和TimePent之类的字段。

您最好使用日志分析工具,通过使用更宽的时间窗口分析请求日志来获得这些统计数据。有一些非常好的工具可以让你在历史查看时间窗口之间切换,并查看一天、一周、一个月内的峰值流量

我建议你不要在数据库中插入点击记录,除非你的网站容量很小。避免将请求延迟绑定到数据库,除非您确定性能开销在允许的公差范围内。除了非常轻微的开销外,检测应该尽量不影响它所测量的服务器,这就是事后日志分析工作正常的原因

第一步是调整IIS以添加一些非默认字段,这些字段是标准W3C日志格式的一部分

配置这些高级字段的一种方法是通过IIS管理器,在->日志->选择字段下


要使用第三方分析器获得良好的图表,需要诸如bytes recvd/sent和TimePent之类的字段。

您可以使用内存缓存来实现这一点。这将计算10分钟内的滚动请求计数。不过,我还没有测试它的性能

public BaseController() : base() 
{
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTime.UtcNow.AddMinutes(10);

    MemoryCache.Default.Add(Guid.NewGuid(), "RequestCount", policy);
}

public int RequestCountPerMinute
{
    get
    {
        return MemoryCache.Default
           .Where(kv => kv.Value.ToString() == "RequestCount").Count() / 10;
    }
}

您可能可以使用内存缓存来实现这一点。这将计算10分钟内的滚动请求计数。不过,我还没有测试它的性能

public BaseController() : base() 
{
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTime.UtcNow.AddMinutes(10);

    MemoryCache.Default.Add(Guid.NewGuid(), "RequestCount", policy);
}

public int RequestCountPerMinute
{
    get
    {
        return MemoryCache.Default
           .Where(kv => kv.Value.ToString() == "RequestCount").Count() / 10;
    }
}

在数据库或应用程序中插入命中记录和时间戳。然后,您的查询将检索过去10分钟左右每分钟的平均请求数。通过Windows已经有很多可用的指标,尽管它们往往是每秒而不是每分钟。有相当多的网站提供了关于哪些网站可能最重要以及为什么最重要的建议,例如,在数据库或应用程序中插入一条带有时间戳的点击记录。然后,您的查询将检索过去10分钟左右每分钟的平均请求数。通过Windows已经有很多可用的指标,尽管它们往往是每秒而不是每分钟。有相当多的网站提供了关于哪些网站可能最重要以及为什么最重要的建议,例如,在我看来,在应用程序池重启后,这些网站可能无法生存,也可能无法承受巨大的内存压力。@AndrewMorton应用程序池重启没什么大不了的。建立滚动平均值只需10分钟。如果我们所关心的只是过去的一分钟,那么您可以将缓存策略更改为60秒;缓存过期策略是一个很好的解决方案。然而,我发现使用“MemoryCache.Default.Add”对我来说有点不稳定,而且似乎经常重置。“目前,cache.insert在60秒到期的情况下运行良好。在我看来,它似乎无法在应用程序池重新启动后继续运行,并且可能不会承受太大的内存压力。@AndrewMorton重新启动应用程序池并没有什么大不了的。”。建立滚动平均值只需10分钟。如果我们所关心的只是过去的一分钟,那么您可以将缓存策略更改为60秒;缓存过期策略是一个很好的解决方案。然而,我发现使用“MemoryCache.Default.Add”对我来说有点不稳定,而且似乎经常重置。目前与“缓存”配合良好
.insert'60秒到期。OP如何根据IIS日志中的数据进行重定向?@Shoe-重定向与分析站点流量有什么关系?根据OP的最后一句话,如果当前负载超过每分钟1000次,则重定向到某个地方。哦,我第一次没有读到,你是对的,日志分析不是实时的,也不能解决问题。我会推荐智能防火墙或负载平衡器,即使是运行Linux的免费基于VM的负载平衡器也可以做到这一点。OP如何根据IIS日志中的数据进行重定向?@Shoe-重定向与分析站点流量有什么关系?根据OP的最后一句话,如果当前负载每分钟超过1000次,则重定向到某个地方。哦,我第一次没有读到这一点,你是对的,日志分析不是实时的,也不能解决问题。我会推荐一个智能防火墙或负载平衡器,即使是运行Linux的免费基于VM的负载平衡器也可以做到这一点。