将使用Ruby on Rails或Django等标准Web框架构建的大型Web应用程序拆分成小块并将它们分布在大量服务器上的最佳方法是什么?如果我们考虑在RESTful服务和service-oriented design或体系结构中进行分区,那么可以使用Paul Dix在他的书“使用Ruby on Rails进行面向服务的设计”中命名的方法之一:
是否更喜欢在逻辑功能和业务逻辑上进行分区,在读/写频率上进行分区,还是在最小化连接和数据库访问时进行分区?另一种可能的选择是不同的内容类型:ID,(社交)图形,地图,文件,图像等。例如,通常在Amazon S3上存储图像或使用Google Maps获取地图。什么是最佳实践?
答案 0 :(得分:2)
也许值得一看互联网巨头。亚马逊和eBay以面向服务的方式而闻名。这些互联网巨头将一切都划分为服务。
<强>易趣强>: Randy Shoup解释了eBay上构建大型网站的一些最佳实践,例如关于eBay's Architectural Principles和相应article about lessons from eBay的演示文稿。易趣分区一切。每个问题都可以通过数据,负载和/或使用模式分为多个维度的可管理块。两种基本分区模式是(1)功能分割和(2)水平分割,数据库和应用层首先按功能分段,第二层水平分割。 Randy说功能分割和功能分解是最重要的方法,相关的功能部分属于一体,而不相关的功能部分则属于不同。 Paul Dix在他的书中也说过:“通常,你想根据逻辑功能对服务进行分区”。 ebay's architecture有大约200组功能,也就是“应用”。在16,000个应用程序服务器上运行的应用程序层在ebay's architecture中划分为220个单独的应用程序池(销售,搜索,查看项目,出价,结帐等)。 ebay数据库层在400个主机上拥有超过一千个不同的逻辑数据库,其中数据库被分段为功能区域。 ebay编写了自己的ORM层,称为数据访问层(DAL),它负责数据库拆分。
<强>亚马逊强>: 在亚马逊,一切都在服务上。面向服务的体系结构(SOA)是亚马逊技术的基础构建抽象。 Amazon.com architecture不仅分为服务,甚至亚马逊的开发人员也围绕服务组织。亚马逊实际上是一个由许多内部初创企业组成的生态系统,它们拥有自己的数据和自己的API。这里的服务由一小组开发人员操作和拥有。 Amazon.com platform由数百种服务组成,从原始的低级基础服务(存储,计算,排队等)到聚合的高级服务,如身份管理,内容生成和服务。发现产品和优惠管理,订单处理,付款或履行&amp;客户服务。要为访问Amazon.com的客户构建产品详细信息页面,该软件会调用200到300个服务,为该客户提供高度个性化的体验。
Twitter 使用与不同内容类型,ID,图表,网址等对应的服务。它使用Snowflake进行ID生成。 Snowflake是用于生成高规模使用的唯一ID号的网络服务。 Twitter使用FlockDB作为社交图形存储。 FlockDB是一个分布式图形数据库,用于存储Twitter使用的邻接列表。它使用SpiderDuck作为URL提取器。 SpiderDuck实时获取Tweets中共享的所有URL,解析下载的内容以提取感兴趣的元数据,并使该元数据可供其他Twitter服务在几秒钟内使用。