Skip to content

系统优化与分布式

DZ-SHOP的单机(4核8G)QPS(Queries Per Second,每秒查询率)在500-600之间,TPS(Transactions Per Second,每秒事务数)在300-400之间,如果超过该并发数量,则需要升级服务器或采用分布式部署方案。

说明

建议

我们建议直接采购云服务来部署而不是购买服务器后托管。

正常情况下,需要根据项目的具体情况来做分布式部署方案。由于分布式部署涉及的知识点太多,我们假设您已经有分布式搭建的经验,下面将根据不同的情况来简单说明。

请求并发

当请求量超过单机承载能力的时候,则需要采用分布式部署。

以阿里云为例,你需要采购以下产品来搭建一个简单的分布式:

  • 负载均衡(也可以使用ECS自己搭建)
  • 两台或以上的ECS
  • RDS、PolarDB、PolarDB-X或OceanBase(后两个为分布式数据库)
  • Redis(推荐使用Redis;如果偏向本地缓存,可以将整个runtime文件夹映射到NAS,用来保证缓存一致性)
  • OSS(如果偏向本地文件存储,可以将整个web/attachment文件夹映射到NAS,用来保证所有服务器均可访问)

建议

并发能力更多考验的是CPU负载能力,有能力的公司应尽量采用核心数更高的CPU,如8核16G,16核32G的服务器,并根据CPU核心数来调整nginx的负载能力。

带宽优化

一个Web应用,最耗费流量的是图片、音频、视频等内容。为了防止带宽问题导致的访问缓慢或者内容呈现缓慢,应尽量将图片、音频、视频采用云存储+CDN。比如阿里OSS、腾讯COS、七牛等等。

数据库

以阿里云为例,阿里云的RDS最大支持8核16G,10000写并发,这对于95%的企业来说都已经足够了。在实际测试中发现,数据库读写达到峰值读写并发未发现慢SQL。在超过10000秒级并发之后,根据具体业务,可以优先考虑主从架构,根据具体情况使用主从数据库。在主从架构都无法满足的业务情况下,应考虑使用分布式数据库。当然你可以使用像 MyCat 等产品自行搭建分布式数据库。

主从配置非常简单,且不用更改任何逻辑代码。你可以在config/common/main-local.php中配置db项设置主从数据库,例如:

php
return [
    'components' => [
        'db' => [
            // 主库的配置
            'class' => 'yii\db\Connection',
            'dsn' => 'dsn for slave master',
            'username' => 'master',
            'password' => '',
            // 从库的通用配置
            'slaveConfig' => [
                'username' => 'slave',
                'password' => '',
                'attributes' => [
                    // 使用一个更小的连接超时
                    PDO::ATTR_TIMEOUT => 10,
                ],
            ],
            // 从库的配置列表
            'slaves' => [
                ['dsn' => 'dsn for slave server 1'],
                ['dsn' => 'dsn for slave server 2'],
                ['dsn' => 'dsn for slave server 3'],
                ['dsn' => 'dsn for slave server 4'],
            ],
        ],
    ]
];

性能优化

DZ-SHOP已经在代码上做了大量优化。

如果需要二次开发,可以点击了解性能优化的参考方案

解耦

DZ-SHOP的定时任务、队列均属于解耦方案。一般来说,这些解耦方案已经足够。

当然,也可以使用微服务的方式进行逻辑分拆,比如使用腾讯的RPC框架Tars。但是由微服务框架的复杂性,非超大型应用不推荐使用。

限流削峰

为了应对突然的请求暴增导致服务器崩溃,限流削峰是必要的。

DZ-SHOP已经内置了限流削峰模型,了解用户访问限流全局访问限流

动态扩容

有些应用可能在一天的某几个时段请求会非常大,但是其它时段请求会很小的情况,比如做定时抢购等等。假如日常TPS并发在500左右,两台服务器就可以支撑,但是在每日的 18::00 TPS并发猛增到3000,这个时候需要10台服务器才能支撑,有没有一种根据并发量来动态扩容的方案呢?

可以了解弹性容器解决方案,经过大量的线上应用反馈,我们建议以CPU作为核心监控指标。

阿里云弹性伸缩

腾讯云弹性伸缩

华为云弹性伸缩

广州大舟信息科技 版权所有