qidao123.com技术社区-IT企服评测·应用市场

标题: 【项目场景】请求数据时测试环境比生产环境多花了1秒是怎么回事? [打印本页]

作者: 王海鱼    时间: 2024-11-11 16:34
标题: 【项目场景】请求数据时测试环境比生产环境多花了1秒是怎么回事?
威哥,第一次给你发消息就是求教一个问题呢,近期我在优化体系查询的时候,在测试环境优化达标,但是发布到生产后,发现从客户端发起请求到接收相应,多花了1秒(测试环境的库数据量和生产一致)。测试环境的库在内网,服务器的库是阿里云的RDS杭州节点。我们的服务器机房在成都,利用体系群体也绝大部分在成都区域。 经过在服务器上的抓包,一个mysql的request和response,相差了500毫秒,一个列表查询来回就是1秒左右。 脚本在RDS上运行也只是需要100ms以下。故怀疑这中间的几百毫秒都浪费在了网络传输的开销上,我通过普罗米修斯看到,我们机房的带宽也并没有拉大。  我的建议是把数据库迁移到内网来或者成都区域的RDS上。
请教威哥,还有更好的办法吗?在不迁移数据库的情况下(数据库较大)。
感谢威哥花宝贵的时间查看这条消息,威哥空了帮助看看呢。
这是一位粉丝(谢同砚)给V哥的留言,感谢长时间对 V 哥的关注,给你几点优化建议去试试,看能否解决:
在不迁移数据库的情况下,你可以考虑以下几种优化战略:
1. 数据库连接优化

数据库连接优化对于提高体系的性能和减少延迟至关重要。针对所提到的场景(测试和生产环境的延迟差异,数据库在阿里云RDS杭州节点,服务器在成都),V 哥想从几个方面给出具体的优化战略和具体操作步骤,在不迁移数据库的情况下实现更好的连接优化。
1. 数据库连接池优化

利用数据库连接池可以有用减少连接的创建和烧毁开销,特别是在高并发的情况下,数据库连接池能够复用连接,减少每次请求时的连接创建时间。常用的数据库连接池有 HikariCPDBCPC3P0,其中 HikariCP 是性能最优的连接池之一。
步骤:

  1.    # 数据源配置
  2.    spring.datasource.url=jdbc:mysql://your-database-url:3306/weige_db?useUnicode=true&characterEncoding=utf-8&useSSL=false
  3.    spring.datasource.username=weige
  4.    spring.datasource.password=wg123123
  5.    # HikariCP 配置
  6.    spring.datasource.hikari.maximum-pool-size=20  # 设置连接池最大连接数
  7.    spring.datasource.hikari.minimum-idle=5        # 设置连接池最小空闲连接数
  8.    spring.datasource.hikari.idle-timeout=30000   # 设置连接最大空闲时间(单位:毫秒)
  9.    spring.datasource.hikari.max-lifetime=60000   # 设置连接最大生命周期(单位:毫秒)
  10.    spring.datasource.hikari.connection-timeout=30000  # 设置连接超时时间(单位:毫秒)
  11.    spring.datasource.hikari.validation-timeout=3000  # 设置连接验证超时时间(单位:毫秒)
  12.    spring.datasource.hikari.leak-detection-threshold=15000  # 设置泄漏检测时间(单位:毫秒)
复制代码
2. 数据库连接设置优化

确保数据库连接的设置是最佳的,以减少连接时的延迟和错误。
步骤:

  1.      spring.datasource.url=jdbc:mysql://<internal-ip>:3306/weige_db?useUnicode=true&characterEncoding=utf-8&useSSL=false
复制代码
  1.      spring.datasource.hikari.connection-test-query=SELECT 1
复制代码
3. 数据库查询优化

虽然你提到测试环境和生产环境的数据量一致,但仍然需要确保数据库查询本身的效率。优化数据库查询可以减少数据库访问时间,从而缩短整体相应时间。
步骤:

  1.    EXPLAIN SELECT * FROM mytable WHERE my_column = 'value';
复制代码
  1.    // 示例:使用 Redis 缓存查询结果
  2.    String cacheKey = "user:" + userId;
  3.    User user = redisTemplate.opsForValue().get(cacheKey);
  4.    if (user == null) {
  5.        user = userService.getUserById(userId);
  6.        redisTemplate.opsForValue().set(cacheKey, user);
  7.    }
  8.    return user;
复制代码
4. 数据库连接池与查询优化结合

以上小结一下

通过这些优化战略,你能够显著减少请求和相应之间的延迟,提高体系的相应速度和稳定性。
2. 网络优化

网络优化战略的具体实现操作步骤

网络优化是提拔应用性能、降低延迟的重要手段。针对你提到的跨地域访问延迟问题(测试环境和生产环境的数据库在不同的区域),网络优化战略可以帮助减少网络传输的瓶颈和延迟。
1. 优化网络架构和通信路径

跨地域访问时,网络架构和通信路径会影响延迟,因此需要确保通信路径尽可能简洁和快速。
步骤:

  1.    # 示例:使用内网 IP 地址连接数据库
  2.    spring.datasource.url=jdbc:mysql://<我的IP>:3306/weige_db?useUnicode=true&characterEncoding=utf-8&useSSL=false
复制代码
2. 调整网络协议和TCP参数

网络传输性能不仅取决于物理连接,还取决于传输协议的效率。特别是利用 TCP/IP 协议时,适当的参数调优可以显著提拔网络性能。
步骤:


  1. net.core.rmem_max = 16777216      # 设置接收缓冲区的最大值
  2. net.core.wmem_max = 16777216      # 设置发送缓冲区的最大值
  3. net.ipv4.tcp_rmem = 4096 87380 16777216  # 设置TCP接收缓冲区的最小、默认和最大值
  4. net.ipv4.tcp_wmem = 4096 16384 16777216  # 设置TCP发送缓冲区的最小、默认和最大值
复制代码
  1.      echo 3 > /proc/sys/net/ipv4/tcp_fastopen
复制代码
  1.      spring.datasource.hikari.connection-test-query=SELECT 1
  2.      spring.datasource.hikari.connection-timeout=30000
  3.      spring.datasource.hikari.keepalive-time=300000  # 设置连接空闲保持时间
复制代码
3. 利用内容分发网络 (CDN) 优化

只管 CDN 重要用于加快静态资源的加载,但一些高级 CDN 服务还可以对网络请求举行优化,特别是跨地域访问时。
步骤:

4. 增加带宽和网络监控

带宽不足会成为网络延迟的瓶颈,因此监控带宽利用情况并合理增加带宽,能够有用提拔网络性能。
步骤:

以上小结一下

通过优化网络架构、调整网络协议、利用 CDN 加快以及增加带宽,可以有用地减少网络延迟,提拔体系相应速度:
3. 数据库查询优化

4. 异步化处理

5. 数据库内网通信

5. 数据库内网通信战略的具体实现操作步骤

在云环境中,尤其是利用阿里云 RDS 等云数据库服务时,尽量包管应用服务器与数据库之间利用内网通信,而非公网通信,可以显著减少网络延迟并提高通信效率。以下是关于如何设置和优化数据库内网通信的具体操作步骤。
1. 确保应用服务器和数据库在同一内网

首先要确保你的应用服务器和数据库都摆设在同一个阿里云 VPC(假造私有云)内,这样才能确保内网通信而不是公网通信。
步骤:

2. 利用 VPC 内网 IP 所在连接数据库

一旦确保应用服务器和数据库都在同一 VPC 内,可以利用内网 IP 所在来连接数据库,从而减少公网通信带来的延迟和带宽开销。
步骤:

  1.      spring.datasource.url=jdbc:mysql://<RDS内网IP>:3306/your_database_name
  2.      spring.datasource.username=your_db_username
  3.      spring.datasource.password=your_db_password
复制代码
3. 利用专有网络(VPC)中的私有链接

为了增强安全性和减少跨区域访问的延迟,阿里云支持通过 专有网络(VPC)私有链接 将 RDS 实例暴露给同一个 VPC 中的其他服务,确保数据通信在专有网络内完成。
步骤:

4. 设置安全组和网络 ACL

确保内网通信不受安全组或网络 ACL(访问控制列表)等网络安全设置的阻止。安全组设置允许控制内网通信的流量。
步骤:

5. 确保数据库和应用的带宽和延迟优化

虽然数据库和应用在同一内网中,确保它们之间的带宽和延迟仍然至关重要。对带宽和网络延迟举行优化可以进一步提拔数据库通信性能。
步骤:

6. 避免利用公网访问数据库

假如数据库和应用服务器之间的通信通过公网举行,可能会带来额外的延迟和带宽消耗。为了最大化内网通信的性能,确保所有的数据库连接都通过内网举行。
步骤:

以上小结一下

通过确保应用服务器和数据库实例都摆设在同一阿里云 VPC 内,并通过内网 IP 举行通信,可以显著减少网络延迟和带宽开销,提高跨地域访问的性能。具体操作步骤包括:
通过这些战略的实行,可以有用降低网络延迟,提拔数据库查询性能,并减少因跨地域网络通信带来的性能瓶颈。
6. 高并发读写分离

高并发读写分离战略可以显著提高数据库的性能和可扩展性,特别是在高并发场景下。以下是实现该战略的关键步骤:
7. 监控与调优

总结

在多方位诊断优化后不知道能否解决谢同砚的问题,小伙伴们,你们觉得还有更好的解决方案吗,可以说说你的见解,让谢同砚试试,关注威哥爱编程,一起解决 BUG。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4