
2、架构设计:B/S架构重点考虑服务器并发访问、资源分配和性能调整,C/S架构充分利用客户端资源
3、开发难度:B/S架构 大于 C/S架构
4、维护修改难度:B/S架构 小于C/S架构
5、可移植性、功能变更可伸缩性:B/S架构 比 C/S架构 容易很多
随着开发者的熟练程度以及开发工具的不断完善,两者差异越来越小了
在架构设计:文件服务的设计与实现一文中,通过实现一个文件服务来梳理了一个架构设计的一般流程,并得到如下静态架构图
本文继续聊聊文件服务中的子模块:「存储模块」的设计,包括:
前面的架构没有对存储进行特别设计,直接使用了本地存储。考虑到后期文件数量可能会越来越多,本地存储可能无法支撑,且本地存储的安全性也没有保障。为了便于后期扩展,需要对「存储」部分进行设计。
存储的方式有很多,本地存储、NAS、分布式存储,为了能支持不同的存储方式,需要对「存储模块」进行抽象。考虑到「存储模块」涉及到IO,是一个相对底层的模块。「上传」这个核心模块不能依赖于具体的存储,所以这里也需要对其进行依赖反转。
见紫色部分,UploadService调用了FileInfoRepository来存储FileInfo,而FileInfoRepository是个接口,具体实现由存储模块中的实现类来实现。
我们先看本地存储。最简单的实现,就是直接使用IO将文件写到对应的目录下就可以了。但是,本地存储会有如下几个问题:
下面我们针对上面的问题,来一个个的解决。
首先,对于多租户来说,在我们的架构中,实际对应的是Group,我们按照Group的不同,来划分目录即可。即 不同的租户有不同的文件根目录 ,后期某个租户迁移时,直接迁移对应目录即可。这也稍微解决了单目录文件数量多的问题。
对于单目录下,随着文件数量的增加导致访问速度下降的问题,我们该如何解决呢?
如果你做过分布式系统,那么想一想, 我们是否可以把单目录看成是一个服务器,访问目录下的文件看成是一个个的请求呢 ?如果可以,那解决单目录下访问速度慢的问题是不是就变成了「如何解决单服务器下,负载过高」的问题了?那解决服务端负载过高的方法是否适用于解决目录访问速度下降的问题呢?
我们从下面几个方面来分析一下:
首先来看「解决服务端负载过高的方法」!答案很明显: 分流+负载均衡 !
分布式服务的负载均衡有几种方式呢?
再来看「目录访问和服务器的区别」,虽然可以把目录看成服务器,但是两者还是有区别的:
也就是说,对于目录来说,我们不需要考虑创建成本。
那么针对服务器负载高的解决方案是否适合目录访问呢?或者哪种方式适合目录访问呢?我们一个个来分析:
可以看到,主要的问题就是创建目录的问题!如何保证在目录数量改变时,不需要调整程序呢?
实际上git已经给出了答案:
也就是说,根据sha1散列的前两位对文件进行归类。这样既解决了目录创建问题,也解决了文件分布问题。可能的问题是,「sha1散列2^80次,可能会发生一次碰撞」。这个问题对于一般文件系统来说,好像也没有担心的必要。
解决了「单目录文件过多,导致访问速度下降」的问题,我们来看下一个问题: 数据安全 。
文件数据是存放在电脑磁盘上的,如果硬盘损坏,可能导致文件的丢失。这实际还是一个「单点问题」!
「单点问题」的解决方案是什么呢? 冗余 啊!
最简单的方案就是定时去备份数据,可以有如下几种方案:
我们继续一个个的讨论。
首先是 人工备份 ,这是最low的方案,当然也是最简单的,即有人定期去备份就行了。问题是时效性不高,例如一天备份一次,如果磁盘在备份前坏了,那就会丢失一天的数据。同时恢复比较耗时,需要人工处理。
第二个方案是 代码实现 ,即在上传文件时,程序就自动备份。以上面的架构为例,可以添加一个BackupListener,当上传完成后,通过事件,自动备份上传的文件。同时下载时需要判定文件是否完整,如果有问题则使用备份数据。此方案时效性得到了保障,但是将数据备份和业务放到了一起,且需要编码实现,增加了业务代码量。
第三个方案是 libfuse ,libfuse是用户态文件系统接口。下面是libfuse官方简介:
简单来说,就是可以用libfuse构建一个用户态文件系统。之前在老东家做了一个日志分析平台,日志的收集就使用了libfuse,大致架构如下:
业务系统写日志到挂载的用户态文件系统中,用户态文件系统自动转发到了后续的处理中间件:redis、消息队列、文件系统。
在这里也可以用类似的功能,即在文件上传后,用户态文件系统自动备份。此方案解耦了文件备案逻辑与业务逻辑。
最后一个方案是 RAID ,即廉价冗余磁盘阵列。RAID不但可备份文件,还支持并发读写,提高上传下载速率。
常用的RAID有:RAID0,RAID1,RAID01/RAID10,RAID5和RAID6等。我们来看看这几种RAID的特点,以及是否适用于我们的文件服务。你会发现从RAID0到RAID6,又是一个从单点到分布式的过程。
看下面的两张图应该能更好的理解:
无论是RAID10还是RAID01,对磁盘的使用效率都不高。那如何提高磁盘使用率呢?就有了RAID3。
对于本地存储来说,RAID是个相对实用的解决方案,既能提高数据安全、快速扩容,也提高了读写速率。但是无论扩展多少磁盘,容量还是相对有限,吞吐也相对有限,同时由于其还是单点,如果文件服务本身挂掉,就会导致单点故障。所以就有了分布式文件系统。
分布式文件系统下次单独讨论!
最后打个广告,帮朋友开的专栏《零基础Unity3D 游戏 开发》,适合没有基础、想从事 游戏 开发的小白!朋友从事 游戏 多年,开发了多款 游戏 ,收了30多个徒弟,技术杠杠的!
宝德服务器常用的架构是x86架构,这也是目前最为普及的服务器架构之一。x86架构是一种基于英特尔x86微处理器或其兼容微处理器的处理器架构,它广泛用于个人计算机和服务器等领域,因为它价格低廉、性能稳定、易于维护和升级。此外,宝德服务器还支持RISC架构,例如ARM架构,以满足不同客户的需求。RISC架构是一种精简指令集计算机的处理器架构,其设计的目标是提高处理器性能和降低功耗。在数据中心和云计算等领域,ARM架构的服务器也越来越受到关注和应用。大型电子商务网站架构,摘抄 7同一个网站的多语言该如何处理是好,使用配置文件然后cookie或url来判别===客户是自己公司,使用标准方法即可
8电子商务网站最多的就是 商品的打折方式和积分的赠送了,这里要怎么设计才好(工厂模式)===采购成熟的规则引擎
9如果同一时间并发大量订单的话,如果确保一个订单的有效提交呢
==电子商务一般要使用MQ,推荐IBM MQ;使用MSMQ也可
第一点是数据库要设计好,要达到什么级别,你可能需要考虑哪些表需要拆分,哪些表的核心数据需要冗余,如果是mysql,还要考虑其他的问题,比如存储引擎。
新闻肯定是要生成纯静态页,对数据库压力就小很多,不过静态页也有管理上的不方便,更新删除添加都要对磁盘文件进行 *** 作
做一个自定义缓存层,对缓存逻辑进行控制,可以采用第三方缓存模块,如果使用net来做,可以层层缓存,页面缓存,数据缓存(memcache,不过在win下效率不高)
电子商务网站特点就是对事务的严格,需要数据库设计的时候要求高性能,也需要合适的索引,支持高并发,经常对产品表用户表等进行索引检查,是否有很多索引扫描和表扫描(即使是局部的,也要将逗局部地控制到最小范围)
mssql语句对不需要事务的查询要附带上with(nolock),以利于并发更新。
有些功能模块不能按照想当然的方式开发,比如产品访问次数,切不可将这些更新非常频繁的字段置于核心表内,明确的做法是将其剥离开来 还有就是切不可经常性将字段设计成bool类型,这样会给以后的扩展留出路,即使是男女这种字段,也建议采用tiny类型
其他还有就是在产品设计的时候充分考虑seo,网站目录结构清晰可读,而不是带着一串串的查询参数。
对安全要有整体的把握,最好全都是用存储过程,在项目上线前将数据库存储过程全部导出再查找貌似exec的语句,查找是否需要替换成sp_executesql。
另外,如果采用mssql,全文搜索直接用mssql fte就可以,速度和精确度都还是可以的,最重要的是维护和管理开发很简单。
打折的处理可以按照电信的一次,二次批价功能,如果你做过电信方面的系统。
当然也可以设计得更简单的一些。 静态的页面建议使用CDN加速,以解决网通和电信之间访问速度的问题;
数据的缓存方面建议考虑用memcache,另外也可以分别在表现层和数据层利用net中的现存缓存机制作业可;
简单执行的sql可以不用存储过程,存储过程会占用数据库服务器的处理时间,造成死锁;
mvc建议还是做些CMS的项目上应用,电子商城不是很适合,个人观点。url上可以做转义,使url显示更友好;
数据库建议建立分布数据库,这样可以转移查询和大访问量对数据库带来压力;
可以考虑单独放在一台服务器上;1三层架构
2使用手写sql,手写entity(生成也可),缓存反射绑定(不是缓存数据哦,缓存映射关系),要考虑网站的长期发展还是手写吧 灵活 性能也好
3没有这种问题,商业驱动的,纯购物就好了,千万别搞什么圈子,wiki
4纯net的mvc不建议,webform不搞viewstate,不搞服务端控件(除repeater)再加点mvc的思想已足够用了
5不需要缓存数据(除搜索产品部分),要考虑多台服务器的程序快速部署,config文件会很多,config要序列化缓存
6当然是先生成好了,参照jd吧,按业务每张对应几个不同大小的图
7据经验,电子商务网站仅靠中英双语来达到多语言是不靠谱的(文化 用户习惯不是简单的语言切换),如果想真正运营英语的就要重新开发一个版本
8不搞模式
9负载均衡(web,db)+ssb异步处理数据
10你是业务类型的日志还是异常日志 前台订单流程上异常日志不需要了,找个工具录个脚本不停的跑 保证随时发现问题发邮件就可以了
11找第三方搜索组件 类似endeca的
12负载均衡挺简单的,初期靠软件就可以,一切找第三方放cdn,前台网站用到ajax的地方很少,如果用的话jquery 1,一个电子商务网站用户995%的行为时Find
2、对于商品检索部分,能不用数据库就不用数据库(网上切词等相关的开源平台很多)
3、分布式缓存(Memcached 、Volecity),个人测试volecity 3还是不错的
4、系统设计时必须要考虑可运营。从这个角度去设计系统
5、对于电子商务网站改动很频繁,必须考虑架构设计如何适应频繁的版本更新
6、必须设计一个好的单点登录系统。
7、建议能不用sqlserver就不用它。
8、对于大型电子商务网站来说,系统的I/O是起决定因素而不是CPU和内存。1项目划分是否会有问题,图中分别是 实体层,数据访问接口层,数据访问层,业务逻辑接口层,业务逻辑,网站A,B,C
项目划分其实不重要,重要的的是你在写代码的时候是否能把代码合理的分到对应的项目里。
2数据访问层是要开发效率(NBear,Linq,Nh等),还是访问效率(直接使用sql等)是否可以先使用开发效率高的,等日后访问量大了,再重写并替换数据访问层
开发效率优先,访问量大了以后,我相信是有钱投到硬件上的,在你程序写的不是很烂的情况下,升级硬件远比优化程序节省成本。
3网站被切割成了多个子网站,有一些控件(如header,footer)是要共享的,如何跨网站项目共享这些控件呢
那就做成自定义控件啦。
4ms的mvc 10也出来不少时间了,是否已经够成熟运用到项目中或者是网站后台使用webform的,前台使用mvc
推荐使用使用webform的,前台使用mvc,对于前台来说使用mvc能更好的提升性能,更方便的更换页面表现形式。后台界面相对稳定,用webform可以提高开发效率。
5网站数据的缓存是自己开发一个hashtable什么的来维护呢,还是使用Memcached
初期建议用hashtable,因为简单,将来升级到Memcached 。
6缩略图的处理,我看有的网站是在上传的时候直接生成,有的是在>刀片服务器和多节点服务是两种不同的服务器架构设计。
刀片服务器(Blade Server)是一种将多个独立服务器集成在一个机架内的方式,每个服务器都被称为一个“刀片”。刀片服务器具有高密度、高效能、易于维护的特点。刀片服务器通过共享后备资源来节省空间,并且可以根据需求进行扩容和缩小规模。刀片服务器可以满足高性能计算、虚拟化等要求,常用于数据中心、云计算等场景。
多节点服务则是指将一个应用程序分布在多个节点(服务器)上运行,每个节点都可以处理请求并提供服务。多节点服务通常使用负载均衡技术来分发请求,提高系统的可用性和可扩展性。多节点服务通常用于大型网站、分布式数据库、分布式存储等场景。
因此,刀片服务器和多节点服务是两种不同的服务器架构,刀片服务器注重高密度、高效能、易于维护,而多节点服务注重系统的可用性和可扩展性。选择哪种架构应该根据实际应用场景和需求来决定。单台服务器
这个是最简单的服务器部署方法,SharePoint 2010 所有的服务和SQL服务器都安装在一台服务器上。
两台服务器
在这种部署情景下,SharePoint 2010 所有的功能都单独装在一台服务器上,而把SQL 服务器独立出去。
三台服务器
当有三台服务器时就可以将SharePoint 2010服务器设计成高可靠性的解决方案,即采用NLB的架构的形式。
四台服务器
当有4台或以上的服务器时,就可以同时考虑性能和高可靠性。可以将Web前端服务器和查询服务器进行负载均衡,并与其他的应用服务分离部署。但是当只有4台服务器时,把其他的应用服务单独部署在一台服务器上并不是一个好的方法,因为这台服务器不具备高可靠性,当这台服务器崩溃时,整个应用服务就会垮掉。
服务器组
当服务器再网上增加时,可以考虑服务器组的概念。服务器组就是将SharePoint中类似逻辑概念的服务应用程序一起部署在同一组硬件上。这意味着随着每个层需求的增加,你可以为之添加额外的服务器进行支持。同时,这种方式还可以隔离不同服务对整体性能的影响,从而保证整体系统运行的性能。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)