良好的架构设计
异步架构
Iaas的核心应该做的是管控层,而不是数据层。故ZStack仅仅也是做出一些“决策”而已——在设计系统的时候,应不考虑在这些决策的执行上消耗大量的资源。在面对大量请求或者“决策”的时候,如果使用多线程来处理阻塞式IO模型时会遇到一些问题:
阻塞模型的吞吐量受到线程池大小的限制;
创建并使用许多线程会耗费额外的时间用于上下文切换,影响系统性能。
而非阻塞、异步的消息驱动系统可以只运行少量的线程,并且不阻塞这些线程,只在需要计算资源时才使用它们。这大大提高了系统的响应速度,并且能够更高效地利用系统资源。
故,ZStack采用了异步架构,分别由三个部分组成:
异步消息
异步方法
异步HTTP 请求
如果在系统中的一部分采用异步设计,是不行的。这样还是会因为同步而没法享受异步带来的“福利”。故此整个系统都得采用异步架构。
相对的,开发者们在编写异步代码的时候得格外小心。
在系统设计中,异步调用可以减少系统在IO上出现瓶颈的可能性。
扩展链接 :ZStack--可拓展性的秘密武器1:异步架构
无状态服务
在ZStack
中,每一个服务都是独立存在的。为了方便的管理更多的物理机,ZStack
推荐采用集群部署MN。但这样就会遇到一个问题,不同MN下面有着不同的几个服务存在,在这里我们设其为X个服务。在10个MN部署的情况下,可能就是10X个服务。那么在一个资源需要操作时,我需要发送向对应的MN。那么如何找到那个MN呢?最直观的想法就是在各个MN中保存相应的“服务表”,这即是一种状态。那么在分布式系统中,采用有状态的服务绝对不是一个好的选择,它会严重影响系统的扩展性。ZStack
巧妙的采用了一致性哈希算法+MQ解决了这个问题。
- 这在系统设计中实为是一种使用一致性hash技术的负载均衡
无锁架构
解决并发的问题不一定要用显式的锁,也可以对同一资源做操作的任务做成队列使其串行执行。
注意:并发 != 并行
扩展链接:ZStack--可拓展性秘密武器3:无锁架构
松耦合架构
项目模块化
在Intellij
中打开ZStack的代码,会发现大多数目录底下都会有一个pom.xml
文件,ZStack采用了模块化项目。模块化的好处在工程实践中不言而喻的,比如:
可以在不影响整个系统的情况下替换某个模块
开发者只要专心的在自己的模块中工作即可
减少系统耦合度,提高内聚,减少资源循环依赖,增强系统框架设计
...