一直在思考分布式系统设计的问题,业务对象原封不动的情况下部署在客户端和服务器端,可以根据配置文件选择是连接服务器还是连接本地的数据库,这个问题让我绞尽脑汁,我总是设想的客户端与服务器端通信的方式是最低端的Socket。花了两个晚上研究CSLA.NET框架关于数据门户这块代码,才发现问题的关键所在:客户端与服务器端通信不能采用最低端的Socket,而要用高端的WebService、.NET Remoting或者是自己定义一种协议等,只要它们支持客户端直接根据服务器端的服务URL、类名、方法名和方法参数四个信息就可以调用服务器对应的类和方法就行。

说明:本文中所表达的思想与CSLA.NET有很大区别,不要看了本文就以为是CSLA.NET的设计思想,也不要以为本文错误的解释了CSLA.NET,这不是一篇介绍CSLA.NET的文章,但纯思想上它们是相同的。

  • 分布式系统的部署

  平常我们都说三层架构,我认为它是一个广义的模型,更多层的设计可以合并相邻几层的方式最终回归到三层这个宽泛的概念上来,我的意思是:这些都只是概念,忘记这些概念去实际分析设计会离这些概念更近一些。

  接下来我要把三层变的更简单点,两层,数据访问层合并到业务层,统称为业务层,因为我们面对的问题不是分层的问题,而是分布式系统中各层应该怎么部署的问题。在CSLA.NET书中也说到业务层和数据访问层放到同一台机器上可以提高性能和容错性。因此他们俩的合并不影响分布式系统的部署。

  不过要解释的是数据库系统(CSLA.NET中说的数据存储和管理层)并没有考虑到三层中来,也就是它不包含在数据访问层中,如果把它算进来,那么它是在数据访问层之下单独存在的。

  综上,在分布式系统部署角度考虑的分层实际是三层:界面层、业务层(包含数据访问层的业务层)、数据存储层。

  下面举例说明可能的部署情景,带阴影的框框表示一台机器,虚线框表示根据使用场合可有可无,虚横线表示从此处划开单独出服务器。在B/S应用中,Web浏览器为客户端,其他全部为服务器。在C/S应用中,处在最上层的界面层+业务层为客户端,其他为服务器

非分布式系统的部署

单机版

两三台机器

分布式系统的部署

分布式的Web系统

分布式的C/S系统

有几点要说明:
1. 客户端上的验证等业务逻辑是不可信的,因此任何一种部署都需要服务器端包含业务层;
2. 为了开发、维护和部署中的高度可伸缩性,图中的各业务层所包含的代码都是一模一样的;
3. 因为第2点,所以我遇到了业务层的同一个操作是与其他机器上的业务层通信还是访问数据库这个难题。

解决业务层的数据访问问题

  这个问题是关键问题,也就是上面几点说明中的第3个问题,为了解决这个问题我们引入数据门户的概念。

  下面以WebService为例说明:界面层访问本机的业务对象的增删改查中的“查”方法时,跳过数据库的查询操作,访问另一台机器中的同一个业务对象类的“查”方法。

  以上是向另一台机器发送请求,该请求并不直接调用另一台机器上的业务对象类的“查”方法,而是将要调用的业务对象和方法参数信息转为一个“二进制包”,作为参数去调用另一台机器上通用的“查”方法,另一台机器上的“查”方法再解开这个包,然后去调用解开的包中所表示的业务对象类型,下面的静态图是另一台机器接受到请求后的工作。

又有些说明:
1. 关于原理都已在图中做了描述,不另写大段文字解释了;
2. 上面两个图中,除了“实际业务对象类”以外的部分全部属于架构或者框架部分;
3. 如果用OO的思想去审查上面的两个图,你一定会为这糟糕的设计而抱怨,这里只是为了尽可能简单的表述分布式系统的工作原理,你可以采用策略模式使数据门户不改变的情况下适应各种请求响应场合,采用工厂模式实现不同的请求响应场合的切换。

 

 关于数据库的分布

  为了解决数据库服务器的负担,我们可能希望把数据分布存储在多个服务器上,我设想的数据库分布方案是,各服务器上的数据库在结构上一模一样,而表里的数据存储到不同服务器上,这样数据访问层在查数据的时候分别向所有数据库服务器发送同样的sql命令,然后数据访问层得到数据后整合,这样减轻每台服务器的工作量。亦或者根据表里的某个代表性的字段(如:省份)分布数据到不同服务器。

分布式系统设计原理与方案相关推荐

  1. 分布式系统设计原理与方案Dubbo+Zookeeper+Spring整合

    2019独角兽企业重金招聘Python工程师标准>>> 一直在思考分布式系统设计的问题,业务对象原封不动的情况下部署在客户端和服务器端,可以根据配置文件选择是连接服务器还是连接本地的 ...

  2. 分布式系统设计系列 -- 基本原理及高可用策略

    "分布式系统设计"系列第一篇文章,这篇文章主要介绍一些入门的概念和原理,后面带来一些高可用.数据分布的实践方法!! 各位亲,如果你们觉得本文有还不错的地方,请点击"投一票 ...

  3. 腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面

    1.引言 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂? ...

  4. 一文带你重新审视CAP理论与分布式系统设计

    这是一篇来自微信公众号的文章,如果图片看不到,可直接跳转到文章出处查看:https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=265076 ...

  5. 分布式技术原理与实战45讲--06 加餐1:如何准备一线互联网公司面试?

    本课时我们来讲讲如何准备一线互联网公司面试. 互联网技术面试的特点 互联网公司的技术面试有一些侧重点,国内互联网公司和外企的侧重点又有不同.BAT 互联网公司看重项目能力,重点考察语言深度和项目能力, ...

  6. RocketMQ分布式事务原理介绍

    RocketMQ实现分布式事务原理 1.知识准备 在系统架构从单体到分布式.SOA.微服务的发展过程中,因为流量的增多出现了大量消息堆积问题的需求,在这种背景下,阿里开发出rocketmq来解决该问题 ...

  7. 分布式系统设计和开发_计划,设计和开发设计系统

    分布式系统设计和开发 Here is a topic discussed in every company: communication between departments. 这是每个公司讨论的主 ...

  8. 深入理解分布式CAP原理

    hi,大家好,互联网最重要任务莫过于海量数据处理,即大规模分布式系统(单机性能有限),分布式是互联网的核心技术,希望大家可以掌握. 什么是 CAP? 作者:聂鹏程,文章来源极客时间 --分布式技术原理 ...

  9. 从金拱门餐厅联想到的分布式系统设计思维

    作者|周明耀 编辑|小智 其实在生活中,大到组织架构,小到琐碎日常,都能学到一些经验.总结出一些知识.共性往往隐藏在特性之中.你需要做的,可能仅仅只是细心观察而已? 前几天中午开会开到 12 点半,错 ...

最新文章

  1. 从Ops到NoOps,阿里文娱智能运维的关键:自动化应用容量管理
  2. Vue 中定义方法页面上使用
  3. 第七章 培养负责的习惯
  4. 从拿到班车手册.xls到搜索附近班车地点
  5. 控制kvm-qcow2增长空间-(一)
  6. 让Node.js在Azure上运行-3
  7. ubuntu 本地源搭建
  8. 经纬度(度分秒)和十进制相互转换
  9. wsimport的使用
  10. 行人重识别论文阅读5-基于换衣服的行人重识别
  11. C++ 动态申请二维数组与二维数组传参
  12. 一文了解DeFi主经济商,为何说它是DEX主导市场的关键
  13. 如何选择企业邮箱?企业邮箱好处是什么?
  14. matlab自动变量名,matlab中如何自动给变量命名?
  15. 三菱梯形图转换c语言软件,梯形图转51软件(三菱PMW文件转51)
  16. Java 字体颜色转换工具类 ColorUtil
  17. 外文版计算机科学期刊,EI(SCI) 收录国外英文期刊(计算机类)
  18. 王牌投手·MLB棒球创造营
  19. cdr怎么算曲线周长_CorelDRAW X3计算封闭曲线长度和面积
  20. 发电机失磁保护的整定计算

热门文章

  1. codeigniter 禁止ip登录_「开源资讯」baigo SSO v4.0 beta-3 发布,单点登录系统
  2. SpringMVC学习08之SSM整合(三)
  3. 巴巴腾机器人怎么开机_【巴巴腾智能机器人使用】_摘要频道_什么值得买
  4. Win7安装64位CentOS 6.4双系统详细过程
  5. CVPR 2016 有什么值得关注的亮点?
  6. 深度学习(二十四)矩阵分解之基于k-means的特征表达学习
  7. 闭包漫谈(从抽象代数及函数式编程角度)
  8. 降维(一)----说说主成分分析(PCA)的源头
  9. Bag of Words cpp实现(stable version 0.01)
  10. 【python图像处理】python绘制饼状图