最近获取了一个类似红包或者抢票的网页开发项目,由于在平时讲课时主要对编程语言基本语法等进行教学,很少涉及到实际项目,该项目中用户唯一考虑的性能要求就是满足高用户、高并发的操作要求。网页不能够在并发用户操作时产生问题。初步估计同时在线人数约为5000,并发操作人数约为1000。结合教学确定选择使用PHP+ MySQL 进行业务处理及数据读写。因此需要首先从架构角度分析,如何设计架构满足用户高用户、高并发的要求。初步设计采用消息队列、负载均衡、 数据库连接池 及分库存储、 读写分离 等以提高网页性能。基本设计构想描述如下图:
以上给出了高并发、高负载性能需求的基本解决方案设计,其中各部分说明如下:
消息队列
使用消息队列主要用于解决 并发用户数 量大于资源数量或者并发用户数量大于数据库连接数量的情况下,采用队列限定访问数据库进行数据操作的请求数量,通过队列长度确定能够访问资源的请求,以此降低对资源的并发访问,借助队列FIFO特性,保证队列中请求执行完成之后在资源有剩余前提下再将新请求入队。从而实现并发数量控制与流量削峰。
负载均衡
负载均衡主要借助 阿里云 提供的负载均衡服务器与ECS 云服务器 ,通过动态资源分配降低单个服务器在面对高并发时的性能问题。两台ECS服务器通过负载均衡实现动态请求的接入与处理。
数据连接池
数据连接池主要用于解决数据库连接过程需要占用资源,影响响应速度等问题,将所有链接放入连接池,Web服务器传递用户请求之后,自动分配连接,执行数据库操作。执行完操作之后连接继续放入连接池,等待其他请求使用连接。
MySQL数据库优化
针对用户操作中部分操作仅是数据查询,即读操作,部分操作是更新操作,即写操作。将数据库采用单独建库形式,实现读写分离,可以进一步提高数据操作的效率。另外可以将数据按照分组条件进行多表的划分,已减少单一数据表读写的负担,整体提高数据库读写的效率。
存在的一些问题
以上是针对用户性能需求,本人想到的解决措施与方法,由于平时主要集中在基础教学,实际项目经验较少,可能解决这个问题的方法有很多,欢迎大家不吝赐教。另外我也考虑到了php的多线程技术,但是感觉由于服务器是第三方的,配置或许较为麻烦。在用户请求放入队列部分,考虑前端Ajax发送请求之后直接保存传递过来的用户标识放入队列,或者请求操作放入队列,这一点页还没有考虑好。如果采用 socket 进行服务提交的话,可以将socket作为客户端的标识等,也需要下一步思考。简单说服务器端如何区分每一个客户端请求,对每个客户端请求做出处理,这一点还没有想明白,期待大家指教。
本头条号长期关注编程资讯分享;编程课程、素材、代码分享及编程培训。如果您对以上方面有兴趣或建议与意见,可以联系作者,共同探讨。期待大家关注!
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~