良好的架构设计

异步架构

Iaas的核心应该做的是管控层,而不是数据层。故ZStack仅仅也是做出一些“决策”而已——在设计系统的时候,应不考虑在这些决策的执行上消耗大量的资源。在面对大量请求或者“决策”的时候,如果使用多线程来处理阻塞式IO模型时会遇到一些问题:

  • 阻塞模型的吞吐量受到线程池大小的限制;

  • 创建并使用许多线程会耗费额外的时间用于上下文切换,影响系统性能。

而非阻塞、异步的消息驱动系统可以只运行少量的线程,并且不阻塞这些线程,只在需要计算资源时才使用它们。这大大提高了系统的响应速度,并且能够更高效地利用系统资源。

故,ZStack采用了异步架构,分别由三个部分组成:

  • 异步消息

  • 异步方法

  • 异步HTTP 请求

如果在系统中的一部分采用异步设计,是不行的。这样还是会因为同步而没法享受异步带来的“福利”。故此整个系统都得采用异步架构。

  • 相对的,开发者们在编写异步代码的时候得格外小心。

  • 在系统设计中,异步调用可以减少系统在IO上出现瓶颈的可能性。

扩展链接 :ZStack--可拓展性的秘密武器1:异步架构

无状态服务

ZStack中,每一个服务都是独立存在的。为了方便的管理更多的物理机,ZStack推荐采用集群部署MN。但这样就会遇到一个问题,不同MN下面有着不同的几个服务存在,在这里我们设其为X个服务。在10个MN部署的情况下,可能就是10X个服务。那么在一个资源需要操作时,我需要发送向对应的MN。那么如何找到那个MN呢?最直观的想法就是在各个MN中保存相应的“服务表”,这即是一种状态。那么在分布式系统中,采用有状态的服务绝对不是一个好的选择,它会严重影响系统的扩展性。ZStack巧妙的采用了一致性哈希算法+MQ解决了这个问题。

  • 这在系统设计中实为是一种使用一致性hash技术的负载均衡

扩展链接:ZStack—可拓展性秘密武器2:无状态的服务

无锁架构

解决并发的问题不一定要用显式的锁,也可以对同一资源做操作的任务做成队列使其串行执行。

注意:并发 != 并行
扩展链接:ZStack--可拓展性秘密武器3:无锁架构

松耦合架构

项目模块化

Intellij中打开ZStack的代码,会发现大多数目录底下都会有一个pom.xml文件,ZStack采用了模块化项目。模块化的好处在工程实践中不言而喻的,比如:

  • 可以在不影响整个系统的情况下替换某个模块

  • 开发者只要专心的在自己的模块中工作即可

  • 减少系统耦合度,提高内聚,减少资源循环依赖,增强系统框架设计

  • ...

http://blog.csdn.net/zstack_org/article/details/53081450

results matching ""

    No results matching ""