应用系统的架构
在一个互联网应用的用户数量快速增长和系统业务复杂化之后,高并发访问成为了大型网站和应用面临的一个重要挑战。高并发指的是系统在同一时间段内处理大量并发请求的能力,它对系统的性能、可扩展性和稳定性提出了更高的要求。
缓存技术是高并发架构设计中常用的手段之一。在高并发场景下,读操作通常远多于写操作,因此通过缓存常用数据和结果,可以显著减轻数据库和服务器的压力,同时提升数据读取速度。同样在高并发场景下,同步的请求处理方式往往会导致系统响应时间变长和资源消耗增加,因此采用异步处理和消息队列的方式可以有效提升系统的并发处理能力,通过将耗时的操作或复杂的业务逻辑异步化处理,并将结果通过消息队列传递,可以实现解耦和异步化处理,提高系统的并发性能和稳定性。
“新闻内容管理系统v2.0”采用分布式架构,整个系统分为新闻网站与管理后台两大功能模块,系统采用Nginx做反向代理,将用户的请求转发到不同的功能模块;使用Redis缓存热点数据,实现高并发数据读取;使用RabbitMQ进行流量削峰、实现高并发数据写入。

1、Application1:应用服务器,运行新闻网站,供web用户通过浏览器进行新闻的浏览。
2、Application2:应用服务器,运行管理后台,管理后台是供作者或编辑进行新闻创作、内容审核的后台管理系统。
3、Application3:应用服务器,连接消息队列与数据库的中间应用,负责从消息队列提取数据,并将数据新增或更新至数据库与缓存。
4、Application4:应用服务器,运行移动App后端应用程序,为Nginx2上的前端程序提供数据,不返回页面也不负责页面的跳转逻辑。
5、Redis:Redis缓存服务器,缓存最近访问的热点新闻,降低后端MySQL数据库的压力,同时提升数据读取速度。
6、RabbitMQ:消息队列服务器,临时缓存用户的写入请求,消息队列的异步处理能快速响应用户,同时对短时间涌入的大流量请求进行平滑削峰处理,提高系统的并发性能和稳定性。
7、Nginx1:既是反向代理服务器,能将用户的请求路由到新闻网站和管理后台;也是静态资源服务器,能够处理客户端的静态资源请求。
8、Nginx2:移动App前端服务器,部署系统的前端程序,为移动App提供交互界面,处理App用户请求。
9、MySQL:数据库服务器,存放应用系统的所有数据,用户通过应用服务器上的应用程序实现对数据的增删改查等操作。
系统的运行原理
1、移动App的请求处理流程。
- 客户端Client的请求通过http协议发送给Nginx2上的前端应用程序。
- Nginx2将客户端请求的页面及相关的Javascript代码返回给客户端。
- 客户端接收到返回的页面后,会从中解析出CSS样式表、Javascript代码、图片等静态资源的地址。
- 客户端通过静态资源地址再次向静态资源服务器Nginx1发送请求,获取静态资源文件,直到所有的静态资源文件获取完毕。
- 请求静态资源的同时,客户端会运行前端程序中的Javascript代码,向应用服务器Application4上的后端程序请求数据。
- 后端程序先在Redis缓存中查找数据,若缓存中没有,则再在MySQL数据库中查找。从数据库中查找到的数据首先会被缓存在Redis中,然后再返回给客户端,此后应用程序再次访问此数据时就会直接从Redis中获取。
- 客户端将所有的静态资源文件与后端程序返回的数据整合到最终的页面中,完整展示本次请求的结果。
2、新闻网站的请求处理流程。
- 客户端Client的请求通过http协议发送给反向代理服务器Nginx1。
- Nginx1根据请求路径将请求路由到应用服务器Application1上的新闻网站。
- 新闻网站接收到用户请求后会按要求对数据进行处理,处理过程中需要用到的数据,程序会首先在Redis缓存中查找,若缓存中没有,则再在MySQL数据库中查找。从数据库中查找到的数据首先会被缓存在Redis中,然后再返回给客户端,此后应用程序再次访问此数据时就会直接从Redis中获取。
- 数据处理完毕后,应用程序将执行结果以html页面等形式返回给客户端。
- 客户端接收到返回结果后,会从中解析出CSS样式表、JS代码、图片等静态资源的地址。
- 客户端通过静态资源地址再次向静态资源服务器Nginx1发送请求,获取静态资源文件,直到所有的静态资源文件获取完毕。
- 客户端将所有的静态资源文件整合在应用程序返回的html页面等结果中,完整展示本次请求的结果。
3、管理后台的请求处理流程。
- 客户端Client的请求通过http协议发送给反向代理服务器Nginx1。
- Nginx1根据请求路径将请求转发到应用服务器Application2上的管理后台。
- 如果管理后台接收到的用户请求是数据读取,程序会首先在Redis缓存中查找,若缓存中没有,则再在MySQL数据库中查找。从数据库中查找到的数据首先会被缓存在Redis中,然后再返回给客户端,此后应用程序再次访问此数据时就会直接从Redis中获取。
- 如果管理后台接收到的用户请求是数据写入(增删改),程序会将要写入的数据首先写入消息队列RabbitMQ中,然后快速返回结果给用户,无需等待数据处理完毕。
- 客户端接收到返回结果后,会从中解析出CSS样式表、JS代码、图片等静态资源的地址。
- 客户端通过静态资源地址再次向静态资源服务器Nginx1发送请求,获取静态资源文件,直到所有的静态资源文件获取完毕。
- 客户端将所有的静态资源文件整合在应用程序返回的html页面等结果中,完整展示本次请求的结果。
4、数据服务的请求处理流程。
- 位于RabbitMQ消费端的应用服务器Application3上的数据服务程序一旦监听到RabbitMQ中有数据,就会立刻读取数据。
- 根据请求类型将数据写入MySQL并同步更新至Redis缓存。