将特定的 Grain 设置为每个 Silo 最多有 n 个实例

Setting a specific Grain to have max n instances per Silo

我正在致力于扩展现有的基于 Selenium 的 Web 应用程序测试系统的功能。该系统目前一次只能执行一个测试。我想通过为测试执行添加一些并行性来提高系统的吞吐量。

为此,我一直在研究不同的技术,并对 Microsoft 的 Orleans 很感兴趣。然而,在花了一天时间阅读 Orlean 的文档后,我找不到该技术是否支持我需要 运行 特定可扩展参与者在一台计算机上最多 n 次的场景。

在我的例子中,这将是执行测试的演员。通常使用 Selenium,测试执行需要创建一个 WebDriver 对象,然后打开并控制 Web 浏览器实例。这些网络浏览器都必须作为单独的进程打开,而不仅仅是同一进程的新 windows。如果没有上限,假设有 3 个节点的集群和 60 个测试的测试计划,我将在每台机器上同时打开 20 个 Web 浏览器,这可能会导致性能大幅下降或完全崩溃。我希望系统每台机器有 3 个测试执行参与者的上限,并将其余测试存储在队列中,运行仅在另一个工作参与者完成测试后才对它们进行处理。

我将如何使用 Orleans 技术实现它?

你的问题:你想并行化你的测试执行。

解决方案是使用 Selenium-hub 和节点。你不需要奥尔良。

奥尔良开箱即可满足您的大部分要求。 当您在 silo 中配置时,它会并行创建如此多的 grains(默认为 cpu 个核心,请参阅 MaxActiveThreads)。 所有其他请求将由 Orleans 排队。

您可以在 Orleans 配置文件中配置它:

<Scheduler MaxActiveThreads="3"/>

对于 Orleans,正确的解决方案不是乱用 MaxActiveThreads。你不应该真的改变它,几乎永远。相反,您可以总共只有 9 个常规谷物,只需使用 9 个不同的谷物 ID (0...8) 就可以使用它们,系统会将它们随机分布在 3 个服务器上,当您发送新的测试请求时,只需发送它是这 9 个中的一个随机颗粒。

或者,你有 StatelessWorker grain,只有一个 grain,但是将它的最大激活(每台服务器)设置为 3,这样你每台服务器就有 3 次激活(总共 9 次)并且系统将自动负载平衡.

http://dotnet.github.io/orleans/Documentation/Advanced-Concepts/StatelessWorker.html

奥尔良没有内置持久队列。您要么必须在 client/sender 端排队,要么一次发送所有 60 个请求,每个 grain 可以将请求存储在其内部内存队列中,并在前一个工作完成后开始下一个。