当前位置:首页 > 资讯 > > 正文

大型应用程序中的AWSSQS

来源:软件科技与技术狠活    时间:2023-03-11 10:48:51

关注留言点赞,带你了解最流行的软件开发知识与最新科技行业趋势。

什么是以及如何使用 AWS SQS 来扩展您的应用程序。本文向读者展示了如何设计您的内部基础架构以解耦系统组件。


(资料图)

在今天的文章中,我将向您展示我们如何在 Laravel 应用程序中使用 AWS SQS,以及它如何帮助我们管理每月16亿次操作。

在下图中,您可以看到我们使用 AWS SQS 一个月的典型账单:

在进入我们系统设计的细节之前,我将介绍 SQS 技术,为什么您应该考虑消息系统,以及如何将其与类似服务进行比较。

什么是 AWS SQS?

Amazon Simple Queue Service 是一个完全托管的消息队列系统,可实现分布式软件组件或微服务之间的通信。

解耦系统的某些部分允许您独立运行和失败您的软件组件。它还允许您构建易于扩展的应用程序。

消息队列充当中介:

什么是消息?

这是我想回答的一个重要问题,以帮助第一次接触这项技术的开发人员。

每个消息队列系统都接受文本作为消息的内容。使不同系统交换结构化数据的最常见方法是使用 JSON 对象。

将新消息推送到队列时,JSON 可以很容易地序列化为文本,并在系统的另一端使用时反序列化。

Laravel 之道

Laravel 在与队列系统交换消息时实现了自己的格式。这是一个例子:

当您调度作业时,JSON 由框架的内部队列系统自动创建。它在开发人员的眼中有些隐藏。

JSON 消息包含 Laravel 了解应该执行哪个作业类以及在什么条件下(尝试次数、maxTries 等)所需的所有数据。

如果您的应用程序没有像 Laravel 提供的预打包解决方案,您可以定义自己的格式。目标是为队列的消费者提供所有信息以处理所需的任务。

如何消费队列中的消息

您必须实现一个持续轮询等待消息到达的队列的系统。

Laravel 提供了一个内置的“worker”,你可以使用一个简单的命令来运行它:

php artisan queue:work

此命令运行一个请求新消息的后台进程。检索到消息时,工作人员可以运行消息中包含的作业类。

你可以在类中看到这个过程\Illuminate\Queue\Worker.php:

while (true){// Before reserving any jobs, we will make sure this queue is not paused and// if it is we will just pause this worker for a given amount of time and// make sure we do not need to kill this worker process off completely.if (!$this->daemonShouldRun($options,$connectionName,$queue)){$status =$this->pauseWorker($options,$lastRestart);if (! isnull($status)){return $this->stop($status,$options);}continue;}...// If the daemon should run (not in maintenance mode, etc.), then we can run// fire off this job for processing. Otherwise, we will need to sleep the// worker so no more jobs are processed until they should be processed.if ($job){$jobsProcessed++;$this->runJob($job,$connectionName,$options);if ($options->rest >0){$this->sleep($options->rest);}} else {$this->sleep($options->sleep);}...

为什么要使用 AWS SQS?

由于我的产品是开发人员工具,我几乎每周都会与其他开发人员讨论他们软件的内部设计。

在我有机会分析的大多数应用程序中,都引入了消息传递系统来启用异步任务执行。

Inspector也是如此。

我认为这是当今消息系统最常见的用例。一般来说,微服务或大型分布式软件是非常小众的用例。可能更属于企业环境。

什么是异步任务?

想象一下,您的产品能够通过上传大文件来导入帐户信息。用户从本地 PC 中选择文件并单击“导入”。

此操作可能需要一段时间才能完成。您必须打开文件,读取每一行,将其转换为适当的格式,并将此信息存储在您的系统中。

在 HTTP 请求时可能无法处理此过程。

多亏了消息队列系统,我们可以将文件存储在我们的服务器上,并使用文件所在的路径将消息推送到“导入”队列。

下一步是制作一个等待这些消息来处理导入过程的后台系统。用户无需等到导入完成。在此期间,他们可以继续使用该产品,也可以等待导入完成时收到通知:

Inspector 如何使用 AWS SQS

Inspector 最重要的挑战是能够处理大量的流量,同时保证良好的性能。

Inspector 从受监控应用程序接收数据的端点每天处理大约1000万个 HTTP 请求。对于这个容量,问题是这些数据包无法即时处理。

在开始我们的冒险之旅时,我们使用了一个自我管理的 Redis 作为消息队列系统。但是,随着数量的增加,我们更愿意依赖托管服务。

该策略是使用 AWS SQS 将这些任务推送到队列中,该队列将由后台的另一个独立系统(处理管道)使用:

摄取节点在 Node.js 中实现。它们被构建为一个非常简单且可扩展性极强的脚本。相反,使用队列的工作服务器是构建在 Laravel 框架之上的系统组件。

我们可以选择任何其他技术来管理消息队列。在公司的这个阶段,SQS 保证了可扩展性,对我们来说没有任何复杂性,因为它是一项完全托管的服务。

其他解决方案也可以为我们节省成本。我们更愿意向我们的客户保证该平台完美运行,并避免引入可能导致意外停机的弱点的风险。

结论

此时,您应该对什么是 AWS SQS、如何使用 AWS SQS 扩展您的应用程序、为什么应该使用 AWS SQS 等有了更好的了解。我希望您从本文中获得了一些有价值的信息。如果是这样,请随时喜欢和分享。

关键词:

上一篇:

下一篇:

精心推荐

X 关闭

X 关闭