【问题标题】:Planning, Scaling and Optimizing Large Web Application规划、扩展和优化大型 Web 应用程序
【发布时间】:2013-01-24 18:20:12
【问题描述】:

我目前正在设计和开发一个网络应用程序,该应用程序具有快速增长的潜力。我将提供一些一般信息并继续我的问题。我会说我是一名中级网络程序员。

以下是一些规格: MySQL - 数据库后端 PHP - 用于前端/后端。也用于 SOAP 客户端 HTML、CSS、JS、jQuery - 前端小部件(highcharts、datatables、jquery-ui 等)

由于这是一个公司项目,我无法详细介绍太多细节,但主要目标是构建一个仪表板,让成千上万的用户可以从各种设备访问。

该项目的数据预计每年会增长 50,000 项(每周约 1000 项)。

1 项 = 数据库中的 1 行

项目还将记录从其插入之日开始的每日历史记录。

每个项目 1 天的历史记录 = 1 条记录

每台设备每 1 年 365 条记录

365 * 50,000 = ~18,500,000 [第一年]

之后每年将约 18,500,000 条记录乘以 x。

(我的论坛有点不对劲,因为那一年会定期添加项目)

通过连接到 API 服务的 SOAP 客户端访问所有项目和历史记录,然后将记录写入数据库。

大部分数据将被读取并保持静态(只读)。但某些项目数据可能会更新或更改。数据也会每天更新,需要再写入x量的历史记录。

问题:

1) MySQL 是处理这些数据需求的好解决方案吗?大约有 1 亿条记录。

2) 我仅限于与我的 PHP Soap 客户端进行同步调用(据我所知)。随着越来越多的项目被提取,这变得非常耗时。编写 SOAP 客户端是否有更好的选择,这样我就可以发送异步请求而无需等待响应?

3) 我还应该考虑其他要求吗?

【问题讨论】:

    标签: php mysql soap web


    【解决方案1】:

    扩展的难度几乎总是用户乘以数据的函数。如果你有很多用户,但数据不多,那么扩展并不难。一个典型的例子是一个流行的博客。同样,如果您有大量数据但用户数量不多,那么您也可以。这代表诸如会计系统或数据仓库情况。

    迈向任何解决方案的第一步是粗略设计一个架构并大规模地测试它。在您完成这些步骤之前,您将不知道您的应用程序将如何执行。没有两个应用程序会出现完全相同的问题。大多数情况下,您需要调整架构、对某些数据进行反规范化或更积极地缓存内容,但这些只是技术,没有标准的扩展指南。

    在您的具体情况下,如果INSERT 活动的速率较低并且您的索引不是太复杂,您将不会遇到很多问题。您最终可能会做的是将数亿行拆分为几个相同的表,每个表中的记录集要小得多。

    如果您在执行查询时遇到问题,请考虑标准方法:索引、优化、非规范化、然后缓存。

    在 PHP 无法解决的问题上,可以考虑使用 Python、Ruby、Java/Scala 甚至 NodeJS 等工具来帮助简化数据库调用。如果您正在编写一个 SOAP 接口,您有很多选择。

    【讨论】:

      【解决方案2】:

      1) MySQL 是处理这些数据需求的好解决方案吗?大约有 1 亿条记录。

      当然。确保您已正确索引所有内容,并且如果您达到了存储或每秒查询的限制,那么您有很多适用于大多数/所有 DBMS 的选项。您可以获得更强大的硬件、开始跨服务器分片数据、集群等。

      2) 我仅限于使用我的 PHP Soap 客户端进行同步调用(据我所知)。随着越来越多的项目被提取,这变得非常耗时。编写 SOAP 客户端是否有更好的选择,这样我就可以发送异步请求而无需等待响应?

      PHP 5+ 允许您使用 CURL 并行执行多个请求。参考 curl_muli* 函数,例如curl_multi_exec()。据我所知,这要求您处理与请求脱节的 SOAP/XML 处理。

      3) 我还应该考虑其他要求吗?

      大概吧。但是,如果您从一个正确索引、规范化的数据库开始,您通常会走在正确的轨道上,并且您至少大部分正确地考虑过您的对象。如果/当您发现非规范化解决了现有或明显近期效率问题的实例时,请开始非规范化。但是,如果土星的卫星对齐,则不要针对可能成为问题的事情进行优化。仅针对用户会经常注意到的问题进行优化。

      【讨论】:

      • svidgen,感谢您的反馈。在 SOAP 方面,我需要一种方法来发送多个请求并设置回调以将响应推送到 MySQL。使用 PHP,我发送一个请求并等到我得到响应。我希望一次发送 10-20 个请求,并相应地处理响应。肥皂客户端将是在 cron 中设置的脚本(除非有更好的方法;))
      • 谢谢,我找到了一个扩展soapclient并使用curl的类!
      • 我会推荐用于异步 SOAP 客户端的节点 js
      【解决方案3】:

      在谈论大型应用程序时,不应仅将所有努力和功劳都归功于数据库。然而,它是核心部分,因为我们的数据在任何 Web 应用程序中都是主要的,而在我这边,您的应用程序也依赖于代码优化,包括您的后端和前端脚本。图像,主要是服务器。天啊,影响应用的因素很多。

      【讨论】:

        猜你喜欢
        • 2011-03-16
        • 2010-10-26
        • 1970-01-01
        • 2016-11-01
        • 2021-01-29
        • 1970-01-01
        • 2017-12-09
        • 1970-01-01
        • 2023-02-03
        相关资源
        最近更新 更多