我目前在前端使用 angular 作为显示队列工作者进度的仪表板。在后端,我使用 50 个 AWS EC2 实例,每个实例大约有 6 个工作者,这些工作者由 Supervisord 管理。这些工作者在 Aurora Mysql Serverless DB 中执行下一个可用的作业。这些工作者在数据库中写入大量数据,也从中读取大量数据,我注意到读取操作在前端变慢了。例如,在执行 axios get 请求以获取作业进度时,有时需要 50 秒才能收到信息,并且所有后续的 ajax 调用都会延迟。
我尝试将数据库扩展到更好的实例,但我觉得这不是正确的方法,因为仍然存在很大的滞后。我认为这可能是因为 mysql 不是适合这项工作的工具,而 redis 更适合?我还想到的一个解决方案是有一个只读副本,以便前端仪表板从中读取并在几毫秒内接收信息。这种方法的缺点是我在后端使用了一个 api,所以我必须在另一个实例上复制该 api,并且会有两个类似的 api,其中一个是只读的。
你们认为最好的方法是什么?
答案1
您是否检查过哪些查询实际上对数据库造成了最大的压力?它们是检查作业进度的查询吗?如果是这种情况,您可能希望每隔几秒运行一次这些查询,然后缓存结果在redis或者内存缓存(例如亚马逊AWS官方博客)。仪表板进度更新通常不需要100%准确和100%即时。
Aurora 还支持只读节点- 也许您可以从这些 R/O 节点读取更新,而不会用只读内容使主 R/W 节点过载。
还要确保你已经获得了正确的索引在数据库表上。您可以使用EXPLAIN SELECT ...
确保它们不会扫描表。索引可以巨大的不同之处!
正如 Tim 所说,管理作业队列最好使用AWS SQS- 工作人员逐一从队列中挑选作业,而不必扫描数据库来查找下一个作业。
希望有帮助:)