Part01高并发框架高并发是“大量操作请求在同一时间点或极短时间内发生”的场景。但是,传统的网络通信模型已经无法应对海量数据和高并发场景;一个优秀的高并发框架是现阶段网络通信不可或缺的一部分,比如:Grizzly、Netty、Mina。面对海量的设备接入场景,平台选择Netty作为整个接入能力的核心框架。其单节点百万级访问和集群千万级海量访问能力已经成为当前平台在高并发场景下的解决方案。什么是网络?它是一个异步事件驱动的Java开源网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。为什么选择Netty?与传统的IO模型相比,Netty的IO线程NioEventLoop聚合了多路复用器Selector,可以并发处理上千个客户端连接。当线程有空闲从客户端读写数据时,线程可以执行其他任务。无需等待数据被读取或写入的任务。在线程模型方面,Netty的线程模型也称为Reactor模型,核心是基于事件驱动的方式来处理事件;其分布式异步架构使得事件处理器高度解耦,便于事件处理逻辑的扩展;同时通过将事件暂存在队列中,线程消费事件,方便并行异步处理事件。Netty的优点是什么?Netty适用于各种传输类型的统一API阻塞和非阻塞套接字;基于灵活可扩展的事件模型,可以清晰的让开发者专注于业务,无需关注底层架构,提高开发效率;具有高度可定制的线程模型——单线程、一个或多个线程池;真正的无连接数据报套接字支持。Zero-Copy技术使Netty具有更低的资源消耗和不必要的内存副本。Part02微服务架构《筷子易断,筷子断难》。平台也是如此,庞大的单体服务总会遇到性能瓶颈。面对千万甚至上亿的接入,平台只能横向扩展,部署更多的单体服务;而单个服务包含了全方位的服务功能,任何一个功能失效,所有功能都将不可用;单个服务代码的复杂度也很高,服务中包含了大量的业务逻辑。随着时间的推移,需求不断增加,代码越来越复杂,维护成本也越来越高。连bug修复和新功能都要非常慎重,可以说是牵一发而动全身。平台选择微服务的整体架构设计,采用分布式部署的方式,完美解决单一服务面临的困境。功能原子化,可维护性高将复杂的单体服务拆分成专注于单一功能的微服务,并通过定义良好的接口明确表达服务边界。由于体积小,复杂度低,易于维护,可维护性高,提高研发效率。服务独立,部署风险低微服务有独立运行的进程,可以独立部署。当一个微服务发生变化时,不需要部署整个应用服务,只需要重新部署发生变化的微服务即可。使得发布更加高效,降低正式环境带来的部署风险,最终缩短应用受到影响的时间。高扩展性和高容错性微服务有利于水平扩展。当不同的微服务有不同的扩展需求时,可以根据微服务的实际需求独立扩展,无需扩展整个应用,节省资源,提高资源利用效率。微服务还增加了应用程序的高容错性。在单个微服务出现故障的情况下,不会影响其他微服务,导致整个应用不可用。对于多节点的微服务,上层微服务会通过重试可用的微服务或平滑的故障转移机制来实现应用层面的高容错。Part03负载均衡面临大量用户访问、高并发请求、海量数据。即使是高性能框架和微服务架构的设计,也不能完全解决应用服务的压力。通常,客户端在请求服务器时会有一个统一的访问入口,那么这个统一的访问入口是如何把我们的请求分发到服务器上的,压力更小呢?答案是“负载均衡”。顾名思义,负载均衡是一种平衡客户端请求,将它们分发到多个服务器单元,优化资源使用,最大化吞吐量,最小化响应时间,避免任何单一资源过载的技术。负载均衡的分类主要有以下几种:二层负载均衡采用虚拟mac的形式,外部请求虚拟mac地址,负载均衡接收后分配实际的mac地址服务进行响应处理。三层负载均衡采用虚拟IP的方式。外部对虚拟IP的请求经过负载均衡后分配到实际IP地址响应。Layer-4loadbalancing(TCP)Layer-4loadbalancing是在三层负载均衡的基础上,通过发布三层负载在四层端口号上加上一个均衡的IP地址来决定哪些流量需要进行负载均衡;LVS在四层负载均衡性能上高于Nginx。七层负载均衡(HTTP)七层负载均衡是在更高的应用层上进行负载均衡,会对每条消息的实际内容进行处理,主要是通过对消息内容的分析,得到消息内容的有效识别,最后决定选择的内部服务;例如选择URL来做出负载平衡决策;Nginx在功能性和便利性上都优于LVS。平台负载均衡采用LVS+Keepalived+Nginx进行业务流分发,实现整体负载均衡;支持TCP、UDP等协议的四层负载均衡;支持HTTP/HTTPs等协议七层负载均衡;添加或删除后端服务流可以在服务后重新加载。Part04分布式中间件高并发框架,微服务架构设计,使用负载均衡解决大部分服务端并发压力。但是在磁盘海量数据的读写上,I/O的瓶颈也非常明显。数据存储仍然会造成应用服务的瓶颈。分布式中间件的使用尤为重要。分布式缓存缓存是一种用来提高系??统响应速度和系统性能的技术。缓存通常基于内存,数据库中数据的读写通常基于磁盘。从缓存中读取数据比从磁盘读取数据快两个数量级。分布式消息队列消息队列是一种中间件技术,用于解决应用耦合、异步消息、流量切分等场景。可以实现高性能、高可用、可扩展和最终一致性的架构,是大型分布式系统不可或缺的中间件。在平台微服务架构设计方面,也会采用缓存分布式Redis缓存。分布式Redis缓存具有高性能、动态扩展、高可用、易用等特点。集群方式用于满足高读写性能场景和容量需求。改变了业务需求。也用到了分布式Kafka,它是消息异步处理和微服务间应用解耦的一个组成部分。
