1

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

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

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

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

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

建议非常感谢。

4

3 回答 3

1

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

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

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

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

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

如果您尝试再次猜测瓶颈在哪里并消除它们,您可能会猜错并损坏系统的设计。一个设计良好的系统可以在您需要时进行优化。

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

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

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

然后,工作分配将是要求域模型在需要时分配工作(它将通过找到分配最少的用户的策略来完成)。这可能发生在单独的工作请求和事件之外的后台,以便在用户下次请求工作时通知他们。

于 2008-10-14T21:06:54.790 回答
1

使用数据库来控制它。

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

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

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

于 2008-10-14T21:25:55.233 回答
0

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

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

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

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

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

于 2008-10-14T21:05:41.827 回答