常见的网站服务器架构有哪些

常见的网站服务器架构有哪些,第1张

通常,架设网站服务器可以通过一些常见的服务器软件组合来完成,常见的动态网站服务器的“解决方案包”主要有:LAMP(Linux+Apache+MySQL+PHP)、LNMP(Linux+Nginx+MySQL+PHP)、WAMP(Windows+Apache+MySQL+PHP)、BAMP(BSD+Apache+MySQL+PHP)、WIMP(Windows+IIS+MySQL+PHP)、WISA(Windows+IIS+SQLServer+ASP)等等。

通常老板花钱请我们架构网站的时候,会给我们提出一些目标,诸如网站每天要能承受100万PV的访问量等等。这时我们要预算一下大概需要多大的带宽,计算带宽大小主要涉及两个指标(峰值流量和页面大小),我们不妨在计算前先做出必要的假设:

第一:假设峰值流量是平均流量的5倍。

第二:假设每次访问平均的页面大小是100K字节左右。

如果100万PV的访问量在一天内平均分布的话,折合到每秒大约12次访问,如果按平均每次访问页面的大小是100K字节左右计算的话,这12次访问总计大约就是1200K字节,字节的单位是Byte,而带宽的单位是bit,它们之间的关系是1Byte = 8bit,所以1200K Byte大致就相当于9600K bit,也就是9Mbps的样子,实际情况中,我们的网站必须能在峰值流量时保持正常访问,所以按照假设的峰值流量算,真实带宽的需求应该在45Mbps 左右。

当然,这个结论是建立在前面提到的两点假设的基础上,如果你的实际情况和这两点假设有出入,那么结果也会有差别。 先看我们都需要哪些服务器:服务器,页面服务器,数据库服务器,应用服务器,日志服务器等等。

对于访问量大点的网站而言,分离单独的服务器和页面服务器相当必要,我们可以用lighttpd来跑服务器,用apache来跑页面服务器,当然也可以选择别的,甚至,我们可以扩展成很多台服务器和很多台页面服务器,并设置相关域名,如imgdomain和 wwwdomain,页面里的路径都使用绝对路径,如<img src=http://imgdomain/abcgif />,然后设置DNS轮循,达到最初级的负载均衡。当然,服务器多了就不可避免的涉及一个同步的问题,这个可以使用rsync软件来搞定。

数据库服务器是重中之重,因为网站的瓶颈问题十有八九是出在数据库身上。现在一般的中小网站多使用MySQL数据库,不过它的集群功能似乎还没有达到stable的阶段,所以这里不做评价。一般而言,使用MySQL数据库的时候,我们应该搞一个主从(一主多从)结构,主数据库服务器使用innodb表结构,从数据服务器使用myisam表结构,充分发挥它们各自的优势,而且这样的主从结构分离了读写操作,降低了读操作的压力,甚至我们还可以设定一个专门的从服务器做备份服务器,方便备份。不然如果你只有一台主服务器,在大数据量的情况下,mysqldump基本就没戏了,直接拷贝数据文件的话,还得先停止数据库服务再拷贝,否则备份文件会出错。但对于很多网站而言,即使数据库服务仅停止了一秒也是不可接受的。如果你有了一台从数据库服务器,在备份数据的时候,可以先停止服务(slave stop)再备份,再启动服务(slave start)后从服务器会自动从主服务器同步数据,一切都没有影响。但是主从结构也是有致命缺点的,那就是主从结构只是降低了读操作的压力,却不能降低写操作的压力。

为了适应更大的规模,可能只剩下最后这招了:横向/纵向分割数据库。所谓横向分割数据库,就是把不同的表保存到不同的数据库服务器上,比如说 用户表保存在A数据库服务器上,文章表保存在B数据库服务器上,当然这样的分割是有代价的,最基本的就是你没法进行LEFT JOIN之类的操作了。所谓纵向分割数据库,一般是指按照用户标识(user_id)等来划分数据存储的服务器,比如说:我们有5台数据库服务器,那么 “user_id % 5 + 1”等于1的就保存到1号服务器,等于2的就保存到2号服务器,以此类推,纵向分隔的原则有很多种,可以视情况选择。不过和横向分割数据库一样,纵向分割数据库也是有代价的,最基本的就是我们在进行如COUNT, SUM等汇总操作的时候会麻烦很多。综上所述,数据库服务器的解决方案一般视情况往往是一个混合的方案,以其发挥各种方案的优势,有时候还需要借助memcached之类的第三方软件,以便适应更大访问量的要求。

如果有专门的应用服务器来跑PHP脚本是最合适不过的了,那样我们的页面服务器只保存静态页面就可以了,可以给应用服务器设置一些诸如appdomain之类的域名来和页面服务器加以区别。对于应用服务器,我还是更倾向于使用prefork模式的apache,配上必要的xcache之类的PHP缓存软件,加载模块要越少越好,除了mod_rewrite等必要的模块,不必要的东西统统舍弃,尽量减少httpd进程的内存消耗,而那些服务器,页面服务器等静态内容就可以使用lighttpd或者tux来搞,充分发挥各种服务器的特点。

如果条件允许,独立的日志服务器也是必要的,一般小网站的做法都是把页面服务器和日志服务器合二为一了,在凌晨访问量不大的时候cron运行前一天的日志计算,不过如果你使用awstats之类的日志分析软件,对于百万级访问量而言,即使按天归档,也会消耗很多时间和服务器资源去计算,所以分离单独的日志服务器还是有好处的,这样不会影响正式服务器的工作状态。

相比于传统的网络编程方式,事件驱动能够极大的降低资源占用,增大服务接待能力,并提高网络传输效率。 关于本文提及的服务器模型,搜索网络可以查阅到很多的实现代码,所以,本文将不拘泥于源代码的陈列与分析,而侧重模型的介绍和比较。使用 libev 事件驱动库的服务器模型将给出实现代码。 本文涉及到线程/时间图例,只为表明线程在各个 IO 上确实存在阻塞时延,但并不保证时延比例的正确性和 IO 执行先后的正确性;另外,本文所提及到的接口也只是笔者熟悉的 Unix/Linux 接口,并未推荐 Windows 接口,读者可以自行查阅对应的 Windows 接口。 阻塞型的网络编程接口 几乎所有的程序员第一次接触到的网络编程都是从 listen()、send()、recv() 等接口开始的。使用这些接口可以很方便的构建服务器/客户机的模型。 我们假设希望建立一个简单的服务器程序,实现向单个客户机提供类似于“一问一答”的内容服务。 图1 简单的一问一答的服务器/客户机模型 我们注意到,大部分的 socket 接口都是阻塞型的。所谓阻塞型接口是指系统调用(一般是 IO 接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回。 实际上,除非特别指定,几乎所有的 IO 接口(包括 socket 接口)都是阻塞型的。这给网络编程带来了一个很大的问题,如在调用 send() 的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。这给多客户机、多业务逻辑的网络编程带来了挑战。这时,很多程序员可能会选择多线程的方式来解决这个问题。 多线程服务器程序 应对多客户机的网络应用,最简单的解决方式是在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。 具体使用多进程还是多线程,并没有一个特定的模式。传统意义上,进程的开销要远远大于线程,所以,如果需要同时为较多的客户机提供服务,则不推荐使用多进程;如果单个服务执行体需要消耗较多的 CPU 资源,譬如需要进行大规模或长时间的数据运算或文件访问,则进程较为安全。通常,使用 pthread_create () 创建新线程,fork() 创建新进程。 我们假设对上述的服务器/客户机模型,提出更高的要求,即让服务器同时为多个客户机提供一问一答的服务。于是有了如下的模型。 图2 多线程服务器模型 在上述的线程 / 时间图例中,主线程持续等待客户端的连接请求,如果有连接,则创建新线程,并在新线程中提供为前例同样的问答服务。 很多初学者可能不明白为何一个 socket 可以 accept 多次。实际上,socket 的设计者可能特意为多客户机的情况留下了伏笔,让 accept() 能够返回一个新的 socket。下面是 accept 接口的原型:int accept(int s, struct sockaddr addr, socklen_t addrlen); 输入参数 s 是从 socket(),bind() 和 listen() 中沿用下来的 socket 句柄值。执行完 bind() 和 listen() 后,操作系统已经开始在指定的端口处监听所有的连接请求,如果有请求,则将该连接请求加入请求队列。调用 accept() 接口正是从 socket s 的请求队列抽取第一个连接信息,创建一个与 s 同类的新的 socket 返回句柄。新的 socket 句柄即是后续 read() 和 recv() 的输入参数。如果请求队列当前没有请求,则 accept() 将进入阻塞状态直到有请求进入队列。 上述多线程的服务器模型似乎完美的解决了为多个客户机提供问答服务的要求,但其实并不尽然。如果要同时响应成百上千路的连接请求,则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率,而线程与进程本身也更容易进入假死状态。 很多程序员可能会考虑使用“线程池”或“连接池”。“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲的线程重新承担新的执行任务。“连接池”维持连接的缓存池,尽量重用已有的连接、减少创建和关闭连接的频率。这两种技术都可以很好的降低系统开销,都被广泛应用很多大型系统,如 websphere、tomcat 和各种数据库等。 但是,“线程池”和“连接池”技术也只是在一定程度上缓解了频繁调用 IO 接口带来的资源占用。而且,所谓“池”始终有其上限,当请求大大超过上限时,“池”构成的系统对外界的响应并不比没有池的时候效果好多少。所以使用“池”必须考虑其面临的响应规模,并根据响应规模调整“池”的大小。 对应上例中的所面临的可能同时出现的上千甚至上万次的客户端请求,“线程池”或“连接池”或许可以缓解部分压力,但是不能解决所有问题。 总之,多线程模型可以方便高效的解决小规模的服务请求,但面对大规模的服务请求,多线程模型并不是最佳方案。下一章我们将讨论用非阻塞接口来尝试解决这个问题。 使用select() 接口的基于事件驱动的服务器模型 大部分 Unix/Linux 都支持 select 函数,该函数用于探测多个文件句柄的状态变化。下面给出 select 接口的原型: FD_ZERO(int fd, fd_set fds) FD_SET(int fd, fd_set fds) FD_ISSET(int fd, fd_set fds) FD_CLR(int fd, fd_set fds) intselect(int nfds, fd_set readfds, fd_set writefds, fd_set exceptfds, struct timeval timeout) 这里,fd_set 类型可以简单的理解为按 bit 位标记句柄的队列,例如要在某 fd_set 中标记一个值为 16 的句柄,则该 fd_set 的第 16 个 bit 位被标记为 1。具体的置位、验证可使用 FD_SET、FD_ISSET 等宏实现。在 select() 函数中,readfds、writefds 和 exceptfds 同时作为输入参数和输出参数。如果输入的 readfds 标记了 16 号句柄,则 select() 将检测 16 号句柄是否可读。在 select() 返回后,可以通过检查 readfds 有否标记 16 号句柄,来判断该“可读”事件是否发生。另外,用户可以设置 timeout 时间。 下面将重新模拟上例中从多个客户端接收数据的模型。 图4 使用 select() 的接收数据模型 上述模型只是描述了使用 select() 接口同时从多个客户端接收数据的过程;由于 select() 接口可以同时对多个句柄进行读状态、写状态和错误状态的探测,所以可以很容易构建为多个客户端提供独立问答服务的服务器系统。图5 使用select()接口的基于事件驱动的服务器模型 这里需要指出的是,客户端的一个 connect() 操作,将在服务器端激发一个“可读事件”,所以 select() 也能探测来自客户端的 connect() 行为。 上述模型中,最关键的地方是如何动态维护 select() 的三个参数 readfds、writefds 和 exceptfds。作为输入参数,readfds 应该标记所有的需要探测的“可读事件”的句柄,其中永远包括那个探测 connect() 的那个“母”句柄;同时,writefds 和 exceptfds 应该标记所有需要探测的“可写事件”和“错误事件”的句柄 (使用 FD_SET() 标记)。 作为输出参数,readfds、writefds 和 exceptfds 中的保存了 select() 捕捉到的所有事件的句柄值。程序员需要检查的所有的标记位 (使用 FD_ISSET() 检查),以确定到底哪些句柄发生了事件。 上述模型主要模拟的是“一问一答”的服务流程,所以,如果 select() 发现某句柄捕捉到了“可读事件”,服务器程序应及时做 recv() 操作,并根据接收到的数据准备好待发送数据,并将对应的句柄值加入 writefds,准备下一次的“可写事件”的 select() 探测。同样,如果 select() 发现某句柄捕捉到“可写事件”,则程序应及时做 send() 操作,并准备好下一次的“可读事件”探测准备。下图描述的是上述模型中的一个执行周期。 图6 一个执行周期这种模型的特征在于每一个执行周期都会探测一次或一组事件,一个特定的事件会触发某个特定的响应。我们可以将这种模型归类为“事件驱动模型”。 相比其他模型,使用 select() 的事件驱动模型只用单线程(进程)执行,占用资源少,不消耗太多 CPU,同时能够为多客户端提供服务。如果试图建立一个简单的事件驱动的服务器程序,这个模型有一定的参考价值。 但这个模型依旧有着很多问题。 首先,select() 接口并不是实现“事件驱动”的最好选择。因为当需要探测的句柄值较大时,select() 接口本身需要消耗大量时间去轮询各个句柄。很多操作系统提供了更为高效的接口,如 linux 提供了 epoll,BSD 提供了 kqueue,Solaris 提供了 /dev/poll …。如果需要实现更高效的服务器程序,类似 epoll 这样的接口更被推荐。遗憾的是不同的操作系统特供的 epoll 接口有很大差异,所以使用类似于 epoll 的接口实现具有较好跨平台能力的服务器会比较困难。 其次,该模型将事件探测和事件响应夹杂在一起,一旦事件响应的执行体庞大,则对整个模型是灾难性的。如下例,庞大的执行体 1 的将直接导致响应事件 2 的执行体迟迟得不到执行,并在很大程度上降低了事件探测的及时性。 图7 庞大的执行体对使用 select() 的事件驱动模型的影响 幸运的是,有很多高效的事件驱动库可以屏蔽上述的困难,常见的事件驱动库有 libevent 库,还有作为 libevent 替代者的 libev 库。这些库会根据操作系统的特点选择最合适的事件探测接口,并且加入了信号 (signal) 等技术以支持异步响应,这使得这些库成为构建事件驱动模型的不二选择。下章将介绍如何使用 libev 库替换 select 或 epoll 接口,实现高效稳定的服务器模型。 使用事件驱动库libev的服务器模型 Libev 是一种高性能事件循环/事件驱动库。作为 libevent 的替代作品,其第一个版本发布与 2007 年 11 月。Libev 的设计者声称 libev 拥有更快的速度,更小的体积,更多功能等优势,这些优势在很多测评中得到了证明。正因为其良好的性能,很多系统开始使用 libev 库。本章将介绍如何使用 Libev 实现提供问答服务的服务器。 (事实上,现存的事件循环/事件驱动库有很多,作者也无意推荐读者一定使用 libev 库,而只是为了说明事件驱动模型给网络服务器编程带来的便利和好处。大部分的事件驱动库都有着与 libev 库相类似的接口,只要明白大致的原理,即可灵活挑选合适的库。) 与前章的模型类似,libev 同样需要循环探测事件是否产生。Libev 的循环体用 ev_loop 结构来表达,并用 ev_loop( ) 来启动。void ev_loop( ev_loop loop, int flags ) Libev 支持八种事件类型,其中包括 IO 事件。一个 IO 事件用 ev_io 来表征,并用 ev_io_init() 函数来初始化:void ev_io_init(ev_io io, callback, int fd, int events) 初始化内容包括回调函数 callback,被探测的句柄 fd 和需要探测的事件,EV_READ 表“可读事件”,EV_WRITE 表“可写事件”。 现在,用户需要做的仅仅是在合适的时候,将某些 ev_io 从 ev_loop 加入或剔除。一旦加入,下个循环即会检查 ev_io 所指定的事件有否发生;如果该事件被探测到,则 ev_loop 会自动执行 ev_io 的回调函数 callback();如果 ev_io 被注销,则不再检测对应事件。 无论某 ev_loop 启动与否,都可以对其添加或删除一个或多个 ev_io,添加删除的接口是 ev_io_start() 和 ev_io_stop()。void ev_io_start( ev_loop loop, ev_io io ) void ev_io_stop( EV_A_ ) 由此,我们可以容易得出如下的“一问一答”的服务器模型。由于没有考虑服务器端主动终止连接机制,所以各个连接可以维持任意时间,客户端可以自由选择退出时机。 图8 使用libev库的服务器模型 上述模型可以接受任意多个连接,且为各个连接提供完全独立的问答服务。借助 libev 提供的事件循环/事件驱动接口,上述模型有机会具备其他模型不能提供的高效率、低资源占用、稳定性好和编写简单等特点。 由于传统的 web 服务器,ftp 服务器及其他网络应用程序都具有“一问一答”的通讯逻辑,所以上述使用 libev 库的“一问一答”模型对构建类似的服务器程序具有参考价值;另外,对于需要实现远程监视或远程遥控的应用程序,上述模型同样提供了一个可行的实现方案。 总结 本文围绕如何构建一个提供“一问一答”的服务器程序,先后讨论了用阻塞型的 socket 接口实现的模型,使用多线程的模型,使用 select() 接口的基于事件驱动的服务器模型,直到使用 libev 事件驱动库的服务器模型。文章对各种模型的优缺点都做了比较,从比较中得出结论,即使用“事件驱动模型”可以的实现更为高效稳定的服务器程序。文中描述的多种模型可以为读者的网络编程提供参考价值。

大型电子商务网站架构,摘抄7同一个网站的多语言该如何处理是好,使用配置文件然后cookie或url来判别===客户是自己公司,使用标准方法即可

8电子商务网站最多的就是商品的打折方式和积分的赠送了,这里要怎么设计才好(工厂模式)===采购成熟的规则引擎

9如果同一时间并发大量订单的话,如果确保一个订单的有效提交呢

==电子商务一般要使用MQ,推荐IBMMQ;使用MSMQ也可

第一点是数据库要设计好,要达到什么级别,你可能需要考虑哪些表需要拆分,哪些表的核心数据需要冗余,如果是mysql,还要考虑其他的问题,比如存储引擎。

新闻肯定是要生成纯静态页,对数据库压力就小很多,不过静态页也有管理上的不方便,更新删除添加都要对磁盘文件进行操作

做一个自定义缓存层,对缓存逻辑进行控制,可以采用第三方缓存模块,如果使用net来做,可以层层缓存,页面缓存,数据缓存(memcache,不过在win下效率不高)

电子商务网站特点就是对事务的严格,需要数据库设计的时候要求高性能,也需要合适的索引,支持高并发,经常对产品表用户表等进行索引检查,是否有很多索引扫描和表扫描(即使是局部的,也要将“局部”控制到最小范围)

mssql语句对不需要事务的查询要附带上with(nolock),以利于并发更新。

有些功能模块不能按照想当然的方式开发,比如产品访问次数,切不可将这些更新非常频繁的字段置于核心表内,明确的做法是将其剥离开来还有就是切不可经常性将字段设计成bool类型,这样会给以后的扩展留出路,即使是男女这种字段,也建议采用tiny类型

其他还有就是在产品设计的时候充分考虑seo,网站目录结构清晰可读,而不是带着一串串的查询参数。

对安全要有整体的把握,最好全都是用存储过程,在项目上线前将数据库存储过程全部导出再查找貌似exec的语句,查找是否需要替换成sp_executesql。

另外,如果采用mssql,全文搜索直接用mssqlfte就可以,速度和精确度都还是可以的,最重要的是维护和管理开发很简单。

打折的处理可以按照电信的一次,二次批价功能,如果你做过电信方面的系统。

当然也可以设计得更简单的一些。静态的页面建议使用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的地方很少,如果用的话jquery1,一个电子商务网站用户995%的行为时Find

2、对于商品检索部分,能不用数据库就不用数据库(网上切词等相关的开源平台很多)

3、分布式缓存(Memcached、Volecity),个人测试volecity3还是不错的

4、系统设计时必须要考虑可运营。从这个角度去设计系统

5、对于电子商务网站改动很频繁,必须考虑架构设计如何适应频繁的版本更新

6、必须设计一个好的单点登录系统。

7、建议能不用sqlserver就不用它。

8、对于大型电子商务网站来说,系统的I/O是起决定因素而不是CPU和内存。1项目划分是否会有问题,图中分别是实体层,数据访问接口层,数据访问层,业务逻辑接口层,业务逻辑,网站A,B,C

项目划分其实不重要,重要的的是你在写代码的时候是否能把代码合理的分到对应的项目里。

2数据访问层是要开发效率(NBear,Linq,Nh等),还是访问效率(直接使用sql等)是否可以先使用开发效率高的,等日后访问量大了,再重写并替换数据访问层

开发效率优先,访问量大了以后,我相信是有钱投到硬件上的,在你程序写的不是很烂的情况下,升级硬件远比优化程序节省成本。

3网站被切割成了多个子网站,有一些控件(如header,footer)是要共享的,如何跨网站项目共享这些控件呢

那就做成自定义控件啦。

4ms的mvc10也出来不少时间了,是否已经够成熟运用到项目中或者是网站后台使用webform的,前台使用mvc

推荐使用使用webform的,前台使用mvc,对于前台来说使用mvc能更好的提升性能,更方便的更换页面表现形式。后台界面相对稳定,用webform可以提高开发效率。

5网站数据的缓存是自己开发一个hashtable什么的来维护呢,还是使用Memcached

初期建议用hashtable,因为简单,将来升级到Memcached。

6缩略图的处理,我看有的网站是在上传的时候直接生成,有的是在httpmodle里处理,访问的时候生成

直接生成缩略图的好处是节约性能。httpmodle相反,每次浏览的时候都会生成新的,服务器压力大,建议直接生成。

7同一个网站的多语言该如何处理是好,使用配置文件然后cookie或url来判别

多语言建议使用aspnet自带的资源文件的方式实现,当前语言保存在cookie里面。

8电子商务网站最多的就是商品的打折方式和积分的赠送了,这里要怎么设计才好(工厂模式)

规则引擎

9如果同一时间并发大量订单的话,如果确保一个订单的有效提交呢

使用MQ队列

10日志方面,log4net

log4net只能记录程序运行日志,主要目的是用来调试程序的,系统业务操作日志还你是得自己建一个表来保存。

11电子商务的全文检索,这也是个头疼的问题

lucene,微软索引服务,sqlserver全文检索,方案很多的。

12负载均衡方面,有什么好的文章推荐码

可以看windows2003集群方面的文章1项目划分是否会有问题,图中分别是实体层,数据访问接口层,数据访问层,业务逻辑接口层,业务逻辑,网站A,B,C

目前我也是这样分的,不过当数据表结构有修改时,会带动其它层的联级修改,非常不方便,所以开发之前最好将数据库设计地完善一点。另外,当网站分成多个以后,其它项目生成的DLL文件要部署到每个网站的bin文件夹里,更新一次都要重新部署,这也是个挺烦人的事,当然可以将DLL部署到GAC里来解决这个问题,不过这样的话本地调试起来就不太方便了,因为项目一有改动,就要将生成的DLL重新拷贝到GAC里才能看到效果。

2数据访问层是要开发效率(NBear,Linq,Nh等),还是访问效率(直接使用sql等)是否可以先使用开发效率高的,等日后访问量大了,再重写并替换数据访问层

这个我也在考虑。目前我还没有采用ORM框架,都是在DAL里直接访问DB的。

3网站被切割成了多个子网站,有一些控件(如header,footer)是要共享的,如何跨网站项目共享这些控件呢

自定义控件。

4ms的mvc10也出来不少时间了,是否已经够成熟运用到项目中或者是网站后台使用webform的,前台使用mvc

正在学习这一块。

5网站数据的缓存是自己开发一个hashtable什么的来维护呢,还是使用Memcached

现在我用的比较多的是net自带的数据缓存。

6缩略图的处理,我看有的网站是在上传的时候直接生成,有的是在httpmodle里处理,访问的时候生成

直接生成好,快一点。

7同一个网站的多语言该如何处理是好,使用配置文件然后cookie或url来判别

我没涉及到这一块,不过我觉得资源文件应该就是用来处理这个问题的。

8电子商务网站最多的就是商品的打折方式和积分的赠送了,这里要怎么设计才好(工厂模式)

这些都放在逻辑层好了。

9如果同一时间并发大量订单的话,如果确保一个订单的有效提交呢

MSMQ

10日志方面,log4net

目前我是自已写代码存在库里的。

11电子商务的全文检索,这也是个头疼的问题

用lucenenet分词建索引,再直接从索引库里搜索,又快又准。

12负载均衡方面,有什么好的文章推荐码

不清楚了。这样的设计要达到新蛋的效果肯定不可能的,新蛋少说几百台服务器,不同数据库之间的发布订阅链路都有几千条。有复杂的缓存,负载均衡机制。新蛋所有的通讯都是基于WCF的。另外对于这么大型的网站来说,数据库一刻都不停止,所以读写分离也很重要,因为你也不可能让数据库停下来进行备份。总归要做到新蛋这样的大型电子商务网站,靠你上面画的这点好像远远不够。

不过关于公共的header,footer,我不建议做成自定义控件,这个维护起来不方便,稍有变动就要发布dll,麻烦的。

如果你的header和footer不是很大的话,建议采用js+css的方式。然后加上压缩和cdn缓存,应该效率上能接受。

网站架构按照制作步骤分为硬架构和软架构。

一、硬架构

1、机房:在选择机房的时候,根据网站用户的地域分布,可以选择网通、电信等单机房或双机房。

2、带宽:预估网站每天的访问量,根据访问量选择合适的带宽,计算带宽大小主要涉及峰值流量和页面大小两个指标。

3、服务器:选择需要的服务器,如服务器,页面服务器,数据库服务器,应用服务器,日志服务器,对于访问量大点的网站而言,分离单独的服务器和页面服务器相当必要。

二、软架构

1、网站的框架:现在的PHP框架有很多选择,比如:CakePHP,Symfony,Zend Framework,根据创作团队对各个框架熟悉程度选择。

2、逻辑的分层

1)表现层:所有和表现相关的逻辑都应该被纳入表现层的范畴。

2)应用层:主要作用是定义用户可以做什么,并把操作结果反馈给表现层。

3)领域层:包含领域逻辑的层,就是告诉用户具体的操作流程的。

4)持久层:即数据库,保存领域模型保存到数据库,包含网站的架构和逻辑关系等。

扩展资料

网站的分类

1、根据网站所用编程语言分类:例如asp网站、php网站、jsp网站、Asp net网站等;

2、根据网站的用途分类:例如门户网站(综合网站)、行业网站、娱乐网站等;

3、根据网站的功能分类:例如单一网站(企业网站)、多功能网站(网络商城)等等。

4、根据网站的持有者分类:例如个人网站、商业网站、政府网站、教育网站等。

5、根据网站的商业目的分类:营利型网站(行业网站、论坛)、非营利性型网站(企业网站、政府网站、教育网站)。

—网站架构

—网站

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 常见的网站服务器架构有哪些

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情