当前位置: 首页 > 编程日记 > 正文

整理下.net分布式系统架构的思路

最近看到有部分招聘信息,要求应聘者说一下分布式系统架构的思路。今天早晨正好有些时间,我也把我们实际在.net方面网站架构的演化路线整理一下,只是我自己的一些想法,欢迎大家批评指正。

首先说明的是.net下开源内容较少,并且也不是做并行数据库等基础服务,因此在这里什么Hadoop、Spark、ZooKeeper、dubbo等我们暂不去考虑。

一、最初假设的网站中,我们把应用系统网站、文件和数据库都放在一台服务器上,一台服务器包打天下。

二、随着业务扩展,一台服务器无法满足性能需求,将应用程序、数据库、文件分别部署在不同的服务器上,并根据服务器用途不同,配置不同的硬件,达到性能最佳的效果。

三、随着业务扩展,一台数据库、网站、文件服务器再高性能也无法大量数据处理、高并发用户访问时,必须考虑采用集群方式。

1、应用服务器作为网站的入口,会承担大量的请求,我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。常用的负载均衡技术硬件的有F5,价格比较贵,软件的有LVS、Nginx、HAProxy等。

2、随着用户量的增加,数据库成为最大的瓶颈,改善数据库性能常用的手段是进行读写分离以及分表,读写分离顾名思义就是将数据库分为读库和写库,通过主备功能实现数据同步。分库分表则分为水平切分和垂直切分,水平切换则是对一个数据库特大的表进行拆分,例如订单、物流信息表等。垂直切分则是根据业务不同来切换,如订单、计税等等不同的主题放在不同的数据库中。这种情况下,关联查询是没有的,通过程序可以比较容易的去解决,还有就是采用分布式事务,来保证数据的一致性。我们这里还有一个做法,一个大的数据表拆分为当前操作表和历史记录表, 当前操作表只保留正在操作的数据,完成后转入历史记录表,这样可以提高当前操作数据的效率。

3、用户一天天增加,业务量越来越大,产生的文件越来越多。通常情况下,一个目录下的文件建议不能超过1万个,否则对于文件的查找和轮询都会非常慢,会导致整个系统无法正常运行。我们一般是按照"\应用程序名\模块名称\日期"的目录结构组织的,对于文件数目仍旧很大的应用,应该再细分。当单台的文件服务器已经不能满足需求,就需要分布式的文件系统支撑。常用的分布式文件系统有NFS。我们用的是MS的分布式文件系统(DFS),与AD域相关性较大。

4、因为应用服务器是集群方式,用户前后两次请求可能访问的不是一台服务器。因此已经不能像以前一样使用状态(Application、Session、Cache、ViewState等),应用系统必须是无状态的(当然了,用的负载均衡具有会话保持的时候,一个用户只会定位到一台服务器)。系统的缓存应该保存在专门的缓存服务器上,如果必须有状态,也应该保存在专门的缓存服务器中。作为第一批吃螃蟹者,我们用了微软的AppFabric作为缓存服务器,因为当时版本很低,问题也不少,后来我们弃用了AppFabric,使用Redis作为缓存服务。现在,AppFabric已经改进了不少,运行在Azure云上,应该是不会存在以前的问题了。

中间插一段啊。对于各种政府、单位等不能将系统部署到互联网的部门,并且在各省、市都有对应的分支机构。因为网络专线的价格还是比较高的,至少比互联网的网络带宽低了不少,当然了不差钱的不说啊。这种情况下,一般不采用如上的集中式、集群部署方式,而是采用分布式部署的方式,第一种分布式部署是各分支机构搭建一整套系统,定期(例如每天)进行数据的同步工作,将分支数据汇总到总部、总部的数据下发回各分部;第二种分布式部署方式是各分支部署中间件,但是数据集中在总部。

四、随着业务进一步扩展,应用程序变得非常臃肿,这时我们需要将应用程序进行业务拆分,如我们做的综合业务管理系统分为门户、联系处置、业务信息、指标、数据查询分析等业务板块。每个业务板块是一个独立的应用负责相对独立的业务运作。业务板块之间通过消息队列进行通信来实现。数据库也进行相应的拆分,不同的主题放到不同的数据库中。同时,最好搭建静态资源服务器,将公用的css、js、images等都存放到静态资源服务器中。

五、对于海量数据的查询,我们使用nosql数据库加上搜索引擎可以达到更好的性能。并不是所有的数据都要放在关系型数据中。常用的NOSQL有mongodb和redis,搜索引擎有lucene,我们使用的Solr、ElasticSearch等基于Lucene内核实现的更易用的搜索引擎。数据量大的话,Solr等也要做成集群。

六、再往下走,系统需要与其他系统进行交互,系统也要给各种前端(例如网站、安卓、IOS)提供服务,这样我们就要在逻辑层之上建设应用服务层,提供对客户端的和对外的SOA服务接口。这样又涉及到DTO、WebService、WCF和WebApi(Rest)等概念。但是最重要的是,SOA方式下,包括前面的MQ方式下,事务一致性无法得到保障的,必须采用一定的机制例如事务补偿机制来确保事务的最终一致性。各个业务板块所在的服务器,在不同时段的压力也不同,为了尽量做到服务器集群内各服务器的压力平摊, 还需要提供更好的机制,记录下每个服务器的压力、资源情况、连接数等等,以便将新的请求转向到压力最小的服务器上。

七、业务继续发展,就是CDN,再往下就是搭建几个中心,将系统部署在各个中心,各地用户访问距离他最近的中心,中心间数据保持同步。

八、上面讲了应用系统方面比较多,数据方面也要做许多工作。上面已经介绍了分库分表方式。应用系统做大了,势必有许多的数据资源,尤其是现在大数据这个名词非常火爆的情况下,数据分析和处理是一个系统必须要做的事情。这样做的好处是,将数据的查询、分析等独立出来,不影响正式运行中的系统,另外是通过分析挖掘确实能得到许多意想不到的价值。

这时,主要的工作是搭建数据仓库,然后进行后续的分析和处理。使用ETL/ELT将数据定期从正式环境中导入到数据仓库中,按照不同的主题搭建一个个的数据集市。对于数据量比较小的系统,可以使用关系数据库+多维数据库的方式;对于大型系统,就要使用按列存储、并行数据库等方式了。对于数据的分析可以以报表、KPI、仪表盘驾驶舱等方式提供上层领导决策,也可以使用数据挖掘、机器学习和训练等方式实现价值发现、风险控制等。

九、一般情况下,企业是没有那么大的财力和人员去做上述内容的,因此使用云成为企业的一个选择。无论是Azure、阿里云、亚马逊等都会提供一个个的服务。我们就以阿里云为例,ECS提供虚拟服务器、SLB提供负载均衡、RDS提供数据库服务、OSS提供存储服务、DRDS是分布式数据服务、ODSP(现在改名叫MaxCompute)提供大数据的计算服务、RocketMQ提供MQ、OCS提供分布式缓存服务、以及CDN、OTS、ADS等等就不一一列举了。

对了,现在还有Docker这个利器,无论在企业还是云中都可以使用,我们在自己内部使用的Redis、Memcached、RabbitMQ、Solr等都部署在Docker中,确实比较方便。

上面说了一大堆,其实架构做的再好,还需要底层来实现。目前流行的语言还是面向对象OO的Java、.net等,也就是说还是用OO的思想和理念去编程。抽象、封装、继承、多态尽管很字面上比较容易理解,但是深入的认识确实需要一定的程序量的积累,面向对象的几大原则和设计模式还是编写出更高可扩展、可替换、可配置、可维护等软件质量指标的代码的重要保证。

相关文章:

柔性生态布局未来,小鱼易连 2019“深耕视界逐梦小鱼”北京火爆招募

3 月 21 日,小鱼易连 “深耕视界逐梦小鱼”——2019 春季伙伴招募大会北京站在北京东方美爵酒店成功召开。 小鱼易连联合创始人兼 CEO 袁文辉以“深耕视界逐梦小鱼” 为主题,为到场的四百家合作伙伴和媒体完整展示了小鱼易连全面布局产业互联网&#xf…

perl XML创建XML文件

首先安装XML::Writer,XML::Parser等模块 1.执行/usr/bin/perl -MCPAN -e install "YAML" 安装YAML模块 2.进入CPAN模式,进行下载模块操作 $ sudo perl -MCPAN -e shell 3.在CPAN模式下进行安装,nolock_cpan> install XML::Writer XML::Pars…

开发自己的山寨Android注解框架

目录 开发自己的山寨Android注解框架开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation),但是我想大家可能感觉,虽然理解了也会学会,但是不知道干什么用,那么请继续忍受我这枯燥…

特斯拉起诉小鹏汽车员工窃取商业机密,何小鹏回应

参加 2019 Python开发者日,请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)3 月 21 日,外媒 TheVerge 报道称,特斯拉正针对多名前雇员和自动驾驶汽车公司 Zoox 提起诉讼,涉嫌盗用公司商业机…

【Qt】一个使用QEventLoop时,遇到的教训

1、问题描述 伪代码如下: QEventLoop eventLoop; QObject::connect(this, &Class::signal, [](){doSomething();eventLoop.exit(0); }); emit signal(); eventLoop.exec();在执行eventLoop.exec()时,造成永不退出。 2、原因分析 本打算在&#x…

基于kryo序列化方案的memcached-session-manager多memcached...

为什么80%的码农都做不了架构师&#xff1f;>>> 上次基于Java IO的序列化方案配置了memcached-session-manager&#xff0c;但是性能不好&#xff0c;现在先简单配置成基于kryo的 Xml代码 <Context path"/mobilemail" docBase"D:\webapp\WebR…

Python持续点火,跟进还是观望?

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑Python 这把火&#xff0c;到底烧了多久了&#xff1f;近日&#xff0c;李笑来带着他的 Python 编程书&#xff0c;一路狂收 Star、Fork&#xff0c;火速登顶 GitHub Trending 榜&#xff0c;直接 C 位出道。币圈大佬也玩…

win2d 图片水印

win2d 图片水印 本文告诉大家如何使用 win2d 给图片加上水印。 安装 首先需要使用 Nuget 安装 win2d &#xff0c;安装参见win10 uwp win2d 如果没有更新 dot net core 那么在运行可能会出现下面异常System.TypeLoadException: Requested Windows Runtime type Microsoft.Graph…

【Qt】QtCreator中的单例编程(以ActionManager为例)

1、ActionManager简介 ActionManager类负责注册菜单和菜单项以及键盘快捷键。 ActionManager的公共函数都是静态的,只有使用信号时,才用到单例。 2、ActionManager单例伪代码 头文件中将构造函数和析构函数设置成私有(private),使用instance()函数获取单例 class Acti…

37、C++ Primer 4th笔记,特殊工具与技术,类成员指针

1、成员指针&#xff08;pointer to member&#xff09;包含类的类型以及成员的类型。成员指针只应用于类的非static成员。static类成员不是任何对象的组成部分&#xff0c;所以不需要特殊语法来指向static成员&#xff0c;static成员指针是普通指针。通过指定函数的返回类型&a…

聊一聊javascript执行上下文

跟大家聊聊js的执行上下文 一&#xff0c;相关概念 EC : 执行上下文 ECS : 执行环境栈 VO &#xff1a; 变量对象 AO &#xff1a; 活动对象 scope chain &#xff1a;作用域链 二&#xff0c;执行上下文 javascript运行的代码环境有三种&#xff1a; 全局代码&#xff1a;代码…

【Qt】QtCreator中使用ActionManager类管理标题栏(MunuBar)、菜单(Menu)和菜单中的项目(Action)

1、简介 QtCreator中使用ActionManager类管理标题栏(MunuBar)、菜单(Menu)和菜单中的项目(Action),下面以创建“New”动作为例,介绍ActionManager的使用方法,后续会详细分析ActionManager。 2、创建标题栏(MunuBar) const char MENU_BAR[] = "QtCreator.MenuBar&quo…

和达摩院深度绑定,阿里云下一个十年,成为“云上的阿里巴巴”

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑整理 | 非主流出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2009 &#xff5e; 2019&#xff0c;阿里云已经走过了 10 年时光。在此次的阿里云峰会北京站上&#xff0c;为阿里云的站台的是张建锋。去年 11 月…

如何用TF Object Detection API训练交通信号灯检测神经网络?

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者简介&#xff1a;申泽邦&#xff08;Adam Shan&#xff09;&#xff0c;谷歌认证机器学习专家&#xff08;Google Developer Expert&#xff09;&#xff0c;兰州大学智能驾驶团队技术负责人&#xff0c;硕士在读。文…

iOS progressive Web App (PWA) 技术

随着 iOS 11.3 的发布&#xff0c;iOS PWA 的时代终于来了&#xff01;本文对 iOS 中 PWA 的能力进行了分析&#xff0c;并将其与 iOS 上的 Native App、Android 上的 PWA 进行了深度对比&#xff0c;是值得收藏的一篇好文。 随着 iOS 11.3 的发布&#xff0c;苹果悄悄的支持了…

VS新建类自动添加版本注释

我们开发的时候习惯在代码顶部加上自己的版权说明。 每次拷贝挺麻烦的&#xff0c;上网查了一下&#xff0c;2003的介绍但不少。但08的模板生成方式好像改变了 后来2005的一篇介绍给了我一点提示。原来模板文件放在common7目录下。 主要分为ProjectTemplates和ItemTemplates&am…

【linux】shell中整数运算的加、减、乘、除

1、使用双括号“(( ))” shell中变量实现加法的方法 d $(($d 2)) 例子如下 #!/bin/bash d0 echo "d$d"for((i1;i<10;i)); do d$(($d 2)) echo "d$d" done unset d((i$j$k)) 等价于 iexpr $j $k ((i$j-$k)) 等价于 iexpr $j -$k ((i$…

简单使用PDO

2019独角兽企业重金招聘Python工程师标准>>> 首先基本配置&#xff1a; 连接MYSQL <?php $dsn mysql:hostlocalhost;dbnameworld;; $user user; $password secret; try { $dbh new PDO($dsn, $user, $password); } catch (PDOException $e) { echo Connecti…

一文看懂模糊搜索1.0到3.0的算法迭代历程

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 宋广泽责编 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;前一段时间在Linux上用C语言做了一个信息管理系统&#xff0c;初始版本的搜索就是直接使用了C语言库文件<string.h>里的库函数…

【linux】shell中浮点数运算的加、减、乘、除

bash 不支持浮点运算&#xff0c;如果需要进行浮点运算&#xff0c;需要借助bc,awk 处理。 1、bc #!/bin/bash#加 f$(echo "4.32.5"|bc) echo "4.32.5$f"#减 f$(echo "4.3-2.5"|bc) echo "4.3-2.5$f"#乘 f$(echo "4.30*2.50&qu…

页面加载和解析流程

输入url,浏览器向服务器发出请求&#xff0c;服务器返回html文件&#xff0c;浏览器开始载入html代码&#xff0c;发现head标签有link标签引入外部的css文件&#xff0c;浏览器发出css文件的请求&#xff0c;服务器返回这个css文件&#xff0c;浏览器继续载入body中的代码&…

作为程序员应有10项权利

Scott认为&#xff0c;作为开发人员&#xff0c;应该有权享有以下列表所示的待遇&#xff1b;不过在国内&#xff0c;这个却有点异想天开&#xff0c;能有几个老板愿意给员工如此舒适的环境呢&#xff1f; 1.每位程序员应该拥有一个安静的工作环境 2.每位程序员应该拥有听音乐…

【Qt】QtCreator中自动补全注释

1、简述 在QtCreator中编辑代码,可以自动补全函数注释,供doxygen使用并生成文档。doxygen的使用方法,后续会写一个详细的博文。 2、使用方法 在函数前分别输入“/**”、“/*!”、“//!”、“///”,然后敲击回车键,会自动补全下方函数的注释。 注意:输入的注释一定要紧…

Java内存模型与线程

一、一致性高速缓存的存储交互很好的解决了处理器与内存的速度矛盾&#xff0c;但也存在缓存一致性&#xff08;cache coherence&#xff09;问题二、java内存模型内存模型&#xff1a;对特定的内存或高速缓存进行读写访问的过程抽象。 java内存模型&#xff08;java memory mo…

Google用更少标签生成图像,还提出一个用于训练评估GAN的库

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑译者 | 刘畅责编 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;生成对抗网络&#xff08;GAN&#xff09;是属于一种强有力的深度生成模型。GAN 的主要思想是训练两个神经网络&#xff1a;一个是学习如…

视频用户行为及推荐系统评价KPI-部分

问题 KPI 使用推荐区的用户数量和比率是否显著提升 使用推荐区用户量及其占比与之前进行对比 新老用户使用推荐差异是否明显 新老用户推荐区使用比率占各自类别比&#xff0c;新老用户推荐区产生的VV占各自类别比 推荐区产生的VV占总VV是否显著提升 推荐区VV占总VV占比与…

【linux】用户和组的管理:添加、修改、删除(useradd usermod userdel groupadd groupdel)

一、用户 1、添加 $ useradd -h Usage: useradd [options] LOGINuseradd -Duseradd -D [options]Options:-b, --base-dir BASE_DIR base directory for the home directory of the new account-c, --comment COMMENT 加上备注文字&#xff0c;备注文字保存在pa…

ping命令工具:同时ping多个IP

检测多个ip在同一时间点的响应状态&#xff0c;通过对比来判断哪个ip异常。 下载地址&#xff1a;https://share.weiyun.com/5XCkypG 转载于:https://www.cnblogs.com/leavind/p/8743149.html

顶会论文9篇,又斩获百度奖学金!哈工大NLP“新生代”正崭露头角

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;“Static OnePlus”&#xff1f;首次看到这个网名时&#xff0c;激起了笔者不小的兴趣。正如每个网名背后都有一段不一样的故事&#xff0c;Static …

医院数据中心机房建设资料汇总(31篇)

医疗数据中心包括病人基本数据、入出转数据、电子病历、诊疗数据、医学影像数据、医学管理、经济数据&#xff0c;它们围绕着病人这个中心&#xff0c;成为了医 疗信息的主要来源。医疗数据质量的影响表现在医疗数据的实时、近期和远期应用&#xff0c;首先影响医疗信息系统的日…