Ling Zhang Ling Zhang's Blog

Lotus Connections Blog - Feed cache

Lotus Connections 1.0中的Blog实现了两层的缓存机制试图更好的解决性能问题。第一层是Application Server对某些访问频繁数据的缓存;另外一层是在HTTP reverse proxy上,对特定URL资源的本地缓存。缓存对改善性能,尤其是对实时性要求相对较低的Atom feed来说,性能改善的效果更明显。

考虑对数据实时性,Connections Blog缺省关闭了application server的缓存,这样用户在发贴或者回帖后刷新页面立刻可以看到更新,否则从数据写入到reload会有一段时间间隔,容易造成用户困惑。

这里想谈的是HTTP cache。

Blog的典型配置是用DB2数据库,WebSphere appserver,前端是network dispatcher和edge。edge实际是一个HTTP reverse proxy,实现URL转发和内容缓存的功能。 为了实现对Atom feed访问的缓存,Blog会在每个feed的http response的头上面缺省加上max-age=600,response首先到达edge,edge收到后知道需要将该feed缓存600秒。当下次用户通过浏览器、各类feed reader或者是抓虾这样的server端访问的时候,edge首先看feed的10分钟缓存期是否到期,如果还在10分钟内,edge之间把它的cache返回给用户而不再访问appserver;如果已经超过10分钟,edge会向appserver发一个HTTP conditional get的命令,看application server端是不是有新的feed内容。Application server收到feed的请求后,如果有新的feed内容,则向edge返回新feed内容,response code置成200;如果没有更新,则不返回任何内容;response code置成304。无论是否有更新,edge在重新收到appserver的返回后,将重新缓存该feed 10分钟。依次类推。

当在没有edge的情况下, 可以用浏览器来模拟。当在10分钟间隔内,如果在地址栏之间回车的话,浏览器甚至不会与服务器建连(可通过LiveHTTPHeader或者ieHTTPHeaders之类的browser插件观察)。目前Firefox和IE对max-age都可以很好的支持。

在实际情况下,大部分feed源本身并没有类似edge这样的模块,而是直接把appserver暴露给client。从实现上看,很多feed reader对last modified时间戳的管理都很弱,会导致每次都迫使appserver重新加载数据。另外,在server端有些feed server也没有实现对if modified since的管理,无论什么请求都重新进行数据访问,这样都增加了额外的负载。

这是Connections Blog的tech lead Rob在调试feed cache的时候发给我的一篇文章,写的很详细。另外来自IE team的这份A Caching Issue in IE7 Beta 2也很有帮助。

从Feed出发,此类提高性能的缓存方法可以常态的运用在如REST等基于HTTP,以URL来映射资源的应用上,来帮助克服传统Web Server/Web browser多年前已经完美解决了的、而重新在Web 2.0环境下产生的数据生产者和消费者之间产生的老矛盾。

</div>

Read more

Gaim (Pidgin) 2.0

自Gaim商标纠纷后的第一个release。Pidgin可能是目前最好的open source、跨平台多IM集成工具了。它基本替代了我的MSN和GTalk原始程序。虽然Pidgin同时提供了sametime的插件,但如果与刚发布的ST 7.5.1相比,差距很大。所以,对于平时工作生活,Sametime  + Pidgin是我的完美组合。

</p>

Read more

金刚不在

帝国大厦简称ESB,总让我联想到Enterprise Service Bus。

这是在86层往上看到的景象,没有大猩猩。还好,我花了7块钱买了一个Made in China的金刚怀抱ESB的冰箱贴。

</p>

Read more

social computing = collaboration - goal

昨天在Anaheim举行的IBM TLE会议上,有一个非技术性报告,讨论social computing的社会性。我对里面的一个论断很感兴趣,这就是social computing = collaboration - goal。

协作的目的性无须多做解释,写email、发IM消息、打IP phone,没有一个是盲目的活动。socaial computing从个人行为来看,的确没有明确的目的性。比如写一篇博客、添加一个tag、给一个餐馆打分、上传一段录像。如果social computing真的缺乏目的性的,企业social computing,Lotus Connections的意义何在呢?

解释这个矛盾的最好理论基础自然是长尾效应,众多人的随意性产生的合力可以创造明确的价值,而价值引导目标,我更愿意这么解释social computing和它的目的性。

这个公式可以稍做修改:social computing = collaboration/goal。这会是个有争议的公式,但它很有趣,很social。

</p>

Read more

一天一行

过去的两天,我只写了两行代码。

这两行代码分别解决了Lotus Connections Blog中的两个bug,平均一行代码耗时10小时。

其中一个Blog编辑器中的bug,是通过几十次的blog发贴,用Venkman的Firefox JavaScript Debugger抓到的,该错误源自Firefox和Dojo自身的缺陷。因为一天中发测试贴太多,现在在自己博客发贴也有点心理障碍了。

另外一个是Blog的Theme切换问题,为此还动用了Filemon这样的工具,监测javaw.exe对文件系统的修改,在追踪到数据库文件被修改后,进而跟踪DB表变化,加上Eclipse debugger,最后才确信需要把else后面那个"}"提前一行。

在involve到Lotus Connections的开发后,最大的一个变化居然是自己发贴、看social bookmark的兴趣降低了- 搞伤了,就像我现在看到早餐的炒蛋和薯角一样,刚闻到味儿,就半饱了。

Read more

Abdera - Atom格式和发布的Java实现

Apache Abdera是实现对Atom格式解析,发布(APP, Atom Publishing Protocol)的Java类库,IBM最早参与并提供了代码。Abdera之前,ROME是另外一个重要的Atom实现(身在java.net,贴的是Apache license)。这篇文章里谈到了Abdera和ROME的渊源,我在上面、还有这里看到了一些熟悉的名字。

Lotus Connections 1.0里的Blog,同时使用了Abdera和ROME类库。

最近Apache的新闻很多,比如Harmany和JCK,杨普这篇文章是了解这次公开信事件的最佳入门教材。

Read more

输入法事件 - 能淡化时且淡化

Google输入法的事情,好像让很多人兴奋,漫长的等待终于抓到了小辫子。这事儿对于中国软件业,不是件好事,出于私心,我个人希望尽可能淡化这些事件,防止别有用心的人借机过度炒作高科技研发/外包的知识产权问题。

两年前在一本国外IT杂志上,登了一张照片,在毕博上海研发中心办公室里挂着保护知识产权的标语 - 作为高科技投资中国最重要的影响因素之一,所有人的眼睛都在盯着IP。3月份在北京举行的LISA国际会议,专门请了国内的IP专家给老外们介绍国内知识产权的保护情况。吃中饭的时候,我旁边坐的是微软中国负责Microsoft Live的CTO,他说的话我觉得挺有道理,“中国人会去买盗版DVD并不意味着工作的时候会偷公司的代码,这是两回事”(当然,意识需要加强)。

今天我订阅的feeds似乎已经隐隐显现了苗头(下图),评论家们终于又有专栏可写,稿酬可拿了。我预测在未来1个月内,至少有1篇有关高科技外包IP问题的cover story会出现在报纸、杂志上。

在IBM,每个developer都要签署知识产权保护声明,并参加开放源代码及知识产权的相关课程并完成认证。

希望这块石头溅起的浪能渐渐平静。

Read more