.net 设计问题:应用程序中的共享、同步、数据访问。。。最好的方法是什么?

.net 设计问题:应用程序中的共享、同步、数据访问。。。最好的方法是什么?,.net,caching,synchronization,data-access,.net,Caching,Synchronization,Data Access,我有一个web应用程序(asp.net),其中工作项根据用户的工作负载提交并分配给用户 使用基于当前分配给用户的项目数(以及一些其他因素)的算法计算用户的工作负载。每个新项目都分配给当前工作负载最低的用户,从而增加了他们的工作负载。当用户完成一个项目时,他们的工作量会减少。项目将同时提交、分配和完成,因此工作量水平将不断变化。工作项存储在SQL数据库中 我需要一种方法来确保每个分配决策都是使用整个用户群的最新工作负载图片做出的 我的想法是在缓存中提供工作负载信息的读/写同步存储 这是最好的方法吗

我有一个web应用程序(asp.net),其中工作项根据用户的工作负载提交并分配给用户

使用基于当前分配给用户的项目数(以及一些其他因素)的算法计算用户的工作负载。每个新项目都分配给当前工作负载最低的用户,从而增加了他们的工作负载。当用户完成一个项目时,他们的工作量会减少。项目将同时提交、分配和完成,因此工作量水平将不断变化。工作项存储在SQL数据库中

我需要一种方法来确保每个分配决策都是使用整个用户群的最新工作负载图片做出的

我的想法是在缓存中提供工作负载信息的读/写同步存储

这是最好的方法吗?还是应该使用数据库来控制锁定?如何避免应用程序中出现瓶颈


非常感谢您的建议。

我会使用数据库来控制这一点,因为用户完成工作的速度不太可能快到需要更实时的方法

因此,我将有一系列与工作项相关的表,您可以查询这些表来计算当前的工作级别,从而确定下一个接收特定工作项的人

然后,您可以使用一系列存储过程将工作项标记为完成,或者将工作项分配给某人

为了最大限度地减少瓶颈,请确保数据库正常化,并且存储过程不会使用很多表,这应该会很好地提升


要检查这一点,您可以编写一些测试工具来确保工作项的分配,并且在高使用率下性能是您想要的。

这取决于许多因素,当您提到缓存时,您是指Asp.Net提供的标准缓存吗

您是否始终拥有最新的信息是绝对重要的,或者如果发出两个请求以进行分配,那么在发出请求时,是否可以将它们分配给两个最不繁忙的用户

您确实可以使用缓存来存储此信息,但是这通常假定您将只使用一台服务器,您是否可能会对高负载使用群集或负载平衡

我能给你的最好建议是构建一个设计良好的应用程序,用一个丰富的域模型表示每个用户和队列的负载,松散耦合的数据访问,以及大量的自动化单元和系统测试。通过这种方式,您可以构建一个正常工作的应用程序,快速启动并运行系统,而不用担心太多优化问题,并尽快开始性能测试\评测

如果\当您遇到性能问题时,您可以通过分析\跟踪来识别瓶颈,并根据需要添加优化,这可能是缓存或优化查询\视图或事物的组合

如果您试图再次猜测瓶颈所在并将其移除,则可能会猜错并破坏系统的设计。设计良好的系统可以在需要时进行优化

我最初设想的方式是一个关系数据库(可能使用视图或存储过程来快速获取工作负载摘要信息),在这个数据库和域模型之间有一个数据映射层(如果需要,可以使用缓存、延迟加载和身份映射来提供效率)。域模型将在很大程度上保存工作负载的表示

我希望它包含用户、工作项、工作队列和分配策略类。其中大部分可以保存在内存中或在请求之间本地存储,每个请求都可以由一个事件表示,该事件将更新模型

例如。
用户完成一个工作项
站点引发域事件以通知域模型的更改
域模型接收事件并更新用户的工作负载


然后,工作分配就是要求域模型在需要时分配工作(它将通过寻找分配最少的用户的策略进行分配)。这可能发生在个人工作请求和事件之外的后台,这些请求和事件在用户下次请求工作时发出通知。

使用数据库来控制此操作

如果出于某种原因,在未来,您需要扩展以利用web场,那么您将不会有问题。但是,如果您正在缓存数据并在本地工作,那么它将导致有趣的事情发生

此外,您还可以利用web garden设置来帮助管理服务器的任何负载;这在缓存的情况下是不可能的

其次,要意识到这可能并不一定是完美的。如果你有大量的工作要做(比如在呼叫中心分发潜在客户),那么只要速度快,就可以真正接近