互联网架构下的核心技术
高可用设计
架构可用性
单点故障
集群(负载均衡技术)
- 硬件负载:F5、Netscalar
- 软件负载:apache、nginx、lvs、Haproxy
F5的高可用通过standBy建立心跳线,如果主服务挂掉,通过心跳线启用备用的服务。
Nginx通过lvs+keepalived 实现一主多从的机构来保证高可用。
热备
同时启动多台相同服务,提供服务的只用一台。
zookeeper / redis-sentiel / etcd
Zab(Paxos)Raft(etcd/nacos/redis-sentinel)/ Raft / gossip 提供数据一致性算法,保证高可用
多机房部署
应用的可用性
微服务的集群部署,不仅提高可用性还会提升性能
容错性
- fall fast
- 服务隔离
- 代码容错处理
- 数据的严谨性、数据的校验
- 幂等行,事务处理(数据)
自我保护能力
- 熔断(降级)
- 限流(降级)
- 缓存(主动降级)
监控
- 系统资源(CPU、内存、磁盘)
- 应用层面分析:log4j(系统执行情况):ELK (日志收集分析)->错误码设计。
- 告警:设置告警规则,Alertmanager
- 应用监控:应用吞吐量、访问量,cat、链路监控
- 系统资源:
高并发
架构层面
- 微服务:将服务进行拆分,针对性能瓶颈计算资源。针对核心服务提供更大规模的集群。
- 数据库分片(分库分表)、读写分离
- 使用非结构化存储
- 服务的无状态化设计(堆机器提升性能)
- 分布式缓存(热点数据做缓存)
- 容量规划
异步化架构
异步队列
实时性要求不是很高的场景
代码层面
- 不要在for循环中调用rpc
- hashmap初始化
- 数据的预热
- 数据库层面、查询语句的优化
- 异步化(线程池的使用)
- 内存的使用
服务的无状态化
- session会话 ->> redis
- 数据的存储 -> A节点上存储 -->第三方节点
- 对象存储->A节点上存储 -->第三方节点
- 缓存A节点上的存储
服务负载均衡
集群的好处:
1. 流量分发
2. 扩容与缩容
负载均衡
- DNS轮询
- 二层负载(MAC)
- 三层负载(IP)
- 四层负载(IP+prot)-> nginx
F5/LVS/Nginx/HAProxy - 七层负载:应用层负载。HTTP协议中的东西,URI
Nginx/apache - Gateway
应用层负载
实现负载均衡的组件Ribbon、Dubbo、SpringCloud LoadBalancer
服务的幂等性
多次请求对于数据的变化和一次请求带来的数据变化保持一致
get操作天然幂等
- 状态机的幂等:一个数据在整个生命周期中所经历的状态
- 数据库的唯一约束
- token
reids实现幂等:setNx(key、value)
setNx():多个进程调用这个方法的时候,只会有一个进程返回1,其他的返回0;