[英]Best practice to save very busy counter in db
我正在开发一个非常繁忙的网络服务,它应该每秒收到数千个请求。 我希望每个请求都会更新一个计数器字段。 我该怎么做? 将计数器保存在 db 中非常重要,因此在服务器死机的情况下我不会丢失信息。 我已经尝试了以下代码,但这将是每秒数千个请求的巨大瓶颈。 你会怎么做?
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 服务器上的 CPU 使用率。 还要测量磁盘使用情况和事务日志大小。
Redis 可能会成为一个非常好的数据库。 众所周知,它速度很快,并且支持服务器端增量。
您还可以通过将增量写入多个服务器(随机选择一个)来扩展此工作负载。
您也可以使用任何其他数据存储。 如果它本身不支持递增,您可以插入新行。 然后,有一个后台进程定期聚合这些行,以便它们不会不断累积。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.