互联网开发高可用高性能那点事
高可用、高性能是互联网应用与传统应用开发之间差异较大部分,要保证程序高可用、高性能
需要架构设计、实现、算法等每个点都是合理的简洁可靠的。因为一个点性能差、一个点不稳定会
导致整个系统性能不稳定。
高可用互联网程序高可用,即线上服务要保证99.9%以及99.99%可用率。要保证程序高可用需要
首先要保证服务存在,服务存在是前提,就需要服务是集群或者分布式的,通过数量备份来保证服务
高可用。
集群分布式两种事物本身不是一个概念,但很多人会搞混,集群:一般情况下是多个节点提供相同
服务,通过多个节点避免服务只有单个节点,单个节点不可用时线上服务不可用。web服务一般通过nginx
反向代理技术,将请求通过ip hash、url hash、随机、轮训、加权轮训等负载均衡算法转发给后端tomcat
实现高可用。
分布式系统:分布式是多个节点协调提供一次计算服务,比如ElasticSearch,用户发出一次请求,多个
节点分别进行查询,最终由主节点进行合并排序,排序后将打分结果按分高分低进行返回。
线上微服务高性能一是外部存储采用高性能存储,当前互联网公司一般采用redis进行数据存储,redis作为
分布式缓存,核心原理是采用hash或树形结构存储数据已达到存储高性能读取数据。
使用redis要注意,redis单个节点不稳定,原因有可能是网络,也有可能是有热点key导致,热点key一般
是应用程序对于通用数据未采用定时获取方式。redis单个节点会导致集群不稳定、集群不稳定会导致所有线
上依赖服务均不稳定。在谈电商双11大促活动备战,双11大促备战时曾遇到这两个问题。
线上服务要在合适场景使用合适数据结构,该使用HashSet时就不能使用ArrayList对于各种各样数据结构
操作时间复杂度要详细掌握。HashMap put、get操纵时间复杂度时O(n),当hash冲突解决采用链表解决的时候。
对于字符串匹配要采用KMP算法,对于搜索中字典统计要采用Trie树结构。
IO使用要合理,对于线上服务,不能任何调试信息都打印,线上服务日志一定是Error级别,需要打印时在
打印,因为日志过频打印一是淹没线上问题,再有就是会导致性能差,大日志写磁盘慢时一条会消耗10-20ms
时间。多个几条日志打印线上服务基本就慢的不行了。
已经采用了合理算法数据结构,合理逻辑情况下,提升性能就需要增加缓存合理使用缓存,比如搜索引擎
设计实现就是,当词搜索后进行缓存,下次在自己搜索或其他人搜索时候直接从缓存中取出缓存从而达到高性
能,并且还可以节省计算资源。
换存也做了就需要多线程、线程池对计算进行拆分,多线程在不够就需要分布式多个节点、多个线程去执
行计算,个性化推荐系统(八)— 机器学习深度学习召回集扩量这篇文章就介绍线上模型计算服务,提升性能
方式方法。
高可用、高性能需要每个点,存储、IO、数据结构、算法逻辑,一个点的问题,比如一个redis分片节点不
稳定,最终导致所有依赖这个节点所在集群的全部业务都不稳定。这就要求我们要不断学习,不断提升才能保
证线上服务高可用、高性能,就像软件工程一样没有银弹、没有万能药。