什么样的架构才算是好的架构?

KMSFan 发布于 2016/02/01 17:50
阅读 6K+
收藏 8

RT,就这么简单,有谁能够回答这个问题吗?

    我就拿个例子说吧,一个小网站如何在不改变大框架的情况下,用最短的时间,最高的效率,能够成为一个大网站?我如果把每次的网站发展里程碑说成是一个Level,那么假设这个网站有10个Level,这10个LEVEL都是线性增长的,并且每次增长都是前面的2,3倍,怎么才能在10次更新中,尽量少的破坏网站的原有框架的完整性,进而增加新的功能和抗压能力?

    其实我还是很困惑的,我看了一些架构的书,书中都写得有实例,但是我觉得和实际结合起来还是有难度的,尤其是什么时候用什么模式,虽然我不想为了模式而做网站,但是真的很多东西不知道怎么用比较合适,最近在看GoF的设计模式一书,很多东西不太明白。

    现实中的例子,我就拿一个自己不太明白的例子来说吧,如果我要给一张表增加一个字段有2种方式,第一种就是直接添加一列,第二种方式就是把表的字段放在一个配置表的表中,但是这2种方式我觉得都不完美,第一种会破坏数据的完整性,第二种则会增加查询的负担,我想问下除了这2种方式,还有没有其他的更好的方式?

    PS:再举一个例子,如果一个网站有1亿的用户,这1亿的用户存在一张叫做User的表里面,它还有一个子表,这个子表的数据量和User表的比例是100:1,并且更加令人不安的事情是,每年这张表的数据量还在以150%的增量增加,最终导致的结果就是数据库顶不住了,因为再好的数据库,也有它的容量极限,这个时候我们就要拆表,动态扩容(当然这也是必须的,否则顶不住了),我现在手里有2个方案,一个是跨表,一个是跨库,但是这2种手段都会造成查询的效率问题,并且如果数据量再加的话,只能通过增加服务器的硬件容量来做。我是想问下,从算法上,从设计模式上,该怎么优化,才是比较合理的解决方式呢?

    总结起来就是:变化的需求+合理的设计模式+合理的算法=好的架构,但是怎么才能做到呢?

以下是话题补充:

@KMSFan:PS:当我抛开书以后,想自己设计网站的架构,总是感觉力不从心,主要有下面几点:1.脑子浆糊了,因为见过的模式太多了,不知道哪个地方用哪个模式。2。不知道怎么把需求和架构,代码结合起来,这点可能我自己做的项目太少了吧,3.如何做一个扩展性高的网站,怎么架构才好,我总感觉人不可能什么方面都想到,就像下五子棋? (2016/02/01 18:08)
加载中
5
sss6666
sss6666
我建议你先别考虑架构上事情,我觉得架构往往不是设计出来的,而是进化出来的。先保证功能严谨并且相对有效率。当你碰到或预见到系统的瓶颈的时候,然后再反过来思考,重新规划。
头号大宝贝
头号大宝贝
所以,要设计一个易于进化的架构。如可扩展,松耦合etc..
L
Laerf
赞同,架构是由业务来推动的,不可能一下子就弄出来一个架构.这是一个慢慢推进的过程
bigTreee
bigTreee
赞,进化!
3
自由之信
自由之信
我的建议是, do one thing and do it well, 从一个点开始做起,然后做的过程中去思考和应对问题,大致上一下子想好所有的东西是不实际的,需要在实践中来考虑均衡,简单的说,如果有一个项目给你,然后坐在那里想把其所有的设计和细节都构思出来再动手,我觉得是不实际的,不如按照现有的知识大致构思之后,然后一步步把问题提出来,再一步步的解决出现的问题好一点。
LongRaindy
LongRaindy
太同意了,先从某个点出发,慢慢再统揽全局。
KMSFan
KMSFan
好的,谢谢。
2
阳光test
阳光test

      个人认为,没有什么最好的架构,只有适合的架构,任何架构都没办法脱离你自己的业务,所以我认为适合你自己业务的架构就是好的架构。

      举个简单例子:

      当10w级别及其以下的uv时,可能你只需要:一台机器+1DB+LVS,session通过机器路由,机器抗不牢了就加硬件scale up;

      当100w级别时,可能你需要:三台机器+DB(one master multi slave) + LVS, session 通过机器路由;

     当1000w级别时,可能你需要:十台机器+ Cache + DB(one master multi slave) + LVS + nginx + 自己的session解决方案等等;

     当亿级时,可能你需要考虑怎么样scale out,比如:将一个应用切换为多个应用、DB的分库分表(甚至于多机房)、业务的异步化等等。当然不可避免的,这也带来了架构的复杂性。

    我这里只是随便举个例子而已,大家不必对号入座哈,真实的百万级、千万级、亿级的架构都远比我说的复杂。当你的业务真的已经足够复杂,而你现有的架构真的没办法支撑的时候,你和你的团队自然会想办法去扩展,去改造的,而那必然也是一个及其痛苦的过程,不可能是小修小补就可以的。

     

1
当朝宰相
当朝宰相
可横向扩展 可纵向扩展, 每个组件都是松耦合,并且高可用加冗余性
sss6666
sss6666
回复 @KMSFan : 比如使用dubbo或者hessian,每一个功能都有可能是一个服务,甚至子系统,最上层做一组聚合服务给app提供接口。这样假如某个功能访问量或者延迟很高,就可以不断的水平拓展这个服务
KMSFan
KMSFan
额,有什么好办法可以做到这点吗?
1
ericsoul
ericsoul
感觉楼主的实际经验还没有到,谈架构的时候(我没说我到了)。当你看不懂书的时候,说明你工作中涉及到,没接触到,所以你无法理解这么做的原因和优劣。
1
ntsai
ntsai

你造过 web 框架 就能明白很多架构上的事情了  - -

0
你是错的我恒对
你是错的我恒对

一台机器肯定不行,整合起来众多机器不就ok了

如何整合就是架构了吧

0
elson1024
elson1024
1.如果我要给一张表增加一个字段有2种方式。。。。。

    请考虑使用mongodb,互相网就是各种的不确定性,今天加一个属性,明天加一个属性,mongodb就是最佳选择,要不就老实按照GoF的设计模式。都是些经典设计,不过貌似你扯的都是些数据哪方面的
2.如果一个网站有1亿的用户,这1亿的。。。。。
    打开https://www.aliyun.com/support/video?spm=5176.1941704.201.196.V6u8YJ这个,点击“云数据库 RDS
总结:玩转各种大,各种云,等数据,除了要求你是“正规部队”出身外,还要求你有好运气生活在一个好的环境,比如一出生就是生活在阿里,谷歌等地方,可遇而不可求,需要时间培养,所以去睡觉吧,不要想太多了,大过年的

0
仓禾

----开始补坑-------

首先我肯定不是那种牛的不要不要的人,所以我回复只为学习探讨,不为喷口水。

什么样才能算比较好的架构?目前我没有能力给出完善的答案,在我的经验中,总结有两点:一是符合团队技术能力,二是符合团队当前需求。

第一个是因为我当年走过的坑,我是工作接近三年的时候才转向Java,当时Java也就刚入门水平,为了模块化显得高大上,选用了OSGi,但当时的团队实际上没有能力驾驭,导致整体框架推导重来。并不是技术上说好的就是好的。

第二个更重要,需求决定了你目前需要的框架,如果你用户只有几千人,非要考虑分布式负载均衡缓存什么的,那工作的性价比就太低了。设计框架实际上只要满足你当前的需求,预判未来某段时间内的需求,根据这个需求设计合适的框架就可以了。

通用的一些方法:分层、模块化,这两个比较常用,基本是必须要考虑的,MVC、总线、统一API,基于接口编程等。

先说这么多,要工作了,回头再补充。

xd2008ck
xd2008ck
其他的还听过,总线是个什么鬼
爱吃烤红薯
爱吃烤红薯
赞,说的很好
0
总长
总长

一点想法。

我认为好的构架是高效,可扩展,可维护,成本低吧。所有条件都达到根本不可能,总要有所取舍。如何取舍:1、从业务上分析。2、从技术上分析。3、从目前掌握的资源分析。

设计模式我也在看。有机会多交流吧。



返回顶部
顶部