gpt4 book ai didi

multithreading - 编排 Windows Azure Web 角色以应对偶尔的高工作负载

转载 作者:行者123 更新时间:2023-12-02 07:05:24 25 4
gpt4 key购买 nike

我正在运行一个 Windows Azure Web 角色,在大多数情况下,该角色接收的流量非常低,但有一些(可预见的)事件可能会导致必须完成大量后台工作。后台工作由许多数据库调用(Azure SQL)和对外部Web服务的HTTP调用组成,因此它并不是真正的CPU密集型,但它需要大量等待数据库或Web服务应答的线程。后台工作由对 Web 角色的正常 HTTP 请求触发。

我看到有两个选项可以安排此操作,但我不确定哪一个更好。

  • 选项 1,线程:当收到后台工作请求时,Web 角色会根据需要启动尽可能多的线程(或将各个工作项排队到线程池中)。在此选项中,我会在繁重的工作负载期间配置更大的实例,因为这些线程可能需要大量内存。
  • 选项 2,自调用:当后台工作的请求传入时,接收请求的 Web 角色会针对每项后台工作向自身生成一个 HTTP 请求。在此选项中,我可以配置多个 Web 角色实例,因为 Windows Azure 的负载平衡器会平衡实例之间的 HTTP 请求。

选项 1 稍微简单一些,但它的缺点是只有一个实例可以处理后台工作。如果我希望多个 Azure 实例参与后台工作,除了将 HTTP 请求从角色发送到自身之外,我看不到任何其他选项,以便负载均衡器可以将部分工作委托(delegate)给其他实例。

也许还有其他选择?

编辑:关于选项 2 的更多想法:当后台工作的请求传入时,接收它的实例会将要完成的工作保存在某种队列中(Windows Azure队列或某些充当任务队列的 SQL 表)。然后,它会向自身生成大量 HTTP 请求,以便负载均衡器“激活”所有角色实例。然后,每个实例从队列中出列一个任务并执行该任务,然后获取下一个任务等,直到所有任务完成。这就像偶尔将网络角色用作辅助角色

我知道这种方法有臭味(滥用 Web 角色作为辅助角色,向同一 Web 角色发出 HTTP 请求),但我没有看到真正的缺点。

编辑 2:我发现我应该详细说明应用程序的具体情况:

应用程序需要一直执行一些小任务。这些任务通常不会超过 1-10 秒,并且不需要大量 CPU 工作。正常情况下,我们只有 50-100 项任务需要完成,但在“特殊日子”(新年就是其中之一),他们可能会处理 10,000 项任务,这些任务必须在 1-2 天内完成。小时窗口。这些任务是在网络角色中完成的,我们有一个Cron Job,它每分钟启动任务。因此,Web 角色每分钟都会收到处理新任务的请求,因此它会检查必须处理哪些任务,将它们添加到某种队列中(当前它是一个带有插入了 OUTPUT 的 UPDATE 的 SQL 表,但我们打算切换为有时会发送到 Azure 队列)。目前,同一实例在将任务排队后立即处理,但这无法扩展,因为串行处理多个 10'000 个任务需要很长时间。这就是为什么我们正在寻找一种机制来将“任务可用”事件从初始实例广播到其他实例。

最佳答案

您是否考虑过使用队列来分配工作?您可以将需要处理的“任务”放入队列中,然后将工作分配给许多工作进程。

我在方法 1 中看到的问题是,我将其视为“向上扩展”模式,而不是“向外扩展”模式。恕我直言,通过部署许多小型虚拟机实例而不是一个大型实例,将为您提供更高的可扩展性和可用性。此外,您提到您的工作不是 CPU 密集型的。如果您考虑 X-Small 实例,则对于 1 个小型实例(0.12 美元/小时)的成本,您可以部署 6 个 X-Small 实例(0.02 美元/小时),同样,对于 1 个大型实例(0.48 美元)的成本,您可以部署 24 个X-Small 实例。

此外,在“横向扩展”模式下,您只需添加或删除实例即可轻松扩展。如果由于您更改虚拟机大小而出现“向上扩展”(或“向下扩展”)模式,您最终将重新部署程序包。

抱歉,如果我有点离题了:)希望这会有所帮助。

关于multithreading - 编排 Windows Azure Web 角色以应对偶尔的高工作负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12891678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com