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

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

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

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

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

非常感谢。

有帮助吗?

解决方案

这取决于很多因素,当你引用缓存时,你的意思是Asp.Net提供的标准缓存吗?

始终拥有最新信息绝对至关重要,或者如果要分配两个请求,是否可以在请求发出时将它们分配给两个最不忙的用户? / p>

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

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

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

如果你试图猜测你的瓶颈在哪里并将其删除,你可能会猜错并损坏系统的设计。精心设计的系统可以在您需要时进行优化。

我最初设想的方式是关系数据库(可能使用视图或存储过程来快速获取工作负载摘要信息),并在此模型和域模型之间使用数据映射层(可以使用缓存,延迟加载和身份映射,以便在需要时提供效率)。域模型将主要表示工作负载。

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

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

然后,工作分配将要求域模型在需要时分配工作(它将通过寻找分配最少的用户的策略来完成)。这可能发生在个人工作请求和事件之外的背景中,以便在下次要求工作时通知用户。

其他提示

使用数据库来控制它。

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

此外,您可以利用网络花园设置来帮助管理服务器可能带来的任何负载;这在缓存的情况下是不可能的。

其次,要意识到这可能不一定是完美的。如果你有大量的工作要做(比如在呼叫中心分配线索),那么只要速度很快就会非常接近,这一切都很重要。

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

所以我会有一系列与工作项相关的表,您可以查询这些表来计算当前的工作水平,从而确定下一个接收特定工作项的人。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top