silly的一次大规模重构

本文详细介绍了silly项目近期的重构过程,包括去除master-worker模式并转向单进程单线程模型,以及对Lua层socket协程调度的改进。此外,还分享了作者关于框架设计的心得体会。

最近一个月都在重构silly, 包括其工作模式以及一些扩展库的实现基本上都被重写了。


其实coding的时间并没有想象中的那么长,只是在重构过程中碰到很多取舍情况,大部分时间都耗费在了纠结的时间上。


当初实现silly的初衷是首先满足类似gameserver这类业务模型的需求,然后尽可能多的兼顾其他类型的server。


然而以这两年的工作经验来看,master-worker模式由于多worker之间不能进行通信,因此仅仅适用于http这种不带有状态残留的协议模型。

而对于gameserver这类在进程内存内残留状态的业务开发并没有什么用。因此这个功能算是鸡肋功能了,犹豫再三最终还是将master-woker模式拿掉,将silly改为单纯的单进程单线程工作模式(当然内部还是有单独的timer/socket线程的).


而以我有限的服务器开发经验来看,在高并发分布式开发过程中, 应该将业务流程抽象成pipeline节点, 然后根据每个pipeline节点的负载情况动态增加或减少相应节点的物理进程。因此拿掉master-worker工作模式之后,准备在多进程通信方面多增加一些支持。


单进程单线程模式并不意味着就无法充分使用多核cpu, 如果服务器性能足够好,则可以尽可能多的把进程布到同一台物理机上,如是服务器性能略差则可以相应减少进程数。采用这种模式可以大大提高服务器的可伸缩性而并不需要业务逻辑做出改变。


另一个比较大的重构就是lua层的socket coroutine调度方面。


在之前的coroutine调度模块中,不管是core.lua中还是其他相应的扩展库中,都是直接使用lua提供的原生coroutine库进行操作的。


这样就会有一个问题,core.lua没有自成一个闭环,也就是说只要其他基础库实现的有bug, 就会扰乱socket coroutine的调度,而且极难查出问题出在哪。而在阅读lua源码的过程中可以看到他的所有api接口都是自成闭环的,换句话说只要在luaconfig.h中把检查参数打开,只要你传入非法值,他都是可以检测到的,这极大的降低了debug的难度。


为了使用socket coroutine的调度也自成闭环,我封装的core.fork/core.wakeup/core.sleep等与coroutine相关的函数,除了core.lua之外,不允许其扩展库使用lua原生的coroutine库。而core中提供的相应的coroutine操作函数在调用时都会去检查和设置相应的coroutine状态。


这样即使某个扩展库对coroutine的操作流程不正常,也只会影响调用这个扩展库的coroutine, 更重要的是一旦这个扩展库出现coroutine调度上的bug, core层lua代码能及时发现问题,并将错误信息抛出,极大的除低了debug的难度。


btw, 个人觉得一个成熟的库,其自身是否为闭环是重要标志之一。


在重构扩展库gate.lua时我犯了一个错误, 这个错误导致我重写了好几遍代码,最后才醒悟过来。


在一开始时,我想让gate尽可能的适用于各种情况, 因此重写了一次又一次总觉得不太满意。 最后我幡然醒悟,满足各种情况的库是不可能做到的。


最后确立了core.lua + C核心代码 为整个silly的核心,其他都是扩展库,而gate.lua仅仅不过是一种对核心代码的特殊情况的使用而已。 到此才停止了对gate.lua不停重构。


由此,我得到一点重要的启示。一个框架一定要明确这个框架的核心要解决哪些问题,然后提供灵活而正交的接口供扩展库使用。扩展库的功能则是拿核心接口采取不同的策略去处理不同的情况。


固定链接:http://blog.gotocoding.com/archives/574

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值