架构杂谈《三》

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1022560838/article/details/96269973

一致性问题

  前面的《架构杂谈一》和《架构杂谈二》 杂谈了从服务化到微服务架构的演进,并肯定了服务化和微服务架构是一脉相承的。微服务在服务化架构的基础上,对服务化的细节和方案进行了优化和细化,重点突出了无中心化管理的微服务架构,通过对服务进行有效的拆分来实现敏捷开发和自动化部署,并在海量用户的请求下,提高了微服务架构下较细粒度的水平伸缩能力。

  然而,微服务架构并不是万能的它可以说就是一把双刃剑,我们在享受它带来的便利的同时,也会遇到数据和服务之间不一致性的问题,在为服务架构下多个服务通过非可靠的网络通信,如何让服务之间高效的通信和协作,如何解决系统之间状态不一致等问题,这可以说是我们在使用微服务架构后不得不面对的问题。

1、什么是一致性

  一致性是一个抽象的概念,在不同的场景下有不同的含义,在传统IT时代,一致性通常指强一致性,在杂谈互联网时代的一致性之前,我们先了解一下互联网时代的特点:

  • 互联网时代信息量大,需要非常强大的计算能力
  • 互联网时代要求对用户的响应速度快,还要求吞吐量指标向外扩展(水平伸缩)

  通过这些个互联网时代的特点分析后,我们发现单节点的服务器无法满足人们的需求,服务节点开始池化。但是池化不是越多越好的(常言说,人多不一定能解决所有问题),还得有序、合理的分配任务,并有效的进行管理,于是在互联网时代讨论最多的话题就是拆分。拆分又一般分为水平和垂直,这不单指对数据库或者缓存的拆分,主要是表达一种分而治之的思想和逻辑

 水平拆分:由于单一节点无法满足性能的需求,需要扩展成多个节点,多个节点之间具有一致的功能,组成一个服务池,一个节点服务一部分的请求量,所有节点共同处理大规模的高并发的请求量。

 垂直拆分:按照功能进行拆分,把一个复杂的功能拆分成多个单一、简单的功能,由于每个功能职责单一、简单,使得维护和变更变的更容易、简单和安全,所以更易于产品迭代,还能够快速地进行敏捷发布和上线。

  在这样的一个互联网时代,一致性指分布式服务化之间的弱一致性,包括应用系统的一致性和数据的一致性。

  无论是水平还是垂直拆分,都解决了特定场景下的特定问题,然而,拆分后的系统或者服务化的系统的最大问题就是一致性问题。

2、解决一致性问题的思路

  1、ACID

    如何保证一致性问题呢?我们在学习关系性数据库时都学习了ACID原理,这里简单的对ACID做个介绍。

    A:原子性

    C:一致性

     I:隔离性

    D:持久性

    具有ACID特性的数据库支持强一致性,强一致性代表数据库本身不会出现不一致,每个事务都是原子的(要么成功要么失败),事务间是隔离的,互相不受影响。最终状态是持久的。因此,数据库会从一个明确的状态过渡到另外一个明确的状态,中间的临时状态是不会出现的。如果出现也会及时地自动修复,因此是强一致性的。然而,前面提到,互联网项目大多数具有大规模、高并发的特性,必须使用拆分的理念。即使使用关系型数据库,单机是难以满足存储和吞吐量上的性能需求。由于业务规则的限制,我们无法将相关数据分到同一个数据库分片,这时就需要实现最终一致性。

  2、CAP 

  由于对系统或者数据进行了拆分,我们的系统不再是单机系统,而是分布式系统。针对分布式系统的CAP原理有三个元素。

  C:一致性。在分布式系统中的所有数据备份,在统一时刻具有相同的值,所有节点在同一时刻读取的数据都是最新的数据副本。(Consistency)

  A:可用性,好的响应性能。完全的可用性指的是在任何故障模型下,服务都会在有限的时间内处理完成并进行响应。(Availability)

  P:分区容忍性。尽管网络上有部分消息丢失,但系统仍然可继续工作。(Partition tolerance)

  CAP原理说明,任何分布式系统只可满足以上两点,无法三者兼顾。由于关系型数据库是单节点无复制的,因此不具有分区容忍性,但是具有一致性和可用性。而分布式的服务化系统都需要满足分区容忍性,这就需要我们在一致性和可用性两者中进行权衡选择。

  3、BASE

  eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。(BASE 思想解决了CAP提出的分布式系统的一致性和可用性不可兼得的问题)

  BASE思想与ACID原理截然不同,它满足CAP原理,通过牺牲强一致性获得可用性,一般应用于服务化系统的应用层或者大数据处理系统中,通过达到最终一致性来尽量满足业务的绝大多数需求。

  BASE思想的三个元素。

  BA:基本可用(Basically Available)。

  S:软状态,状态可以在一段时间内不同步(Soft State)。

  E:最终一致性,在一定的时间内,最终数据达成一致性即可。(Eventually Consistent)

  软状态是实现BASE思想的方法,基本可用和最终一致性是目标。以BASE 思想实现的系统由于不保证强一致性,所以系统在处理请求的过程中可以存在短暂的不一致,在短暂的不一致的时间内,请求处理处于临时状态中,系统在进行每步操作时,通过记录每个临时状态,在系统出现故障时可以从这些中间状态继续处理未完成的请求或者退回到原始状态,最终达到一致状态 。

  有了BASE 思想作为基础,我们对复杂的分布式事务进行拆解,对其中的每个步骤记录其状态,有问题可以根据记录的状态来继续执行任务,达到最终一致性。

说明:

  1、参考书籍:《分布式服务架构:原理、设计与实战》

  2、如有不合适的地方请反馈。综合后更改。

展开阅读全文

游戏外挂杂谈(三)

10-27

大家好,我们继续外挂技术的讨论,今天的内容我想对那些想要做外挂却又有点无从下手的朋友会很有帮助,我整理了一下制作一个收费外挂所需要的技能,参考的书目以及工具。rnrnrn1、熟悉windows系统。针对目前网络游戏的现状,基本所有的网络游戏客户端都是以windows为平台的,所以要做外挂windows一定要熟悉。这种熟悉不是指操作的熟悉,而是要对一些windows的实现机制要有了解,并且对于不同版本的windows的区别要有了解。比如在win2000中用CreateRemoteThread的方法可以很方便的把dll挂接到其他进程中,而win98就不行。所以如果你用CreateRemoteThread做外挂,那么就不具备win98的兼容性。windows的内核还是很复杂了,而且方面也比较多,作为外挂来说有几方面需要清楚比如进程管理方式,dll管理方式,内存管理方式。在这个方面我想《windows核心编程》是不二的选择。rn2、一种适合的编程语言和工具。很多关于语言和工具的争论其实是没有含义的,每种语言都有自己适合的地方,简单的例子不管java是不是很优秀,用它来开发外挂基本是不可能的(除非代理服务模式的服务端)。我认为C++应该是很好的选择,而工具也推荐用vc,当然delphi也不错但我觉得还是没vc适合,个人观点。至于vb,大家还是别用来开发外挂吧,真的不适合。书的话比较多,找两本经典的看看就ok了。rn3、win32 sdk。这个是不可少的,因为要涉及windows的一些内核方式的开发,还有涉及到游戏程序的跟踪,不懂win32 sdk那么开发中会有种寸步难行的感觉。如果是用vc开发,我想应该用sdk而不应该用mfc。推荐的书,《windows程序设计》和msdn,程序设计是让你知道win32 sdk开发的基本过程,而到后期查看msdn会很频繁。rn4、程序跟踪。对于包的加密,一般来说仅观察包的变化来破解可能性很小,所以要去程序中找到加密过程,还有一些程序中本身的保护机制的破解也需要跟踪程序。推荐的工具ollydbg,推荐的书看雪学院的《加密与解密》。rn5、socket编程。有两个地方需要用到socket,一是在外挂程序本身需要收包发包,一是在验证服务程序的开发中需要。推荐的书,这个方面我看的书不多,都是零散的学的,也说不出什么好的书来,大家可以补充。rn6、熟悉unix编程。验证服务程序如果要跑在unix linux服务器上,那就需要熟悉这个方面了。实际上我是不熟悉的,但我熟悉java,我的验证程序是用java写的,所以无论服务器的平台了,这个就是java的优势,至于效率问题我没考虑那么多因为只是验证,运算量并不大。rn7、数据库编程。验证服务中需要涉及用户管理,最好的方法当然是用数据库了。我开发外挂是完全个人的,虽然熟悉一些数据库方面的编程,但因为时间不允许采取了文本方式。其实也不是很复杂,主要就是不同数据库的连接方式,剩下的就是sql语言了。rn8、汇编语言。跟踪程序看到的都是汇编,不了解汇编是不行的,而且当跟踪到加密过程后还需要把过程翻译成C语言。基本上需要读懂汇编语言,不需要能熟练的用汇编语言编程。书的话看那本清华的《IBM 汇编语言》就ok了,书名可能记错了,看的时间太久了。注意的是大部分汇编书都是比较老的,和现在的有区别,比如以前是16位寄存器而现在的是32位的,但只要看懂实现方式和基本语法就可以了。rn9、加密。验证服务中传送的数据是应该加密的,否则明文传输等于没做验证,推荐RSA非对称加密方法。还有本身的外挂程序也要做加密加壳,推荐的书看雪学院的《加密与解密》。rn10、界面开发。呼出界面要做的好看也不是很容易,要花时间,我在这方面就比较差,希望能向大家学习。rn11、改写游戏界面。比如直接在游戏屏幕上写字什么的,这方面要懂directx,我不会正在学习。rn12、html asp jsp等等。这个是做网站用的,不多说了,asp jsp是做动态的比如论坛,但现在基本都是用别人写好的论坛,如果不是特别要求这个也就不需要了。rnrn开发外挂是一种很考验一个人广度的项目,在某些方面还需要具备一定的深度,做外挂不说别的对一个人的个人能力的提升也是很有帮助的。当然不是非要一个人把这些技能都掌握,如果作为团体开发只要找到合适的伙伴各有所长开发出的外挂将更精彩,我就没有这样好的合作伙伴,觉得有些遗憾。 论坛

没有更多推荐了,返回首页