开源地址:https://github.com/tangxuehua/enode

上一篇文章,介绍了enode框架的总体目标,以及如何实现高吞吐、低延迟、高可用、无单点问题的实现思路。本篇文章,我们再分析一下其他一些需要考虑的问题。我发现写文章挺累的,费时费脑经,但我会坚持下去。本文主要分析一下enode框架的物理部署:

物理部署思路:集群的web站点+分布式缓存和存储

集群的概念:多台机器做相同的业务,对外如一台机器在做事情一样,集群中任意一台机器挂了没有影响,因为其他机器还在工作;集群的机器要访问的数据的设计,我觉得一般有两种思路:

  1. 集群中每台机器都用自己的数据。数据一致性是通过每台机器之间的数据同步来实现,这样做的主要难题是数据同步的延迟带来的数据不一致的问题;但是好处是,因为没有任何共享数据,所以一台机器挂了完全对整个系统没有任何影响。因为这样的设计相当于是完全同时由很多独立的且没有共享任何数据的机器在同时工作,当然是最能容灾的了;
  2. 有一台机器存放数据的共享数据,集群中每台机器都访问这些共享数据。这种设计的好处是数据不用同步了,没有数据延迟带来数据不一致的问题;但是坏处是,有单点问题,万一共享数据的服务器挂了不是麻烦了。幸好,现在有很多开源的成熟的分布式缓存和分布式存储的产品,如memcached, redis这些都是分布式的缓存,可以有效的避免单点故障的问题,虽然挂了的单台memcached服务器会影响一部分数据的读取和写入,但是至少不会给整个系统带来挂掉的后果;同样分布式存储如mongodb,也能做到这样的效果。这两种产品,在分布式部署方面我还没有任何实际经验,平时工作中也不曾遇到过,所以今后还需要好好的学习和实践。

分布式的概念:一个业务在不同的物理点上做,比如web服务器(处理UI逻辑)、应用服务器(处理业务逻辑),这两个节点分开部署在不同的机器上,共同完成一个业务;分布式的特点是,每个节点都不能挂,否则这个业务就不能完成了;当然,我们可以给分布式中的每个节点都做集群处理,这样可以降低分布式系统的单节点故障; 但是因为分布式要完成一个业务,内部要夸网络通信如调用远程服务,所以性能肯定比没有调用远程服务的设计要低。一般我们不会采用分布式,用分布式都是被逼的,比如以下情况下,我们可能会采用分布式的设计:

  1. 一个系统,有几大块业务,相互比较独立,为了让每块业务都能独立设计和发展,我们会把这些不同的业务模块分开设计与实现;比如一个电子商务网站的交易中心和商品中心,可以独立分开设计;
  2. 数据量太大,没办法存放在一个点,所以只能分开存储;这种情况我们一般会把数据分区,不同分区的数据放在不同的点;如数据库的分库分表,还有一些分布式缓存如memcached、redis,还有如mongodb这样的支持分布式存储的文档型数据库;
  3. 一个系统,不同的层次使用完全不同的技术实现,比如由于历史原因,我们要对一个系统改造,但是这个系统的业务逻辑很复杂,而且都是用c++写的,我们不敢随便动;但是我们希望可以在UI上给这个系统重新设计以带来更好的用户体验,比如原来是用c++写的界面,现在希望通过WPF这种更高级更炫开发维护成本更炫的技术来实现。那么我们就会在同一个系统使用不同的语言和技术来实现。这种情况下,我们可能需要将c++实现的业务逻辑通过远程服务暴露出来,比如通过WCF暴露,WCF远程服务本身可以由c#编写,然后c#调用managed c++,然后managed c++调用unmanaged c++。从而实现业务逻辑的远程服务暴露;而在UI层,我们可以使用c#+WPF的方式来实现,然后UI层调用WCF远程服务。这种架构就是因为一个系统中不同层次因为使用了完全不同的技术而需要使用分布式的情况。

ENode 1.0 - 框架的物理部署思路的更多相关文章

  1. enode框架step by step之框架的物理部署思路

    enode框架step by step之框架的物理部署思路   enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by s ...

  2. ENode 1.0 - 消息队列的设计思路

    开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架内部的整体实现思路,用到了staged event-driven architec ...

  3. ENode 1.0 - 框架的总体目标

    开源地址:https://github.com/tangxuehua/enode 本文想介绍一下enode框架要实现的目标以及部分实现分析思路剖析.总体来说enode框架是一个基于cqrs架构和消息驱 ...

  4. ENode 2.0

    ENode 2.0 - 介绍一下关于ENode中对Command的调度设计 摘要: CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢? ...

  5. ENode 1.0 - Command Service设计思路

    开源地址:https://github.com/tangxuehua/enode 上一篇文章,介绍了enode框架的物理部署思路.本文我们再简单分析一下Command Service的API设计: C ...

  6. ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)

    前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了 ...

  7. ENode 2.0 - 整体架构介绍

    前言 今天是个开心的日子,又是周末,可以轻轻松松的写写文章了.去年,我写了ENode 1.0版本,那时我也写了一个分析系列.经过了大半年的时间,我对第一个版本做了很多架构上的改进,最重要的就是让ENo ...

  8. ENode 1.0 - Staged Event-Driven Architecture思想的运用

    开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架的command service api设计思路.本文介绍一下enode框架对St ...

  9. ENode 1.0 - 整体架构介绍

    前言 今天是个开心的日子,又是周末,可以安心轻松的写写文章了.经过了大概3年的DDD理论积累,以及去年年初的第一个版本的event sourcing框架的开发以及项目实践经验,再通过今年上半年利用业余 ...

随机推荐

  1. iOS通过手势拿到当前的View

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(t ...

  2. Web API - Video File Streaming

    关于C# WEBAPI 视频文件 http://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API- ...

  3. sprintf()函数,把数字转换成字符串

    char str_2[10];     int a=1234321;     sprintf(str_2,"%d",a);

  4. 多个网站使用不同的SSH密钥登陆(zz)

    多个网站使用不同的SSH密钥登陆   1.创建不同的SSH密钥, -t指定加密方法,RSA或DSA:-C注释:-f指定文件名   www.2cto.com   ssh-keygen -t dsa -C ...

  5. freeCodeCamp:Chunky Monkey

    猴子吃香蕉可是掰成好几段来吃哦! 把一个数组arr按照指定的数组大小size分割成若干个数组块. 例如:chunk([1,2,3,4],2)=[[1,2],[3,4]]; chunk([1,2,3,4 ...

  6. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  7. js如何判断手机机型

    <script language="javascript"> window.onload = function () { alert("1"); v ...

  8. 和以往印象不同的Java

    Java编程概述 一个Java源文件至多有一个public类,但是可以有很多class的定义 public static void main (String args[]) public 代表公共的, ...

  9. The Template method pattern

    public class TemplateMethodDemo { public static void main(String[] args) { Teacher test=new Javatrea ...

  10. linux权限管理

    安全上下文:在linux系统中每个进程均以某个用户的身份运行,进程访问资源的权限取决于发起此进程的那个用户的权限 权限应用模型: 1)判断运行此进程的用户是否与被访问的资源的属主相同,如果相同,则运用 ...