防止并行执行缩放后的ASP.. NET Core托管服务



我在AWS (AWS fargate)上托管了web api。我想发送一些电子邮件和其他东西作为后台服务。问题是,如果我决定我的web api扩展,该托管服务的多个实例将被执行。

我有sql数据库和一些表,其中"IsEmailSent"one_answers";IsReportSent"标志存在。

后台托管服务只循环遍历字段为false的所有行,因此该服务的实现相对容易。

然而,当涉及到"预防"时,多个实例运行托管服务有两个选项。在这种情况下,最简单的方法是什么?这是我首先想到的:

引入某种数据库锁定,这可能是危险的,而且性能不高。

在后台服务中使用AWS SQS和去排队是一个选项,但如果不需要的话,我希望避免它,因为我目前没有在应用程序的任何地方使用SQS。

要管理多个实例以不获取同一项,您需要使用"push"系统。实现它的最佳方法是通过queue.

如果你不想使用队列,另一种方法是控制实例,然后"start"工人只在一个实例中。您可以使用一个简单的数据库来选择哪个实例可用于处理项。

我再说一遍,最好的方法是通过Queue或者Hooks

我有几个办法可以解决这个问题。

第一个,尝试使主服务成为您的多规模服务之一。它是唯一一个可以处理命令的服务,您可以在其中启动用于发送电子邮件的后台服务。其他服务将只处理查询(GET方法)。要实现这一点,您可以使用配置文件。并以不同的配置运行主从机。你可以找到另一种更适合你的基础设施的方式。目标是只运行一个后台服务。我不喜欢这样。

第二个需要引入额外的服务。它也可以是运行后台服务的。net应用程序,但它必须不做任何其他事情,从读取数据库和发送电子邮件。将此应用程序作为一个实例运行。它不需要缩放。你也可以使用WebHook将这个服务与数据库解耦。它允许您订阅某些事件和发送电子邮件,而无需访问其他服务的DB。如果你想扩展电子邮件发送服务,可以通过负载平衡器来解决它,或者你应该看看事件总线(如果你已经在你的堆栈中使用它,这是一个不错的选择)。

我更喜欢这个。

最新更新