我正在开发一个非常繁忙的Web服务,该服务应每秒收到数千个请求。我希望每个请求都会更新一个计数器字段。我该怎么做?将计数器保存在数据库中非常重要,因此如果服务器死亡,我不会丢失信息。我尝试了以下代码,但这将是一个巨大的瓶颈,每秒需要数千个请求。你会怎么做?
public void Upload(int organizationId)
{
try
{
lock (UpadateLock)
{
using (var db = new DbContext())
{
Counter counter = db.Counters.Where(c => c.OrganizationId == organizationId).FirstOrDefault();
counter.count++;
db.SaveChanges();
}
}
}
catch (Exception ex)
{
}
}
如果服务器死亡时绝对不会丢失数据,则必须写入每个增量的持久存储。
问题只是存储要使用。
您当然可以使用SQL进行。这样的简单查询并不太贵。您可以对此进行基准测试,以查看开销是否可以接受。测量Web服务器和SQL Server上的CPU使用率。还测量磁盘使用率和交易日志大小。
redis可能是一个非常好的数据库。已知它很快,并且支持服务器端增量。
您还可以通过将增量写入多个服务器(随机选择一个(来扩展此工作量。
您也可以使用任何其他数据存储。如果它不支持本地增量,则可以插入新行。然后,具有定期聚合这些行的背景过程,以免它们不断积累。