实施 dotnet 核心 web api 的最佳实践,可选择在云中使用水平扩展

Best practices to implement dotnet core web api with the option to use horizontal scaling in cloud

我们创建了一个使用 SQL 服务器数据库的 dotnet 核心 web api 项目。现在,我们正计划将这个项目部署到Microsoft Azure。

在部署这个应用的同时,我们也在考虑启用自动缩放选项(水平缩放)。

以前,我们是这样做的。我们有一些问题想澄清一下。

我们是否需要在我们的应用程序中添加一些额外的代码以允许自动缩放正常工作?

在某种意义上是正确的,因为可以有多个应用程序实例 运行 因为水平缩放。我们正在使用数据库,并且有多个实例 运行 是否会出现竞争条件(即,两个资源一次访问相同的数据)。我的意思是我们可以在我们的代码中添加一个事务(或使用锁定)来避免这些情况?

我想知道在实施此类应用程序时是否有可遵循的最佳实践?

谢谢您,期待您的解答!

设计自动缩放策略时请考虑以下几点:

  • 系统必须设计为可水平扩展。避免制作 关于实例亲和性的假设;不要设计解决方案 要求代码在特定的实例中始终为 运行 过程。水平扩展云服务或网站时,做 不要假设来自同一来源的一系列请求总是 被路由到同一个实例。出于同样的原因,设计服务 是无状态的,以避免需要来自 始终将应用程序路由到服务的同一实例。 在设计从队列中读取消息的服务时, 处理它们,不要对哪个实例做任何假设 该服务处理特定消息,因为自动缩放可以 随着队列长度的增长,启动额外的服务实例。 Competing Consumers pattern 描述了如何处理这个 情景.

  • 如果解决方案实现了一个长 运行 任务,将此任务设计为 支持向外扩展和向内扩展。如果不小心,这样的 任务可以防止进程实例被关闭 当系统扩展时干净,否则它可能会丢失数据 进程被强制终止。理想情况下,重构一个 long-运行 任务 并将它执行的处理分解成更小的、离散的 块。 Pipes and Filters pattern 提供了一个示例,说明您如何 可以做到这一点。或者,您可以实施检查点 定期记录任务状态信息的机制 间隔,并将此状态保存在持久存储中 由进程的任何实例访问 运行 任务。在这个 方式,如果进程被关闭,它正在执行的工作可以 使用另一个实例从上一个检查点恢复。

有关更多信息,请参阅文档:https://github.com/Huachao/azure-content/blob/master/articles/best-practices-auto-scaling.md

对此:

Properly in a sense, as there can be more than one instance of the application running because of horizontal scaling. We are using database and more than one instance is running will it case race condition (i.e., two resources accessing the same data at a time). I mean we can add a transaction (or use locking) in our code to avoid these kinds of scenarios?

请记住,即使应用 运行 在一台机器上运行,请求仍然会被并发处理。这意味着即使在一台机器上,2 个请求也可能导致数据库中的相同条目被更新。因此,上述关于竞争条件的问题也适用于单实例 Web 应用程序。

尽量避免锁定:(水平)缩放的全部意义在于获得性能优势。通过使用锁,您可以有效地消除这一优势,因为一次只有一个进程可以使用锁定的资源。

其他注意事项有: