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