gpt4 book ai didi

c# - 多线程服务器中的处理限制

转载 作者:行者123 更新时间:2023-11-30 16:12:39 24 4
gpt4 key购买 nike

在我的客户端-服务器架构中,我需要限制使用的 API 函数很少。服务器用 .net C# 编写,运行在 IIS 上。

到目前为止,我不需要执行任何同步。代码的编写方式即使客户端多次发送相同的请求(例如创建某个请求),一个调用也会成功结束,而所有其他调用都会出错(因为服务器代码 + 数据库结构)。

执行此类限制的最佳方法是什么?例如,我不希望调用 API 方法超过 1 次:foo() 每个用户每分钟。

我想到了一些 SynchronizationTable ,它只有一列 unique_text 并且在计算 foo() 调用之前我会写一些像 foo{userId}{date}{HH:mm} 到这个表。如果调用成功结束,我知道当前分钟没有来自该用户的 foo 调用。

我认为有更好的方法,可能是在服务器代码中,而不是为此使用数据库。当然,可能有成千上万的用户调用 foo

阐明我需要什么:我认为它可能是一些轻量级的 DictionaryMutex

例如:

private static DictionaryMutex FooLock = new DictionaryMutex();

FooLock.lock(User.GUID);
try
{
...
}
finally
{
FooLock.unlock(User.GUID);
}

编辑:一个用户不能同时调用 foo 两次的解决方案对我来说也足够了。 “同时”是指服务器在返回第一次调用的结果之前开始处理第二次调用。

最佳答案

请注意,将此状态保存在 IIS 工作进程的内存中会导致随时丢失所有这些数据的可能性。工作进程可以出于多种原因重新启动。

此外,您可能希望拥有两个 Web 服务器以实现高可用性。将状态保持在工作进程内部会使应用程序不再支持集群。这通常是不行的。

Web 应用确实应该是无状态的。 有很多原因。如果可以,请不要像问题和评论中建议的那样管理自己的数据结构。

根据通话量的大小,我会考虑以下选项:

  1. SQL Server。您的查询非常简单且易于优化。预计每个 CPU 内核每秒会进行 1000 次此类查询。这可以承受很多的负载。您可以免费使用 SQL Express。
  2. Redis 这样的专门商店。 Stack Overflow 使用 Redis 作为持久的、支持集群的缓存。好主意。
  3. 分布式缓存,例如 Microsoft Velocity。或者其他人。

这个存储问题相当简单,因为它非常适合键/值存储模型。而且数据几乎一文不值,因此您甚至不需要备份。

我认为您高估了此速率限制的成本。您的 Web 服务可能比通过主键对简单表执行的单个 UPDATE 成本要高得多。

关于c# - 多线程服务器中的处理限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22605173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com