坚持理解如何构建可扩展的系统

Stuck with understanding how to build a scalable system

我需要一些关于如何正确构建可扩展系统的指导。我会给你一些关于我想做什么的信息,然后问我的具体问题。

我有一个网站,我希望访问者发送一些数据进行处理。他们将数据输入文本区域或将其上传到文件中。简单的。在向 REST 端点发出 POST 请求之前,数据会在客户端进行一些预处理。

我坚持的是什么是将发布的数据存储起来然后将引用用户的 id 与其相关联的好方法,因为我无法足够快地处理数据以将其返回给用户在合理的时间内?

这个问题有点笼统,见仁见智,我承认。我只需要朝着正确的方向推动才能继续前进。我一直在考虑的是将数据放入消息队列,然后让一些工作人员在其他地方处理数据,当处理数据时,通过某种 link 到 S3 存储桶提醒用户在哪里可以找到它或者只是一个 URL 到一个文件。另一个想法是 运行 针对另一个端点处理每个项目的请求,该端点已经在某种循环客户端中处理了单个记录。问题如下:

处理数据可能需要 30 分钟到 2 小时不等,具体取决于他们想要处理的数据量。根据他们需要处理的记录数量,他们坐在那里等待完成并不理想,所以我已经排除了这种情况。

任何指导将不胜感激,因为我没有任何同事可以反驳,我也不认识很多拥有我可以自由询问的领域知识的人。如果这不是问这个问题的正确地点,你能给我指出应该在哪里问的正确方向吗?

克里斯

如果我没猜错,你的管道是:

  1. 接受用户的项目

  2. 可能preprocess/validate吧(?)

  3. 放入某个队列

  4. 处理数据

  5. Return 结果。

你在舞台 (3) 上使用一个或多个队列。来自用户的实体被添加到其中一个队列中。如果它足够大,它可以存储在 S3 或类似的存储中,并且只将关于它的信息放入队列:link、添加日期、用户 ID(或类似的电子邮件)。处理者可以从队列中提取项目并向用户提供反馈。

如果你对顺序没有严格的要求,事情就简单多了:你不需要在它们之间进行任何同步。将所有组件:上传接受器、队列、存储和处理器视为独立的进程池。分别监控每个池。如果存在一些瓶颈 - 将机器添加到该池中。