高并发架构设计( 二 )


2、硬件负载均衡,通过布置F5,A10等专门的负载均衡设备到机房做负载均衡,性能高,但是价格昂贵 。
3、软件负载均衡,利用软件实现四层负载均衡(LVS)和七层负载均衡(Nginx) 。
05池化技术5.1 内存池内存池创建的方法:
1、对于用户申请的大块内存使用内存映射
2、对于小块内存从内存池合适的链表中取出
注:Linux本身有内存管理方式,但是系统级别的内存优化技术远不能满足实际需求,比较流行的内存优化技术包括tcmalloc、ptmalloc、jemalloc等 。
内存池的作用:1、存放大块数据
2、存放数据缓存
5.2 进程/线程池进程池和线程池的作用:
1、 避免动态启动的时间开销
2、 使得处理更加单一
3、 充分利用硬件资源
进程池和线程池的注意事项:
1、 典型的生产者消费者问题
2、 注意访问共享资源存在的竞争
5.3 连接池连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用,比如数据库连接池 。
连接池创建的方法:
1、 预先分配固定数据的连接
2、 对每一个连接都分配相应的资源
连接池的作用:
1、 为创建新连接提速
2、 可用于集群内部永久性连接
06缓存缓存可以分为本地缓存和分布式缓存 。本地缓存:编程实现(成员变量、局部变量、静态变量) 。
分布式缓存:借助Redis、Memcache实现 。
一般系统的写入请求远少于读请求,针对写少读多的场景,很适合引入缓存集群 。在写数据库的时候同时写一份数据到缓存集群里,然后用缓存承载大部分的读请求,当缓存中不存在的时候才去数据库查找,这样通过缓存集群,就可以用更少的机器资源承载更高的并发 。
缓存的命中率一般能做到很高,而且速度很快,处理能力也强(单机很容易做到几万并发),是理想的解决方案 。
当然,在使用分布式缓存的时候,需要格外注意处理一致性问题,缓存击穿,缓存穿透,缓存雪崩等问题 。
07消息队列7.1 概述
分布式缓存在读多写少的场景性能优异,对于写操作较多的场景可以采用消息队列集群,它可以很好地做写请求异步化处理,实现削峰填谷的效果 。
消息队列能做解耦,在只需要最终一致性的场景下,很适合用来配合做流控 。
业界有很多著名的消息中间件,比如ZeroMQ,rabbitMQ,kafka等 。
7.2 特点
1、业务耦合;
2、最终一致性;
3、广播;
4、错峰与流控 。
08流控8.1 服务降级自动降级:超时、失败次数、故障、限流
人工降级:秒杀、双11大促等
服务降级要考虑的问题:
1、核心服务、非核心服务
2、是否支持降级,降级策略
8.2 应用拆分
应用拆分原则:
1、业务优先;
2、循序渐进;
3、兼顾技术:重构、分层;
4、可靠性测试
8.3 限流
限流的常用处理手段有:计数器、滑动窗口、漏桶、令牌 。
1、计数器法计数器是一种比较简单的限流算法,在一段时间内,进行计数,与阀值进行比较,到了时间临界点,将计数器清0 。
但是,计数器法存在一个时间临界点的问题 。比如,在11:50:00到11:59:59这段时间内没有用户请求,然后在12:00:01这一瞬时发出1000个请求,12:00:59又出现1000个请求,在这个临界点可能会承受恶意用户的大量请求,甚至超出系统预期的承受 。
2、滑动窗口由于计数器存在临界点缺陷,后来出现了滑动窗口算法来解决 。

高并发架构设计

推荐阅读