项目开发 - 如何优化项目

来自程序员鱼皮的优化项目经验分享。

如何优化项目

最简单的优化项目方式就是新增功能,但是不能乱加,盲目堆砌新功能,可以问自己几个问题

  1. 这个功能是否符合自己项目的定位?
  2. 用户是否真的需要?
  3. 功能的实现能否给项目增加亮点?

个人的建议是完善现有的功能,把功能做到更好。

举个例子: 是否可以提高帖子搜索功能的灵活性、列举热搜、给出搜索建议等,这可能就会激励你去学习 Elasticsearch等技术。

一段有亮点的项目经历绝对不能只写“用 xx 技术完成了 xx 功能”,而是要有起伏和递进,在完成某功能的基础上进一步优化。

应该优化什么呢?

可以从以下角度出发:

  1. 性能:页面加载速度、接口并发量(gps/tps)、接口响应时长等

    • 方法:缓存、并发编程、池化、异步、限流降级熔断、有损服务、CDN、数据压缩等
  2. 成本:节约系统资源,降低CPU/内存/磁盘空间/带宽占用、节省机器数等

    • 方法:人工分析删除、定期删除、低频存储、淘汰策略、数据压缩等
  3. 可用性:尽可能地提高系统对外提供服务的时长,即提高 SLA(3~5个9的高可用,服务等级协议,全称:service level agreement)

    • 方法:集群、主备、自动故障恢复、监控告警、容灾
  4. 可靠性:尽可能地让系统提供可靠的服务,不要出现崩溃中断

    • 方法:集群、主备、异常处理、降级、容灾

关于可靠性和可用性的区别:https://bloq.csdn.net/HermitSun/article/details/92164226

可用性被定义为系统的一个属性,它说明系统已准备好,马上就可以使用。换句话说,高度可用的系统在任何给定的时刻都能及时地工作。 可靠性是指系统可以无故障地持续运行,是一个持续的状态。与可用性相反,可靠性是根据时间段而不是任何时刻来进行定义的。 如果系统在每小时崩溃1ms,那么它的可用性就超过99.9999%,但是它还是高度不可靠。与之类似,如果一个系统从来不崩溃,但是每年要停机两星期,那么它是高度可靠的,但是可用性只有96%。

  1. 稳定性:接口响应/操作处理时长相对固定,成功率高,响应结果保持正常

    • 方法:保证每个服务节点状态正常、性能相当(不要有的机器好有的机器垃圾导致接口时快时慢);合理规划服务调用链路,不能过长;做好技术选型,避免使用不稳定的第三方依赖
  2. 容错性:部分节点(服务)出问题时,系统整体依然能够正常提供服务

    • 方法:集群、反向代理、故障转移
  3. 健壮性:系统不会因为部分异常而整体崩溃

    • 方法:异常处理、进程监控(如 supervisor)
  4. 系统复杂度:整个系统易于理解,而不是说前人离职、后人无法接手

    • 方法:软件开发原则、设计模式、系统架构设计(如微服务)、开发规范、工作流
  5. 可维护性:使整个系统结构清晰、利于维护,出了问题也能够快速排查

    • 方法:软件开发原则、设计模式、系统架构设计(如微服务)、开发规范、工作流、抽象复用(组件化模块化)
  6. 可扩展性:使整个系统能够轻松应对未来新增的重求及务增长,不会差一发而动全身

    • 方法:设计模式、架构设计、集群、分库分表、技术选型
  7. 可观测性:能够随时观察了解系统/服务的运行状态、并能快速发现故障和定位异常

    • 方法:系统埋点上报、监控告警(prometheus)、ELK日志收集、可视化分析(Grafana)
  8. 可伸缩性:系统根据负载情况动态增加或减少节点,从而能够应对流量高峰、并在空闲时节约成本

    • 方法:K8S+Docker 容器、云原生
  9. 用户体验:符合用户的使用习惯、提升用户对网站的满意度

    • 方法:网页性能优化、接口性能优化、懒加载、占位符、骨架屏、设备适配、浏览器兼容性、满意度调研(如NPS)
  10. 安全性:保证机器、服务、数据库、网络等不被恶意侵入和污染,保证数据和用户隐私的安全

    • 方法:参数校验、常用安全措施(防 XSS、CSRF、SQL注入等)、网络防护(反 DDOS)、反爬虫、限流、黑白名单、防火墙等