需求:
1.硬件环境:所有服务器都是web容器,有统一的缓存memcached,由于一些原因,不允许用中央控制服务器
2.实现一个虚拟房间系统,即包括房间内的数据可见并共享(数据竞争性),房间有超时检测,房间外部还有一个统一调度(即不是自由进入房间,由系统分派),房间有人数限制,也要求人数多的尽快分配满,人数少的尽快清空
实现思路
开始是一个很简单的思考模式:
超时检测与房间调度必然是两个服务,房间数据必然是存储在统一的缓存里面,超时检测必然是检查用户上次登录的时间戳,超时了执行用户退出房间逻辑,而房间调度则需要所有房间的信息。而用户操作,每次操作,会更新该用户的房间内的时间戳
由于房间数据是高争用数据,所以想到是把用户数据从房间数据分离,然后房间数据只保留用户索引,但用户的频繁退出进入或者超时,也就造就了房间数据有不低的争用频率,但用一些cas之类的冲突解决方案,也能基本解决问题
而超时检测,需要遍历所有房间内用户的数据,我们的用户数据量很大,最高能达到近1000w,所以即使频率很低(1分钟),高峰期每秒钟也达到了16w的数据访问量,这是不能接受的
根据需求的进一步细化,引出了第二次设计(准确说是第三次,中间的忘了):不精确模型
需求其实不明确要求人数限制要限制很死,比如说10个人,即使达到了100个人,问题也不大,所以我们的初始方案有了很大的优化余地,我们将本来的精确模型改为了不精确模型
首先,采用了租约的模型,也就是一个用户进入房间,会给他一个租约,也就是上述的时间戳,然后将每次操作更新租约改为了由客户端采集用户操作,定时更新租约(时间较长)。
然后,把用户数据整合回房间内,用一个单一列表来保存,同时利用的memcached的特性append操作(no respond),每次续租不再更新之前的租约,而是新建一个租约,直接append在队列后面,这样,可以极大的减少了冲突(cas在分布式中应用并不是一个好办法)
第三,超时检测多做一件事情,除了检查租约(其实也就是遍历所有房间的租约,每个房间一个list),让用户退出之外,再由超时检测服务来维持一个房间人数,set操作,无视冲突
第四,房间分派服务每次只需遍历所有的房间的人数,就可以得出一个全局的状况,然后进行调度
第五,调度服务采用预调度模式,即每次查询全局信息,会预调度一批房间号,当用户请求分派时,只会从预调度队列里面去拿一个房间号,然后新建租约,这样,又极大的降低了调度的频率,注意,这时候会更新房间人数,即会与第三步的动作有冲突,解决方案是无视冲突
第六,由于极大地降低了调度的频率,我们完全可以将调度算法做得很复杂,我们提供了多种解决方案
1.预调度模型,也就是根据增长率等状况,计算每次调度人数
2.简单调度,只根据当前房间数来决定增长率和调度人数
而房间的增长方案,我们采用的是优先级调度方案,高于某个阈值,则优先调度,目标是快速填满,低于某个阈值,则极少调度或者不调度
第七,由于是分布式的,即每个服务器都会有一个调度服务跟一个超时检测服务器,调度服务还好说,可以人数/服务器数就可以得到每个服务器的调度人数,不需要协作,超时检测服务器是需要协作的,因为每个服务器做的工作是一样的,所以我们还是用了memcached做同步,cas解决冲突
第八,细节
虽然超时检测需要访问统一缓存的数据量已经降为极低,但是我们还是希望进一步优化,所以制定了在房间的上一层划分一个层次,然后在超时检测周期内均匀分布所有的检测,让数据库访问更平缓
在调度服务中进一步优化,当访问次数很多的时候,会将调度频率提高,比如说当预调度队列中少于某个阈值时,会额外新增调度线程来提高调度频率
总结
其中,由精确模型向不精确模型的转化是很关键的一步,这也告诉我们,业务系统的设计永远是立足于需求的,高精确性,高一致性,不一定是最好的解决方案
第二,租约概念的提出给整个概念模型的建立给了很大的助力,在思考上和概念上的思路变得清晰而有条理
开始的设计是每秒10w以上的访问量,到最后降低为每秒不超过10次,这不能不说是一个质的飞跃
分享到:
相关推荐
Godot引擎社交游戏开发:虚拟物品与交易系统_(10).性能优化与测试.docx Godot引擎社交游戏开发:虚拟物品与交易系统_(11).案例分析与实践项目.docx Godot引擎社交游戏开发:虚拟物品与交易系统_(1).Godot引擎...
CryEngine引擎社交游戏开发:虚拟物品与交易系统_(10).交易系统的用户界面设计.docx CryEngine引擎社交游戏开发:虚拟物品与交易系统_(11).交易系统的网络同步与优化.docx CryEngine引擎社交游戏开发:虚拟物品...
GameMaker Studio社交游戏开发:虚拟物品与交易系统_(10).交易系统的测试与优化.docx GameMaker Studio社交游戏开发:虚拟物品与交易系统_(11).多平台适配与发布.docx GameMaker Studio社交游戏开发:虚拟物品与...
Phaser引擎社交游戏开发:虚拟物品与交易系统_(10).交易安全与防作弊机制.docx Phaser引擎社交游戏开发:虚拟物品与交易系统_(11).社交功能的集成.docx Phaser引擎社交游戏开发:虚拟物品与交易系统_(12).好友...
Cocos Creator引擎社交游戏开发:虚拟物品与交易系统_(10).社交功能与好友系统.docx Cocos Creator引擎社交游戏开发:虚拟物品与交易系统_(11).虚拟物品与交易系统的优化与测试.docx Cocos Creator引擎社交游戏...
在“杭电操作系统课程设计虚拟文件系统”项目中,开发者构建了一个原始的虚拟文件系统,这涉及到了多个关键知识点: 1. 文件描述符:每个打开的文件在VFS中都有一个唯一的文件描述符,用于后续的读写操作。文件描述...
虚拟仿真实训系统解决方案是高职教育中的一种新型教学方式,通过虚拟仿真技术,构建一个与现实世界的物体和环境相同或相似的虚拟教学环境, цель是提高学生的技能水平和职业核心技能的训练。该解决方案具有多...
系统虚拟化是现代IT环境中一个至关重要的技术领域,它允许在一个物理硬件系统上运行多个独立的操作系统实例,每个实例都仿佛拥有自己专用的硬件资源。本项目书将深入探讨系统虚拟化的概念、技术、实施步骤以及其在...
(2) KVM目前已成为学术界和工业界的主流虚拟机监控器(VMM)之一,已经在越来越多的应用场景中使用。 任务:通过KVM的官方网站https://www.linux-kvm.org/,在Linux系统中下载并安装使用KVM,进一步了解KVM的...
虚拟现实和增强现实之虚拟现实和增强现实平台:Unity:虚拟现实项目优化与性能提升.docx
在IT行业中,虚拟化是一种关键技术...总结,"系统虚拟化项目"是一个旨在实现高效、灵活和可靠IT基础设施的工程。通过理解和实施虚拟化技术,企业能够优化资源利用,增强业务敏捷性,并为未来的数字化转型奠定坚实基础。
"东南大学虚拟校园系统项目from vCampus2017"是一个基于Java Swing技术构建的高级应用程序,旨在为学生、教师和其他校园社区成员提供一个集成了多种功能的虚拟学习环境。这个项目以其出色的用户界面(UI)设计和人性...
虚拟现实和增强现实之虚拟现实和增强现实平台:Oculus SDK:虚拟现实与增强现实项目管理.docx
虚拟现实VR系统开发软件是一个基于客户/服务器模式的系统,服务器提供VR文件及支持资源,客户通过网络下载希望访问的文件,并通过本地平台上的VR浏览器交互式访问该文件描述的虚拟境界。 二、系统功能概述 虚拟...
虚拟现实和增强现实之场景理解算法:语义分割:虚拟现实与增强现实项目设计.docx
该大作业是北京航空航天大学研究生课程“虚拟现实技术”中的一项实践项目,主要涉及了基于弹簧-质点系统的安全网运动的实时3D虚拟仿真。这个项目不仅在学术上具有重要意义,也是对初学者掌握OpenGL编程的一个优秀...
系统虚拟化:原理与实现.pdf
操作系统课程设计中的虚拟磁盘系统是一项重要的实践任务,它旨在帮助学生深入理解操作系统的存储管理机制,特别是磁盘I/O操作。在这个项目中,你可能会涉及以下几个关键知识点: 1. **虚拟磁盘概念**:虚拟磁盘是一...
总结来说,这个虚拟磁盘系统项目是一个综合性的C++编程实践,涵盖了文件系统操作、命令解析、错误处理等多个方面。通过这个项目,开发者不仅可以深入理解文件系统的工作原理,还能提升在面向对象设计、异常处理和...
虚拟现实和增强现实之传感器融合算法:视觉惯性融合:虚拟现实与增强现实项目实践.docx