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

时间:2014-03-24 09:16:29

标签: c# multithreading synchronization

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

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

执行此类限制的最佳方法是什么?例如,我不再需要1次API方法调用:每位用户每分钟foo()

我想到了一些SynchronizationTable,它只有一列unique_text,在计算foo()之前,我会向此表写foo{userId}{date}{HH:mm}之类的内容。如果呼叫结束成功,我知道当前分钟内该用户没有foo来电。

我认为有更好的方法,可能在服务器代码中,不使用db。当然,可能有成千上万的用户呼叫foo

澄清我需要的东西:我认为它可能是轻微的DictionaryMutex

例如:

private static DictionaryMutex FooLock = new DictionaryMutex();

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

编辑: 一个用户无法同时拨打foo两次的解决方案对我来说也足够了。通过"同时"我的意思是服务器在返回第一次调用的结果之前开始处理第二个调用。

1 个答案:

答案 0 :(得分:3)

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

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

网络应用确实应该是无国籍的。很多原因。如果您可以提供帮助,请不要像管理问题和评论中所建议的那样管理您自己的数据结构。

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

  1. SQL Server 。您的查询非常简单,易于优化。每个CPU核心每秒可以预期1000次这样的查询。这可以承受很多的负载。您可以免费使用SQL Express。
  2. Redis 这样的专门商店。 Stack Overflow使用Redis作为持久的,支持群集的缓存。一个好主意。
  3. 分布式缓存,如Microsoft Velocity。或者其他人。
  4. 这个存储问题相当容易,因为它很适合键/值存储模型。数据几乎毫无价值,因此您甚至不需要备份。

    我认为你高估了这种速度限制的成本。您的网络服务可能比简单表格的主键UPDATE花费更多。