设计具有可伸缩性的体系结构的良好起点是什么?



我目前正准备开始设计一个新的应用程序。该应用程序将允许用户插入一些数据,并将提供数据分析(以及报告),我知道这没有帮助,但数据处理将在后处理中完成,因此这对前端来说并不是很有趣。

当需要扩展以处理更多用户时,我想从正确的路径开始帮助自己。

我正在考虑PostgreSQL来存储数据,因为我已经使用过它,我喜欢它(如果NoSQL是一个好选择的话-因为不是所有的数据都需要有关系-我喜欢Postgres的支持和社区,知道有一个大社区可以帮助我,我感觉更好),MySQL(innodb)也是一个好的选择,tbh我没有真正的理由选择它而不是PostgreSQL,反之亦然(也许MySQL更容易创建碎片吗?)。

我知道几种编程语言,但我的强项是Python、C/C++和Javascript。

我不确定我应该为这项任务选择同步还是异步方法(我可以通过在负载均衡器后面运行更多的同步应用程序来扩展)。

我已经开发了另一个大型项目,它教会了我很多关于并发的东西,但在那里,每一个选择都受到(整个团队的其他成员,但主要受)sysadmin技能的影响,所以我们使用了python(django)+uwsgi+nginx。

对于这个项目(因为它与其他项目完全不同——那是一个电子商务,这是一个SaaS),我也在考虑使用node.js,这将是一个在严肃项目中尝试的好机会。最繁重的数据处理将由后期处理完成,因此所有前端(用户网站)将主要是I/O(+1使用异步环境)。

你有什么建议?

ps。我还必须记住,首先项目必须开始,所以我不能只考虑每个可能的设计,但我应该尽快开始编写代码:-)

我目前的想法是:-从你知道的事情开始-尽量简单-跟踪一切以查找瓶颈-按比例缩小

因此,我部署sync还是async其实并不重要,但我知道async有更好的性能,而且每一件可以帮助我获得更好结果(从而降低成本)的事情都是可以评估的。

我很想知道你的经历(还有其他技术)。。。我对这种可扩展性越来越偏执,我担心它可能会导致错误的设计(这也是我第一次单独为商业目的进行设计=FUD)

如果你需要更多信息,请告诉我,我会尽力给你答案。谢谢

这一切的一个好资源是http://highscalability.com/.关于处理大的web负载,有很多有趣的案例研究。

你没有提到它,但你可能想考虑在云中托管它(Azure、亚马逊等)。使硬件的扩展变得更容易,如果您的需求波动,这尤其好。

以下是一些基本指南:

  1. 使用尽可能多的异步进程。或者至少以一种可以转换为异步的方式来设计它
  2. 设计流程,使它们可以在不同的服务器上隔离。这也适用于上文。假设你有一个网络应用程序,它有一些密集的流程。如果这个过程是异步的;那么主web服务器就可以对作业进行排队处理。然后一个单独的服务器可以选择并处理它。这样你的主要网络服务器就不会受到影响。但若资源受限,您仍然可以在同一台服务器上运行后台进程(直到您有足够的客户端,然后您可以将其派生到不同的服务器)
  3. 负载平衡设计。因此,如果你的应用程序使用会话,那么你应该考虑到你将如何复制会话。你不必-你可以将用户发送到不同的服务器,然后将所有后续请求转发到该服务器。但你仍然需要为它设计
  4. 能够根据一些预定义的标准将负载路由到不同的服务器。例如:由于您的应用程序是SAAS应用程序,您可以决定某些客户端将转到Environment1,而某些其他客户端将转到Environment 2。很多SAAS玩家都这样做。例如Salesforce。你不一定必须从一开始就这样做,但拥有这种能力将大大有助于在时机成熟时扩展你的应用程序

此外,请记住,这些方法并非排他性的。你应该为所有这些方法设计你的应用程序;但仅在需要时实施。

看看《可伸缩性的艺术》一书这本书是由那些与易趣合作的人写的;贝宝。

让我们来看看这个关于可伸缩性模式和方法的出色演示。

最新更新