大规模视频网站的计费与流量管理
本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011。
该内容已经被标记书签!
标记书签错误,请重试!

作者 Anthony Elder, Raymond Feng, Simon Laws, Haleh Mahbod & Simon Nash 译者 马国耀 发布于 2009年8月25日
这篇文章节选自《Apache Tuscany in Action》,它介绍了如何使用绑定进行组件服务连接的配置。
SCA最重要的特征之一是对交互协议的广泛支持。如果你的服务要同Web服务、JMS、CORBA或者REST交互的话,通过SCA和Tuscany就可以轻松做到。如果因为特定应用的需要,服务使用特殊的或私有的协议进行通讯的话,SCA也没有问题。甚至,你的业务逻辑根本不需要知道交互协议是什么,(没错,你已经猜对了)协议的选择是通过对组件的配置实现的。这太酷了,不是吗?而SCA绑定就是让这一切成为可能的“魔力”。
在这篇文章中,我们将了解如何在服务以及引用上使用绑定;此外,如果没有配置绑定话,意味着什么;最后,我们还要去看看SCA的域,去了解如何在SCA域内和域外运用绑定。
你可以在服务以及引用上配置绑定。为服务设定一个绑定意味着人们可以通过由该绑定所指定的交互协议来访问这个服务。而服务的实现不需要做任何特别的改变来促成这个目标,你要做的仅仅是为服务增加一条绑定配置。
例如,如果要让Bookings服务以Web服务的方式暴露出来,那么组件的定义看起来就应该是这样的:
<component name="TripBooking">
<implementation.java class="com.tuscanyscatours.TripBooking" />
<service name="Bookings">
<binding.ws uri="http://tuscanyscatours.com:8085/Bookings" />
</service>
</component>
我们通过增加<binding.ws>元素告诉SCA运行时,Bookings服务要以Web服务的形式暴露出来,使用SOAP/HTTP的 方式,并且以uri属性中指定的值作为服务的端点(endpoint)。这就是要创建Web服务我们要做的全部事情,无需学习JAX-WS或者在 Bookings服务的实现上做文章。
可以为一个服务配置多个绑定。如果既要通过JMS访问又要通过Web服务方式来访问Bookings服务,则只需要增加另一条绑定。请看下面的例子:
<component name="TripBooking">
<implementation.java class="com.tuscanyscatours.TripBooking" />
<service name="Bookings">
<binding.ws uri="http://tuscanyscatours.com:8085/Bookings" />
<binding.jms />
</service>
</component>
这个定义让Bookings服务同时以JMS的方式暴露出来,并且使用了缺省配置。同样,我们不需要去学习JMS的API或修改服务的实现代码。
绑定还将SCA和Tuscany与更广阔的外部世界联系起来!Bookings服务是以SCA实现,运行在Tuscany中的。由于使用绑定对这个服务进行了配置,它可以被以非SCA方式实现的客户端或运行在Tuscany中的客户端调用。对于Bookings的Web服务调用,客户端可以是任何语言编写的,运行在任何遵循WS-I的Web服务运行时上的程序;同样,对于JMS方式的调用,客户端可以直接使用任何JMS提供者所提供的JMS API,只要该JMS提供者与Tuscany中配置的JMS绑定对应的JMS提供者兼容即可。
现在我们已经看到如何通过在SCA的服务上配置绑定让服务以标准的交互协议向外提供服务。同样,绑定也可以用于SCA引用上,让其通过标准的交互协议去调 用外部服务。这种情况下角色正好倒置:客户端由SCA实现,而服务端使用标准的交互协议。例如,服务提供者可能是一个支持SOAP/HTTP的Web服务 端点,也有可能是一个以RMI-IIOP方式交互的EJB(session bean)。与Web服务交互时,SCA引用使用<binding.ws>绑定;而调用EJB时,它使 用<binding.ejb>绑定。
图1显示了如何在组件的服务以及引用上配置绑定。

图1:Bookings服务配置了Web服务和JMS的绑定,“cars”引用配置了Web服务绑定,“flights”引用配置的是EJB绑定。
列表1中的示例代码显示的是图1中描绘的TripBooking组件对应的组件定义文件。
列表1 为组件的服务和引用配置绑定和连线
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://tuscanyscatours.com/"
name="bookings">
<component name="TripBooking">
<implementation.java class="com.tuscanyscatours.TripBooking" />
<service name="Bookings">
<binding.ws uri="http://tuscanyscatours.com:8085/Bookings" />
<binding.jms />
</service>
<reference name="cars">
<binding.ws uri="http://tuscanycars.com:8081/Cars" />
</reference>
<reference name="flights">
<binding.ejb uri="corbaname:rir:#flight/FlightProviderHome" />
</reference>
<reference name="hotels" target="HotelProvider" />
</component>
</composite>
你可能已经发现列表1中有两个引用(cars和flights)配置了绑定而没有target属性,这是因为该绑定元素已经提供了引用的目标端点信息,同时还指定了所使用的交互协议。
至此,我们已经了解如何在服务和引用上使用绑定。在下一节中,我们要看看如果在服务和引用的配置中不指定绑定将会发生什么?
在列表1中我们为“hotels”引用没有设置绑定,这意味着它有一个隐含的.sca绑定(经常被称为缺省绑定)。缺省绑定用于连接SCA服务和SCA引用,把交互技术的选择工作交给部署服务和引用的SCA运行时,而其他的绑定(如WS绑定和JMS绑定)则要选择具体的交互协议或API,从而让SCA服务或引用可以与非SCA的程序进行交互。正因为如此,非缺省的绑定通常被称为可互操作的绑定。
Tuscany使用基于SOAP/HTTP的Web服务实现缺省绑定的远程调用;其他的SCA运行时可能使用不同的标准协议,如RMI/IIOP,它们也 可以使用某种私有协议。将来,Tuscany的缺省绑定的通讯协议也可以从Web服务转向其他的协议,因此,Tuscany的应用程序不应该想当然地假设 使用缺省绑定就意味着使用Web服务。应用程序若要使用Web服务在组件之间交互的话,为保险起见,还是应该要指定使 用<binding.ws>绑定。
缺省绑定只能用于连接位于同一个SCA域中的服务和引用,而当连接跨越域边界时,应该要为其指定某个可互操作的绑定。域在SCA中是一个重要的概念,我们将在第四章详细介绍域的概念,不过在下一个节中我们先简单介绍一下什么是域以及它与绑定和连线的关系。
SCA域是一个SCA组件的部署和管理边界,比如,一个域可能是单个应用服务器或一个服务器集群,也可以是一组服务器或一组集群。而一个完整的域通常只运行某一家提供商的SCA实现。
任何SCA组件都是SCA域的一部分;同一域中的服务和引用可以通过连线进行连接;对于同一域中的服务和引用之间的连接,可以使用缺省绑定,因为SCA保证了缺省绑定的实现在域中的一致性。相反,对于域内到域外的交互,不能使用连线进行连接,而应该使用可互操作的绑定。
在第2章我们已经介绍了TuscanySCATours公司,下面我们将通过该公司的一个场景来描述域的使用。现在,这个公司已经壮大,并且设立了一个独 立的部门提供专门的hotel booking(酒店预订)服务。这个服务不仅要服务于TuscanySCATours的trip booking(行程预订)服务,还要直接服务于只需预订酒店的客户。公司的两个部门使用不同的域管理他们所提供的服务:TuscanySCATours 域提供原先的trip booking(行程预订)服务,而TuscanySCAHotels域提供新的hotel booking(酒店预订)服务,如图二所示:

图2中有两个SCA域及多个组件,展示了组件是如何连接的,连线(实线)用于连接同一域中的组件,而 绑定(带箭头的虚线)用于连接跨域的组件。
图2中用实线表示连接组件的SCA连线,而用带箭头的虚线表示用可互操作的绑定配置的连接。我们先来看看TuscanySCATours域中 TripBooking组件的3个引用。首先,flights(航班)引用连到一个实现flights预定的Web 服务,因为这个服务不是SCA服务,所以flights引用通过可互操作的绑定<binding.ws>和flights预订服务的URI进 行配置。
其次,“hotels”引用指向了TuscanySCAHotels域中的由HotelProvider这个组件所提供的Hotels服务。由于连线不能 跨越域的界限,所以这样的服务和引用都要使用<binding.ws>和服务端点URI进行配置。最后,“cars”引用连到了 TuscanySCATours域中的由CarProvider组件提供的Cars服务,因为这对引用和服务位于同一个域中,所以我们可以使用连线以及缺 省绑定连接它们。“Cars”服务没有对外暴露,也不需要和外部的非SCA程序交互,所以没有必要为其配置可互操作绑定。
接下来,看看TuscanySCAHotels域中由HotelProvider组件周围的连线。除了来自TripBooking组件的“hotels” 引用连到它之外,还有来自HotelBooker(非SCA的酒店预订客户端程序)和TuscanySCAHotels域内的HotelOffers组件 的“hotels”引用。由于“Hotels”服务配置了客户操作的绑定类型——<binding.ws>,所以HotelBooker客户 端软件可以使用任何Web服务程序调用“Hotels”服务。HotelOffers和HotelProvider之间的连接使用SCA连线的原因是这些 组件处于同一域中。这个连线既可以使用缺省绑定也可以使用该服务提供的可互操作binding.ws绑定,在本例中,我们使用binding.ws,目的 是为了说明同一域中的连线也并不一定要使用缺省绑定。
了解图2中所描述的场景在组件配置文件中是如何配置是很有必要的。列表2给出了位于TuscanySCATours域中的组件的定义。
列表2 TuscanySCATours域中组件的组件定义文件
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://tuscanyscatours.com/"
name="toursdomain">
<component name="TripBooking">
<implementation.java class="com.tuscanyscatours.TripBooking" />
<reference name="flights">
<binding.ws uri="http://flightbookingservice.com:8084/Flights" />
</reference>
<reference name="hotels">
<binding.ws uri="http://tuscanyscahotels.com:8083/Hotels" />
</reference>
<reference name="cars" target="CarProvider/Cars" />
</component>
<component name="CarProvider">
<implementation.java class="com.tuscanyscatours.CarProvider" />
</component>
</composite>
列表3给出了TuscanySCAHotels域中组件的组件定义文件:
列表3 TuscanySCAHotels域的组件定义文件
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://tuscanyscahotels.com/"
name="hotelsdomain">
<component name="HotelProvider">
<implementation.java
class="com.tuscanyscahotels.Hotels" />
<service name="Hotels">
<binding.ws uri="http://tuscanyscahotels.com:8083/Hotels" />
</service>
</component>
<component name="HotelOffers">
<implementation.java class="com.tuscanyscahotels.HotelOffers" />
<reference name="hotels"
target="HotelProvider/Hotels" >
<binding.ws/> 1
</reference>
</component>
</composite>
1 此处的引用使用binding.ws进行配置
为HotelOffers的“hotels”引用指定引用绑定是有必要的,如果没有,它就可能被设定成默认的binding.sca绑定,而这样会导致错误,因为它(“hotels”引用)的目标服务的配置中没有提供binding.sca方式的绑定。
图2中的例子展示了引用以及服务的大多数连接方式。不过,对于同一个域中的SCA服务和SCA引用,除了使用SCA连线之外,也可以使用一对匹配的绑定进行连接。很多Tuscany的例子就是这么做的,这样很容易展示如何为客户端和服务端配置匹配的绑定。
我们已经描述了SCA服务和引用连接的若干种选择,这里简要做一个总结。在同一个域中连接引用和服务,你可以:
连接不在同一域中的SCA引用和服务,你可以:
将引用或服务连接到非SCA程序,你可以:
可互操作绑定使SCA程序能够与非SCA程序交互,也支持不同提供商的SCA程序跨域的交互。而缺省绑定的好处是在互操作不是必须的情况下,提供商可以提供更优质的交互能力。
若了解源代码,示例章节,作者的论坛以及其他资源,请访问http://www.manning.com/laws。
这篇文章节选自"Apache Tuscany in Action",它介绍了如何使用绑定进行组件服务连接的配置
若从manning.com购买这本书,InfoQ的读者可以获得25%的折扣,请使用这个折扣码:"infoq25"
查看英文原文:Communication Flexibility Using Bindings。
感谢胡键对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。
本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011。
Jeffery Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffery Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。
云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。
淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011。
2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。
12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011。
篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011。
本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。
没有回复
关注此讨论 回复