InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

超越轮询?考虑PubSub、Push和MOM

作者 Gavin Terrill 译者 胡键 发布于 2008年8月1日

领域
语言 & 开发,
架构 & 设计,
运维 & 基础架构,
企业架构
主题
数据访问 ,
消息传送 ,
性能和可伸缩性 ,
SOA ,
架构
标签
AMQP ,
XMPP

OSCON '08大会上,Evan 'Rabble' Henshaw-PlathKellan Elliott-McCrea介绍了《超越REST?使用XMPP PubSub构建数据服务》。Robert Kaye对该幻灯片的报道如下:

Kellan谈到了FriendFeed,它是一个让使用者知道他们的朋友共享了新项目的网站。在这个例子中,Kellan指出:为了给45000名使用者检查更新,FriendFeed向Flickr轮询了290万次。而且在这45000名使用者中,在任意时刻只有6700名处于已登录状态。这当然是一种蹩脚的内容更新检查方式。Kellan说道:“轮询太逊了!”

解决这个问题的关键在于将标准REST Web服务抛在脑后,找出一种使用消息传递的方式,它是一种通知使用者内容变更的直接通信方式。

在这个上下文中,轮询意味着使用一种RESTful Web服务来为每个使用者获得(GET)更新。与之相反,PubSub(Publish/Subscribe,发布/订阅)是一种使用异步消息传递协议的架构性方法,其中发布者和任何订阅者都是解耦的。在需要向大量客户端发送更新通知的场合下,这些特征使得PubSub成为一种合适的可伸缩性选择。

在这个幻灯片中,Evan和Rabble描述了Jabber(一种基于XMPP[Extensible Messaging and Presence Protocol,可扩展消息传递和现场协议]的PubSub服务)的各种优势:

  1. XMPP工作在持久化连接之上
  2. 它是有状态的(SSL变得便宜)
  3. 被设计成为一个事件流协议
  4. 联邦和异步的天性
  5. 内置身份认证、安全和现场(presence)
  6. 为此构建和部署了Jabber服务器

该幻灯片引起了巨大反响。Kirk Wylie认为AMQP这样的基于MOM(Mesage Oriented Middleware,面向消息的中间件)的系统才是这儿真正需要的,而Joshua Schacter(del.icio.us创始人)也加入了论战的行列,并指出了一种更简单的方法。这个方法使用基于HTTP回调的技术:

简而言之,与频繁地轮询不同,客户端可以发送一个包含欲订阅资源(resouce)和交付更新的端点(endpoint)的普通HTTP请求到: http://your.app/subscribe?resource=/some/user&callback=http://my.app/endpoint

这样推断,端点当且仅当资源更新时才会收到RSS条目片断。出于安全考虑,交换要包含某种令牌,它可向合适的协议借鉴。订阅将在一段时间后失效,比方说,24小时,或将其作为一个参数传入。

评论者指出,这种系统早就存在了:Webhooks

Rabble提供了他关于使用回调的思考

那么,这里有两个问题,我们曾经考虑加入一页幻灯片来讨论ping back系统。显然,能够进行ping back/web hook似乎是个好模式,但也可能是反模式?

可以预见,创建一个大规模web hook系统,你将面临聚合器(aggregator)/爬行器(crawler)问题。使用XMPP绝对可行。这样,我们不仅实现了联邦功能,而且有着更好的接口。我们还有潜力可在其之上增加一些代理认证(auth)功能。

诸如Webhooks这类方法潜在地要比使用Jabber/XMPP简单得多,但是Blaine Cook认为这种复杂性是说得通的:

如果我们声称只需10行PHP脚本就可让系统可用,那么这一过程只能得到一个实现拙劣的输出消息队列。在中等规模(10000使用者,每人有50个联系人,1/5离线,每天2个帖子)情况下,你会看到每秒有2.3个远程HTTP请求,这种方法倒也并非一无是处。

尽管使用PubSub进行通知是一个优秀的架构方法,但是很多人对幻灯片的标题存有疑问。Dare Obasanjo对此概括得非常好,指出REST并非一个“金锤”(译注:比喻,意指手拿锤子,看到任何东西都是钉子。):

[因而],这个例子并非是指REST象Evan和Kellan的讲演标题暗示的那样不能进行伸缩,而是一个使用错误工具解决问题的例子。选择它的原因在于它碰巧能在其他场合很好的工作。

即使没有其他内容,这次讨论也突现了这一事实,考虑API消费者的使用模式在确定合适设计的过程中扮演了举重轻重的角色。

查看英文原文Beyond Polling? Consider PubSub, Push and MOM

译者 胡键 热心开源技术,《开源技术选型手册》作者,《SOA实践指南》译者。目前致力于Groovy/Grails的研究和推广。

深度内容

专访Jeffery Richter:Windows 8是微软的重中之重

Jeffery Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffery Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视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

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。

解析JDK 7的动态类型语言支持

随着JDK 7的发布,字节码指令集终于迎来了第一位新成员——invokedynamic指令。这条新增加的指令是JDK 7实现“动态类型语言(Dynamically Typed Language)”支持而进行的改进之一,也是为JDK 8可以顺利实现Lambda表达式做技术准备。在这篇文章中,我们将去了解JDK 7这项新特性的出现前因后果和它的意义。