最近设计的反思

最近完成了邮箱的功能。

邮箱的设计参考了mmzb的设计,基于一套msgsrv来实现。msgsrv是一个消息中转的服务,这个服务是为了简化玩家之间消息传递的过程。比如邮箱要向一个离线玩家发信,为了避免对离线玩家的数据进行修改,会通过msgsrv发送到玩家对应的msgbox里。玩家上线后,会自动查询自己的msgsrv,检索未读消息。当玩家上线时,会主动在msgsrv中发起订阅。每当有新的消息进入,msgsrv会直接发送到玩家所在的agent上,实现实时通知。唯一例外的情况,是全局消息的发送。一条全局消息发送的时候,只是向一个全局的队列里插入一份数据。玩家只会在登录时检索一次这个全局队列,并记住自己的检索位置。缺点是全局消息的通知不及时,需要玩家离线再上线才能收到。需要实时的消息,可以通过聊天系统解决。

这个设计相对来说还是比较简单的。但是,这个功能的提交,涉及到46个文件。我提交Pull Request的时候,自己都惊到了。当然,这其中并不是全部都是代码的修改。这些修改可以简单的分为三块。一块,是配置之类的修改,比如新增服务的参数,新增服务的数据存储对应的数据库定义,玩家数据库对象新增的结构描述。这里占了7个文件。第二块,是在lualib里提供的新api,为其他服务提供新功能的入口。其中还包含一些趁手的工具函数,方便以后功能的开发。这里占了8个文件。第三块是大头,实现了msgsrv的逻辑部分,以及邮箱的业务代码。这一块有31个文件,是这个PR的主要部分。

除了玩家自身的成长系统外,其他系统基本都涉及到两部分。一部分,是挂在玩家的agent身上的,另一部分,则是对公有数据的修改。先看看agent的部分。agent身上需要有对应服务的api,供客户端通过sproto协议来远程调用。还需要有对应的api,供相应的skynet内服务的调用。一般还会有一套额外的gm api,供客户端进行测试的时候使用。这三组api,功能覆盖的面差不多,最终都会操作玩家身上的数据,通知到玩家的客户端。就这次提交的邮件PR来看,这些api占住了7个文件。玩家数据部分的管理,是由几个类完成的。这里占用了3个。总的来看,agent身上一共改了15个文件,稍微有点多。

剩下的文件,集中在对公有数据的修改上,即msgsrv的主体部分。其中有4个是用于执行功能测试的测试脚本,暂且不提。剥开msgsrv,首先是一层command,然后是对全局消息的管理器,对个人msgbox的管理器,对这两者的管理器,以及管理msgsrv服务的启动脚本、退出脚本、gm指令。这里的优化空间应该比较大,按照CRUD的四字法划分,个人消息管理器和全局消息管理器都有着多个“R”,多个“U”,正交性不够好,还要锤炼一下。

优化现有的设计,主要目标是希望修改能够更简洁而清晰。不再因为添加一个小小的功能,就产生数十个文件的修改。对我来说,涉及的文件数量太多,就经常记不住细节,导致api改动的时候,常常出现漏改漏测。目前看到的可以优化的地方,就是各种自发现。比如lualib里面提供一个通用的调用api封装,只要传入方法名和服务名,就能自动调用对应服务的command api。数据结构的定义,能够实现自动发现,不需要修改引用文件。(待续)

时间: 2024-08-02 13:14:17

最近设计的反思的相关文章

JavaWeb网上商城课程设计的反思

不知道从什么时候起,我爱上了写博客,对之前学得的只是进行反思.写了几天课程设计,代码量量8.9千左右. 然后下面文字是我在博客上复制过来的,说得很详细 MVC(Model View Controller)设计模式在JavaFX中有着比Swing更好的表现方式.它使得程序界面设计和程序逻辑设计完全分开,便于代码的可读性和以后的可维护性. JavaEE体系架构采用传统的MVC设计模式,分为Model.View.Controller三层,其中:Model即模型层,定义数据模型和业务逻辑.为了将数据访问

平安某金所奇葩的面经-关于幂等和ROA设计的反思

在公司一直在做跟支付有关的项目,某日接到平安某金所一男子电话,应该是之前某猎头投的,我正好在吃早饭(也不能怪他们上班早,我们公司弹性工作制,我一般上班比较晚). 因为饭馆信号不好,只能赶紧放下剩下的半碗馄饨(肉痛啊),走了一公里(那片移动信号真是渣). 终于可以正常交流了.对方让我先挑一个项目说说,我一听这套路,牛啊!跟之前的阿里一样(以后找机会再聊聊那次面经),肯定是随机在我项目中找点来问了,那我就开始说,说到有个补扣款的场景,一开始设计每次客户端发差额过来,很难保证幂等性,后来设计让客户端发

浅谈商城活动设计

如题:浅谈商城活动设计 标题改成“浅谈商城活动的数据库设计”可能更加合理. 文章背景 为什么要吐槽,为什么要写这篇文章 本来我在弄大数据搜索,自己玩的不亦说乎,虽然感觉数据库设计不合理,但我可以数据清洗,弄到自己的搜索引擎里,自己随便玩,所以当时感觉在烂的数据库设计和我关系不大,只要我把数据清洗好,弄到自己的引擎里我的搜索正常,准确,问题不大.但忽然有一天老大跑来说ERP对接需要你来lead一下,然后一两个月带着捣乱的产品妹妹,和没有经验开发弟弟搞了ERP的简单对接,然后老大又说咱们商城库存总有

课题:监控视频内的人数统计

课题简介 监控视频下的人数统计在生活中应用广泛,有效掌握实时的人数信息,对于人流控制,公共空间设计,行人行为分析,意外事件控制等非常重要.然而这个课题也面对着监控视频分辨率,人群遮挡等问题,目前这个课题的研究领域活跃,提出了很多行之有效的方法,但是对于场景的依赖度很高,统计精度也有待提升.本次毕业设计,将会立足于视频分析,结合当前已知解决方案,采用计算机视觉的技术手段和模式识别的理论依据,进行充分的实验和思考,对课题进行深入的研究和探索,提出解决监控视频下人数统计的高效可行的方法. 文献检索综述

编程人生读书笔记(4):Bredan Eich

Bredan Eich是JavaScript设计者,Mozilla首席技术官,ECMAScript标准的制定者.Breda有着坚实的理论基础和较强的工程实践能力,本科物理专业,数学底子很好.在学校里主要做科研编程,毕业后从事网络.系统内核开发.专长是编译器,内核开发,设计了JavaScript语言. 0.总结从语言设计者的角度看待编程.学习和实践的关系:- 编程要实践,选择合适的工具(语言),有自己的态度(动力)坚持练习.- 设计代码的方法:用伪代码理清思路,再着手底层实践.实践多了,最后总结成

多线程电梯设计的总结与反思

一.FAFS电梯设计 这是第一次使用java多线程,主要的问题主要集中在两个方面 1.共享资源的数据同步 2.整体架构 先考虑第一个问题: 数据同步的问题显然可以使用synchronized解决,也就是经典的生产者消费者模型. 但是由于初次接触,对锁机制理解不清,我还探索了一种不那么好的方法——volatile,具体使用方法见Whai is volatile 它显然能用在这个问题的解决,但是其实volatile带来的问题很多,比如性能损失,也不具很好的普适性. 第二个问题: FAFS在调度策略的

通过“分布式系统的8大谬误”反思APP的设计 第四篇 谬误4:网络是安全的

谬误4:网络是安全的: 只要与网络服务相关,开发人员都要从开发设计以及业务需求方面考虑网络的安全性,iOS也不例外.所有最基本的攻击类型,网络服务都需要考虑:session劫持,盗取证书,代码注入等等.网络安全是个负责学科,现在先让我们考虑一些和iOS APP相关的内容. 我们只能像相信用户一样,相信用户的设备(译者:这里的意思是用户就是小白,他们不懂得如何保护自己的信息.).任何一个安装应用的人都可以深入了解到应用的内容(译者:像图片资源,私钥,任何保存在手机上的文件),也可以轻而易举获取手机

通过“分布式系统的8大谬误”反思APP的设计 第六篇 谬误6:只有一个管理者

我们再回顾一下著名的分布式系统的8大谬论,以及如何在开发应用是避免这些问题. 1,网络是可靠的: 2,网络不存在时延: 3,网络带宽是无限的: 4,网络是安全的: 5,网络拓扑结构是不会变化的: 6,只有一个管理员: 7,网络传输是不需要任何代价: 8,网络是同构的. 谬误6:只有一个管理者. 作为一个开发者,你可以控制在什么时候发布新的APP或新的服务器版本,但任何人都控制不了到底有多少类型的设备在运行你的APP.用户们可以在按自己意愿更新应用,也许更本不会再更新.导致你不得不同时处理各种版本

通过“分布式系统的8大谬误”反思APP的设计 第二篇 谬误2:网络没有时延

就在今天上午,我的系统的网络请求时延高达544毫秒到6937毫秒之间.而且这是在一个已激活的网络接口上.如果接口从省电模式开始激活的话,这还额外需要10秒钟的时间.因此为了提供良好的用户体验,App需要考虑至少十几秒的网络时延. 假如在app发起用户认证请求后,只有请求成功用户才能进入登录页面,这时已经过去7秒.如果接着App需要再发一条请求获取用户信息,那么用户被阻碍在登录页面总共多达14秒.所以我会尽可能打破这种必须前后按序发生的请求. 实际操作中,我会同时发送多个请求:尤其是有些请求,不占