本文从属于笔者的《服务端应用程序结构风格变迁之路》

CAP理论是分布式系统构建中的基础理论之一,其中的C(Consistency),一致性即指所有的节点都能访问同一份最新的数据副本、A(Availability),可用性即指每个请求都能接收到一个响应,而P(Partition Tolerance),分区容忍性即指除了整个网络的故障外,其他的故障(集)都不能导致整个系统无法正确响应。CAP理论的核心即是一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。在笔者刚才描述的服务端应用程序构建的场景中,同样可以用类似于CAP理论的方式进行描述。

  • Partition Tolerance:在上文的描述中,我们业务系统构建的一个目标是在干净整洁的代码的基础上提供灵活多变的接口,这就好像饭店一样,如果我们为Consumer提供了一盘做好的黄焖鸡米饭,Consumer是很难再把它变成炒鸡杂。而如果我们提供的是原料食材,那么Consumer想做成什么都可以。封装程度越高的Service/API的可重用性与可组合性越低。笔者在上文提及,任何一个复杂的应用程序皆可以表示为简单的CURD操作的排列组合,而如果我们的Service层或者API层只提供最基本的,即粒度最小的操作,那么Controller层或者Consumer的自由组合的能力也就越强,整个应用系统的灵活性与可变性也就越高。总结而言,Partition Tolerance即是衡量一个服务端应用系统可以提供对外的API的粒度,粒度越低代表着分割容忍性越好。最极端的情况即是Server只提供最基本的CRUD操作,就好像只是对于数据库做了简单的封装。

  • Consistency:直观的说,如果我们以保证灵活性、可变性为目标,势必会减少对于数据库连接操作的使用。换言之,原本一条SQL语句连接查询获得的内容变成了执行两次SQL语句,这就导致了可能在两次查询的间隙数据已经发生了变化,最终导致返回给Consumer的数据存在不一致性。

  • Availability:在Server中,可用性即指某个API的性能,或者说是响应时间。如果要保证分割容忍性,势必会将原本可以一次执行的SQL语句分为多次,导致查询效率急剧下降,也就导致了可用性受到影响。而如果要保证一致性,那么可以使用事务的方式,同样会导致可用性的减小。

目前绝大部分的Server端的实现都是以CA为目标,即牺牲了分割容忍性,保证强一致性与可用性,这也是ACID理论的表现。很多情况下我们会发生某个API其实只是执行了某条及其复杂的SQL语句,该SQL语句可能连接查询了十几张表并且返回数据。这也就导致了API的可变性极差,你要修改API返回的某个字段也就意味着要修改最底层被执行的那个SQL语句,等于重新构建了一个新的API。如果我们的系统目标是保证CP,即牺牲可用性。那么我们可以引入事务或者锁,即在一个Session的多次查询中锁定全表,从而保证返回数据的一致性。如果我们的系统目标是保证PA,即牺牲一致性,那么最好的方式就是引入缓存机制,可以设置在固定时间或者事件触发的情况下再进行真实查询操作,其他情况下可以从缓存中获取数据,这样就能够较好地保证用户的响应时间。

随着分布式系统的发展,eBay工程师提出大规模分布式系统的实践总结,在ACM上发表文章提出 Bash 理论是基本可用、软状态和最终一致性。不要求实时一致性,但一定要实现最后一点。笔者目前秉持的在Server端的开发过程中也是遵循BASE理论,这在下面会有详细介绍,这里还是阐述下BASE的内涵:

  • 基本可用(Basically Available)。分布式系统在故障时允许损失可用性,保证核心业务可用。音频直播或是做活动时,当业务量非常大的时候可以降级。做游戏也是,在战斗的时候最关心数值的增长,看了多少人都无所谓,缓解核心内容的压力。

  • 软状态(Soft State)。允许系统中出现的中间状态,中间状态不会耽误可用性。在写代码、编程业务的设计上,必须容忍有一定的临时数据同步,考虑到全局锁和数据多版本的对比,把各个节点的相关数据都上锁,这是一个悲观锁,一旦写任务,其他人都能改我的数据,这是比较悲观的心态。

浅论服务端应用程序开发中的CAP思想(非分布式系统中的CAP理论)相关推荐

  1. 怎样在javascript函数中将变量传递给服务端脚本程序?

    怎样在javascript函数中将变量传递给服务端脚本程序? (有朋友问上述问题, 愿把结论分享给大家). 摘 要:   服务器端脚本运行时, 它只会解释执行<% %>或<?php ...

  2. spring实现mqtt服务端_SpringBoot--实战开发--MQTT消息推送(六十)

    一.MQTT简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台 ...

  3. 简:webservice服务端及客户端开发

    一.服务端开发 1️⃣接口 public interface WsServer {String sayHello(String name); } 2️⃣实现类 import javax.jws.Web ...

  4. 《Netty权威指南 第2版》学习笔记(1)---服务端与客户端开发入门

    前言 Netty权威指南中以时间服务器为入门案例,演示了如何通过Netty完成了服务端与客户端之间的交互过程. 在开始使用Netty开发之前,先回顾一下使用NIO进行服务端开发的步骤. 创建Serve ...

  5. SpringBoot——实现WebService接口服务端以及客户端开发

    文章目录 一.服务端代码开发 1.pom依赖 2.接口类 3.接口实现类 4.webservice配置文件 2.客户端开发 (1)pom依赖 (2)封装客户端方法clientUtil (3)调用接口类 ...

  6. 服务端socket程序

    socket是一种IPC方法,本文实现一个简单的服务端例程,用于了解socket程序框架. socket函数用于创建套接字. bind函数用于分配ip地址和端口号. listen函数将套接字转为可接收 ...

  7. 浅谈服务端渲染(SSR) 与使用场景

    什么是SSR(服务端渲染)MUA? SSR是Server Side Render的缩写,简单来讲:服务端渲染 就是网页上面呈现的内容在服务器端就已经生成好了,当用户浏览网页时,服务器把这个在服务端生成 ...

  8. 家政服务APP小程序开发功能详解

    随着人们生活水平的提高,对家政服务的要求也越来越高.而传统的到家政公司寻找服务人员的方法显然已经无法满足人们需求,取而代之的是线上预约家政服务.家政服务App小程序软件可以满足用户在线预约,还可以根据 ...

  9. WebService服务端与客户端开发

    最近客户提出了将我们做的系统接入到他们系统之中,方便他们进行集中管理这个需求,其中主要就是运用了WebService技术来进行系统之间的接入.在此记录一下整个WebService是如何嵌入我们系统的以 ...

最新文章

  1. 【建站系列教程】7、SEO优化之meta标签【最后一篇】
  2. GitHub 博客-- Jekyll--代码高亮,Liquid 转义字符
  3. 资深美术分享:游戏开发如何确定画风?
  4. 压力、焦虑远远超出全国平均值,近4成程序员心理不健康?
  5. 转载 - Linux 磁盘挂载
  6. 决战移动互联网 诺基亚开始迷失
  7. 产品介绍丨世炬5G一体化基站
  8. 测试开发之前端——No8.HTML5中的媒介事件
  9. 2016年最经典的高仿系列源码打包下载4.84G
  10. 事业单位怎么发送通知短信
  11. 电脑系统知识:Windows原版系统与Ghost系统的区别,你知道吗?
  12. HarmonyOS应用开发实战 | 开发运动手表小游戏
  13. 免费的java开发工具_Java那些最常用的免费开放工具,分享这15个!
  14. Android13 App 预装详解
  15. 新零售门店是什么 新零售门店如何建设 新零售门店案例
  16. mt管理器主题修改教程_微信主题设置教程及链接来啦!
  17. 青柠日语五十音QuickStart
  18. 谷歌眼镜Mirror API开发指南之Timeline
  19. 1848年欧洲革命:欧洲史上最大规模的革命运动
  20. 联通2g信号显示无服务器,联通卡2g没信号怎么办

热门文章

  1. (iOS-基本知识)堆和栈的基本知识详解
  2. C# — 通过点击回车执行任务
  3. zblog文件大小超出,上传成功但插入不了
  4. Spring Cloud 学习笔记(四)-Spring Cloud Hystrix
  5. (转)ADC的滤波方法
  6. JS的Document属性和方法
  7. 关于IT人职业道德的反思(转)
  8. 《Cortex-M0权威指南》之体系结构---异常和中断
  9. Oracle Ora 错误解决方案合集
  10. 常见几种浏览器兼容性问题与解决方案