首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

网络扩展

Scaling the Network

在大型应用程序中,网络往往是比较容易扩展的部分,因为网络技术和协议的定义原本就考虑到了扩展因素。常见的网络技术,比如千兆位以太网提供如此多的带宽,除非你手中的工作极为特殊,否则Web应用程序永远也不会耗尽所有带宽。胡乱投递大量数据还是可能耗尽网络带宽的,但如果这些流量发生在同一交换网络中的两个节点之间,就不会影响到其他部分的网络性能。

一个简单的交换网络能够支持很多的机器。通过串联这些交换机,我们可以支持数千台主机,思科Catalyst 6500系列能在一个独立的20单元的底盘上支持超过550个千兆位以太网端口。超出上述规模时,添加聚集交换机或者路由器能进一步增长你的网络,可以支持数万台主机。为了冗余,可以环状连接或者网状连接路由器,并且使用不同的生成树协议

(思科的按VLAN的生成树(PVST)、快速生成树协议(RSTP)和多业务协议传输(MSTP))来避免流量陷入无限循环。

单一的大型网络未必适用于所有的应用程序。无论如何,如果你的应用程序持续生成定量的非关键数据流,并且偶然性的爆发产生大量重要数据,你总希望非常重要的数据能够通过网络。以太网可没有作QoS保证,所以不能把两种流量都倾泄在同一个以太网段。如果把网络分成两个不同的子网,就能分流不同种类的流量,一个网络只需要负责处理关键性数据的爆发。

高端交换机支持创建VLANs(虚拟局域网),能够任意地把该设备划分到多个不同的网络,这些网络互不重叠。因此,要创建两个子网,不需要购买一个额外的设备(假定有足够的空闲端口),而只需要简单地将一半的端口用于一个网络,另一半则用于另一个网络。对于和两个网络都需要交流的机器,只需要连接第二块网卡到第二个网络,并且给它两个IP地址。主机上的这个过程称为multihoming。

如果你需要发送极大量的数据,那么千兆位以太网并不是最快的高速数据交换方式(甚至万兆位以太网也不是,如果它会出现的话)。高容量专用交流通道,比如InfiniBand,能够以更快的速度在两台主机之间移动数据。InfiniBand能以高达100GB的速度进行数据传输(4倍速率的12倍速链接),并且能够无缝执行RDMA在远程机器上使用内存,就好像那台机器在本地一样。

扩展PHP

Scaling PHP

PHP逐渐被大家认可为一种严肃的语言,但还是有很多人声称它是不可扩展的。这显然不是事实——很多互联网上的最大的网络应用就使用PHP。PHP是能扩展的,原因得回溯到什么是真正的扩展。对PHP的批评往往集中在根本的性能问题上,而被误解为是扩展方面的问题,但我们已经知道这是两回事。

那么,PHP如何满足可扩展系统的三个标准呢?第三个标准,可维护性,很容易理解。任何语言都可以写出容易的或者难以维护的代码。虽然有些语言让它们自己能写出及其难以维护的代码(Perl,在一定程度上,C语言也可以),但几乎没有语言是难以写出可维护代码的(专为这个目的设计的语言除外,比如Intercal或者Malbolge)。通过遵循严格的代码、风格指导原则和在代码中广为添加正确的注释,PHP系统可以很容易维护。

数据集的增长是可扩展系统的第二个标准。在PHP应用中,数据存储和处理是完全分离的。我们完全不用去管有多少数据存储在数据库中——不管多少数据,都采用完全相同的

方式进行查询。PHP把数据集增长的责任下放到了存储层,这样就能随心所欲地进行扩展,而不用担心数据集的大小。

最后一个可扩展标准是能容纳流量增长。PHP通过Rasmus Leardorf(PHP创建者)所描述的无共享体系结构实现这一点。PHP像HTTP一样,是无状态的,所有的状态都由更低层次处理。PHP进程每次只响应一个请求,并且不能和服务于其他请求的进程通话。进程也无法在请求之间记住任何事。这种做法有效地隔离各个请求到独立空间中,在请求或进程之间不共享任何信息。如果需要取出上次请求的用户数据,并将它显示在下一请求中,那么就得使用底层的数据存储追踪这些数据。由于这种进程和请求间的分离,对于后续请求,实际上就没有必要使用同一服务器进行服务。要处理更多请求,只需要简单地添加更多Web服务器。它们都可以同时服务请求,并且进程之间没有任何共享数据。用户的首次请求由某台机器服务,下一次则由另一台提供服务,依此类推。如果可以控制流量走向,避免它们流向僵死状态的机器,那么这种分离也为无缝的故障转移提供了条件。当然这并非PHP独有的,它是REST的基础原则之一。通过正确的系统设计,这个原则就可以得以应用,而不在于具体的实现语言。

但不管怎么说,有些情况下确实需要状态共享。PHP中有几个扩展是无法做到无状态的,而且对于同一个用户,不能随意更改相应的服务器。sessions扩展存放用户会话数据到本地磁盘,这要求同一用户的每个请求都访问同一台Web服务器。要避免这种情况,可以使用msession扩展,它使用中央网络守护进程存放会话数据,或者自己手工存放会话数据,使用数据库或者内存缓存来实现。有些PHP扩展让PHP进程可以映射一块共享内存用于IPC。由于进程并不一定在同一台机器上,IPC实际是不可行的。作为替代方案,可以将这些行为交给下面的层次,在数据库或者内存缓存中存放共享数据。

提示:在有些应用程序中,可以避免将状态存放在服务器端,因为没有这个需求,或者因为它们可以存放在客户端。对于能容忍破坏的状态设置,可以存放在cookie中,或通过URL传递。对于需要避免损坏的设置,比如认证信息,可以在cookie或URL中存放签名的或者加密的数据,以免每次页面请求都需要访问数据存储。

如果不使用一些特定的扩展,那么PHP可以满足建立可扩展系统的三个标准:容纳流量增长、允许数据集的增长,并且能创建可维护的系统。

当然,PHP不是唯一可以创建可扩展系统的语言。Perl、Python和Ruby,出于和PHP同

样的原因,都是很好的候选——它们是无状态的,把扩展的责任交给存储层,它们能够创建可维护的代码。其他的语言和技术,比如常用的J2EE,也能满足相同的标准,虽然在大型应用程序中,一般要避免在语言层共享数据和状态持久化。任何合理的语言都能够建立可扩展的系统。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论