gpt4 book ai didi

mysql - 使用大量队列工作人员时如何避免大量连接?

转载 作者:行者123 更新时间:2023-12-03 06:42:13 26 4
gpt4 key购买 nike

可能我遗漏了一些明显的东西,但我遇到了架构问题。

我正在构建正常运行时间监控服务。

我有监视器表,每个监视器代表一个 URL。我的任务是将 http 请求发送到 url。我从多个服务器发送 http 请求。每个服务器每分钟将处理数千个网址。

因此,在每台服务器中,我都有 Supervisord,它会产生 50-100 个队列工作人员。每分钟一次,我将所有监视器推送到队列,然后队列工作人员将检查这些监视器。

但是,每个队列工作线程都会创建一个与 MySQL 的连接。我认为这是因为我将 Monitor 模型传递给队列 Job,而 Laravel 仅将 Monitor id 放入队列中。然后在处理作业时从数据库检索整个监视器模型。

或者可能我错了,原因只是因为 laravel 在运行任何类型的代码(包括排队的作业)时默认连接。

但是 10 台服务器 * 100 个工作人员 = 1000 个连接,这可能很糟糕(我不确定,但我认为它不可扩展)。

我的队列基于本地redis。

所以我认为将序列化的模型数据放在redis中是合理的。然后,我将http请求的结果放入redis中。然后将一堆结果一次性推送到 MySQL 中。

那么如何实现呢?

最佳答案

在分派(dispatch)作业之前,您将获取所有相关模型(以 block 的形式)并使用作业中所需的模型实例分派(dispatch)作业。因此,您在处理作业时无需再次从数据库中获取模型。

关键的事情之一是,如果要发送模型实例,则不应在作业类中使用 SerializesModels 特征。正如 documentation 中所述

If your queued job accepts an Eloquent model in its constructor, only the identifier for the model will be serialized onto the queue. When the job is actually handled, the queue system will automatically re-retrieve the full model instance and its loaded relationships from the database.

如果handle方法没有任何与数据库相关的依赖项,那么它不会打开与数据库的连接。如果您使用的是mysql,则可以尝试SHOW PROCESSLIST来检查它。我检查了我的本地(使用 sleep),它没有显示任何 mysql 进程。

关于mysql - 使用大量队列工作人员时如何避免大量连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63421370/

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