框架设计的局部与整体

second60  20180417

1. 例子引出

在框架设计中,很多总和分的问题需要处理,即局部与整体的问题。所以要有很好的扩展性。是框架设计中的重点之一。

举个例子

1.1 初始需求

棋牌初始产品需求,玩家能获取自已的某个游戏GAME 1中的房间。游戏在单进程中。

最简单的设计

A程序设计了一个接口:get_user_game_room()

这对单个进程是完全没有问题的,但并没有任何扩展性

1.2 改进需求

产品要求添加多一个新游戏GAME2

A程序又在原有接品中添加了个参数:

get_user_game_room_by_gameid(int  gameid)

设计分析:这样设计是可以支持多子游戏,但前提是客户端必须传参数gameid过来,

1.3 升级需求

产品要求不用知道是什么游戏,获得游戏中所有的房间

A程序又开始写代码了,让客户端遍历两个子游戏,分别请求并获得两个游戏的玩家房间,再拼起来。

问题来了,上面的设计是不合理的,原因如下:

a) 客户端不知道有多少个游戏,假如到时添加很多个游戏怎么支持

b) 客户端不可能通过遍历的方式去循环请求接口

c) 客户端是轻逻辑实现,只想一个接口做到所有的事情

分析:

上面的设计完全是开发人员根据当前的需求做的实现,只能支持当时的需求。并无扩展性可言。

2. 设计思路

2.1 通用性

因为是棋牌项目,所以多子游戏是肯定的,后面还可能会多地区。所以设计功能时,每个接口要考虑下多子游戏和多地区的情况。

接口具有通用性:无论怎么怎么变更需求,接口定好后通用,不能随便改变

a) 初始需求中,获取自已房间列表,要支持多子游戏获取房间列表,

b) 获取玩家所有子游戏房间列表的情况,虽然需求没有给出,但应该支持。

初步框架图:

2.2 扩展性

接口具有扩展性的,给出客户端后,是不能随便修改的。

a) 此接口当一个公共接口,统一入,统一出。

参考:get_user_game_room(int  optye, map<string,string> params);

optype为类型,0为所有,1为单游戏ID,2为多游戏ID

params为参数

2.3 整体与局部

接口设计好了,但后端怎么样来支持多子游戏和多地区呢?

a) 对于多子游戏是一个“分”的过程,即局部的过程,所以要有一个“总”的地方。而在原来的设计中并没有总的一个地方,都是分散在各个进程中。

b) 总是一个存储数据的地方,可以把数据放到redis缓存中,查房间的信息,只需要去redis中查找即可

c) 同时接口不用定义到所有的”分进程中”,在一个通用服务中去redis中读取即可。

d) 在通用进程中定义通用接口,供客户端调用,通用进程去redis中查找即可

2.4 可复制性

以后要添加类似的通用性接口,也只需在通用过时程中添加即可。

3优点

1. 接口具有较好的通用性,以后无论是添加多游戏,还是多地区,都无须在分进程中写接口,”分”进程只需同步数据到”总”的redis中即可

2. 接口扩展性,无论是获取所有玩家房间,单个游戏房间,多个游戏房间,或其他房间的过滤需求,都是可以的

3. 可复制性,后面要添加一个类似的通用接口,只需用同样的设计方法实现即可

4 缺点

4.1 保证数据一致性

分和总之间的同步,局部与整体间的同步要规划好

a) 可以把数据都放在“总”里,“分”里是无状态的,“分”中要取数据,从“总”中读取即可。

b) 对于上面程序A的设计,是完全没有数据一致性的,数据都是放在不同进程中,所以取数据不方便,同时也不能保证数据的一致性

4.2 单点问题

a) 通用进程,如果是只有一个,那么通用进程如果出现问题,那么此功能将会不可使用,所以可以让通用进程采用集群的方式,布署多个

b) 上面的“总”redis也同样,单个如果出问题将会不可功能不可用,开启redis的集群即可

4.3 通用进程

通用进程会加大代码的工作量,但会减少多进程排查问题和后面可扩展的问题,所以前期工作量会大些,但后期开发时间将会大大减少

5 总结

这里主要用过例子,引出一个设计中整体与局部,扩展和通用性的问题,例子比较简单,但很多地方都可以用到,当然很多写的不细致的地方,欢迎大家吐槽。

框架设计的局部与整体相关推荐

  1. 《精通自动化测试框架设计》—第2章 2.3节测试数据交互基本方法

    本节书摘来自异步社区<精通自动化测试框架设计>一书中的第2章,第2.3节测试数据交互基本方法,作者陈冬严 , 邵杰明 , 王东刚 , 蒋涛,更多章节内容可以访问云栖社区"异步社区 ...

  2. 《精通自动化测试框架设计》目录—导读

    作者简介 精通自动化测试框架设计 陈冬严,浙江大学硕士,具有10年软件测试和团队管理的工作经验,先后服务于ITSM.PLM软件研发企业,现就职于某金融行业核心机构IT规划部门.业余时间喜欢园艺. 邵杰 ...

  3. 对接接口文档_接口自动化测试框架设计思路

    接口自动化测试--框架设计思路 1 前言 之前文章跟大家分享了一下自己在接口自动化测试中进行测试准备的一些相关知识点,接下来本篇文章详细分享一下接口自动化框架设计的思路总结,希望能对初次探索接口自动化 ...

  4. Dubbo框架设计原理

    框架设计 参考文档 http://dubbo.apache.org/zh-cn/docs/dev/design.html 整体分为三层 Business 业务逻辑层,只有一层Service 面向接口编 ...

  5. 高德智慧景区随身听播放器框架设计与实现

    简介:我们开发选型并没有采用传统的TTS技术(由文本内容生成机器语音),而是采用了更加通用音频格式(比如mp3),作为讲解的音频输入源,方便讲解者进行二次创作.本文将简单回顾高德智慧景区随身听播放器的 ...

  6. Node.js 框架设计及企业 Node.js 基础建设相关讨论

    大家好,我是若川.19年我写的 lodash源码 文章投稿到海镜大神知乎专栏竟然通过了,后来20年海镜大神还star了我的博客,同时还转发了我的微博.时间真快啊.今天分享这篇Node.js的讨论. 2 ...

  7. 我从 Vuejs 中学到了什么——框架设计学问

    框架设计远没有大家想的那么简单,并不是说只把功能开发完成,能用就算完事儿了,这里面还是有很多学问的.比如说,我们的框架应该给用户提供哪些构建产物?产物的模块格式如何?当用户没有以预期的方式使用框架时是 ...

  8. osgi框架 android,基于OSGi的Android应用模块动态加载框架设计与实现

    摘要: 伴随着移动互联网科技水平向4G的飞跃,移动终端的使用日趋常态化,移动智能设备的普及率越来越高,得到了大量使用者的追捧.与此同时,各手机操作系统下应用商店里正充斥着琳琅满目的移动应用产品,用户对 ...

  9. Dubbo 框架设计与源码解读(配置解析优先级、线程分配、负载均衡、容错方案)

    整体框架设计 图例说明: 图中左边淡蓝背景的为服务消费⽅使⽤的接⼝,右边淡绿⾊背景的为服务提供⽅使⽤的接⼝,位于中轴线上的为双⽅都⽤到的接⼝. 图中从下⾄上分为⼗层,各层均为单向依赖,右边的⿊⾊箭头代 ...

最新文章

  1. 2020年春天故事之巧遇史上最奇葩SAP用户
  2. linux 下重名名文件
  3. vue组件自定义v-model
  4. c#12星座速配代码_白羊座今日运势|2020/12/11
  5. java跳_用Java实现跳表
  6. 抖音举办平台治理开放日 半年捣毁25个黑产团伙
  7. 《Windows编程循序渐进》——对话框应用程序
  8. mysql 常用字段类型_mysql 常用字段类型
  9. 【转】如何调试bash脚本
  10. set,env,export,set -x,set -e;
  11. Windows下的TCP/UDP网络调试工具-NetAssist以及Linux下的nc网络调试工具
  12. (十)统计表速查(标准正态分布、t分布、卡方分布)
  13. 【C语言】井字棋游戏
  14. php 中%3cspan%3e,隐藏第三方网站统计图标
  15. 手机计算机国二支付,“刷手机”时代悄然来临 手机支付呼唤国家标准(二)...
  16. Python数据可视化:网易云音乐歌单
  17. 了解建模三大软件:3Dmax、Maya、zbrush
  18. 不要高估你和任何一个人的关系
  19. 【天池】金融风控贷款违约预测task5
  20. MATLAB 2020a的参考安装教程

热门文章

  1. js数组去重的6种方法
  2. 抖音seo账号矩阵霸屏系统源码/账号矩阵系统搭建部署
  3. android broadcast 大全,android 动作、广播、类别等标识大全(Android actions, broadcasts, categories, etc.).doc...
  4. 盘点那些真正能提升工作幸福度的小工具
  5. 《Python编程从入门到实践》学习笔记7:用户输入和while循环
  6. 计算机的硬件组成(详)
  7. M5311nbiot 模组入坑 (接入华为物联平台)
  8. 基于qt开发的智能系统:电子相册,监控摄像头模块,音乐播放器,视频播放器,电子时钟
  9. 英特尔遭遇「灾难级」财报!裁员、砍业务、董事会主席辞职,甚至给不出2023业绩预期
  10. @Value(“${}“)