分类归档: Web

Http 1.1 Etag 与 Last-Modified

在 Blog 盛行的今天,一些 Web 应用需要解析大量的 RSS Feed .如何提高效率是个非常重要的问题.在 MagpieRSS 的 Features 中列举了这样的一条: HTTP Conditional GETs
Save bandwidth and speed up download times with intelligent use of Last-Modified and ETag.. 这里的 Etag 引起了我的注意.

什么是 Etag ?

通过阅读 RFC 2616 ,得到了对 Etag 的一点印象:

The ETag response-header field provides the current value of the entity tag for the requested variant……Entity tags are normally “strong validators,” but the protocol provides a mechanism to tag an entity tag as “weak.” One can think of a strong validator as one that changes whenever the bits of an entity changes, while a weak value changes whenever the meaning of an entity changes. Alternatively, one can think of a strong validator as part of an identifier for a specific entity,
while a weak validator is part of an identifier for a set of semantically equivalent entities.

从上我们可以大致得知,Entity tags 本质上说是一种”强校验器”,但是 HTTP 协议提供了一种通过给 Entity tags 打标签的”弱”的机制(类似于内容的校验码).虽然这段话后面通过两种方式进行了解释,但是还是有些晦涩.我看了这段话之后只是得出了 Etag 的 “E” 代表 “Entity” 而已.

Magpie 首页上提到了一篇文章: HTTP Conditional Get for RSS Hackers ,拜读之后清晰了许多.要先说说 HTTP Conditional GETs 的基本原理,很简单,就是说,从 Web 服务器取数据的时候,如果文件变化了,给我新的文件,如果文件没有变化,只需告诉客户端没有变化即可,不必再把文件取回来.这样就可节省大量的网络带宽和资源.

Etag 与 Last-Modified 是从 HTTP 1.0 到 HTTP 1.1 才有的概念.当我们从 Web 服务器获取文件的时候,只需要读取 HTTP 响应头的 Etag 与 Last-Modified 字段即可,这两个字段里面的具体内容是什么可以不管(可能会千奇百怪,RFC 2616 对 Etag 没有具体值的定义),把这两个值 Cache 在本地,下次检查文件是否更新的时候比对这两个值即可.如果没有变化,服务器的响应代码不是 HTTP 200 (OK) , 而是 304.

http.304.png

如上图.目前 OpenRSS 虽然订阅了40 多个 Feed,但是响应速度很不错.在使用 Gregarius 的过程中(Lilina 也应用了 ETag),发现了 FeedBurnrer 烧录的 Feed ,几乎都是用了 Etag 的(否则估计服务器要瘫痪,Hoho).我们再测试一下 HTTP header 的响应情况:

$ curl -I http://feeds.feedburner.com/dbanotes
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2005 11:34:15 GMT
Server: Apache
Last-Modified: Tue, 25 Oct 2005 04:30:12 GMT
ETag: U4q478bDKLqZ8UMMC8A5afZuHug
Content-Type: text/xml;charset=utf-8
$ curl -I http://feeds.feedburner.com/dbanotes
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2005 11:34:21 GMT
Server: Apache
Last-Modified: Tue, 25 Oct 2005 04:30:12 GMT 
ETag: U4q478bDKLqZ8UMMC8A5afZuHug
Content-Type: text/xml;charset=utf-8

在这个期间,我的 Blog 没有更新.所以 Last-Modified 和 ETag 返回的都是相同的值.这样 Gregarius 就不必重新解析了. 国内的 GreatNews 是支持 HTTP Conditional GETs 的,更棒的是还支持 gzip/deflate encoding.而另一个 RSS 阅读工具 POPU (周博通) 就不知道了.

以上是我的笔记,如有理解错误,请指正!

EOF

测试 OpenRSS.net 在几个搜索引擎的情况

因为 Gregarius 的 URL_REWRITE 做的不错.OpenRSS.net 也算上线了几天了.好奇心起,看看在各个搜索引擎的收录情况.从访问日志上看,各个搜索引擎的机器人都有光顾.尤其以 Yahoo Slurp 和 百度的 BaiDuSpider 最为频繁.这两家的爬虫居然各自有几千次.Google 的 Googlebot 光顾的次数比较少.每天大约 5/6 次而已. MSNBot 光顾的还要再少一些.

从搜索的结果上看,用 site:www.openrss.net 搜索百度,居然有 540 个站内页面可以找到. 搜索Google,只有孤零零的一个结果,而 MSN 的爬虫虽然来的次数少,但是还是有效率,可以找到 31 项. Yahoo! Search 呢? 用 domain:www.openrss.net 查询,结果为零.不过从一搜那里倒是可以找到一个.

2005/10/27Update:现在在一搜中的结果已经到了 470个.Google 还是 1. 在 Search.yahoo.com 中也出现了 9 条记录.百度1090 .不过 一搜 的窜升速度太快了.相信不久就可以超过百度.从这边爬虫的来访频度来看,也是一搜越来越频繁.

继续阅读

Gregarius , Ajaxed Online Rss Reader

第一次注意到 Gregarius 是在 Lilina 的论坛里面. 看到 Gragarius 之后,就想抛掉 Lilina 以及 Ajax-ed Lilina. 因为 本身存在的一些问题没办法解决,不得不放弃.从一个普通用户的角度上看,Lilina 存在的主要问题有:

  • RSS 抓取速度太慢.尽管可以利用 Wget 工具在后台构建一个静态页面.但是 Lilina 订阅的种子数量还是不能太多.否则光解析就是灾难.
  • RSS Feed 不能分类.所有的 RSS 都放到一起.看起来有点杂乱无章.
  • 不支持数据库.
  • 开发进度缓慢,基本上已经停止开发.也就是说出现问题能够得到的支持非常的少.

另外一个功能类似的 Feedonfeeds ,结构太松散了.而对比之下, Gregarius 的功能似乎让人惊讶. 我比较关注的几点如下:

  • AJAX 能够带来更好的用户体验. 支持 AJAX 化的 Tag定制功能
  • Supports themes and plugins 带来了良好的扩展性.
  • Search in your feeds 具备查找功能 .
  • 良好的 url_rewrite 设计.
  • 支持 MySQL 和 SQLite

对 Gregarius 分析了几天之后,接着利用了几天的休息时间,把 Gregarius 在 OpenRSS.net 上搭建了起来.部署应该是个很简单的事情,但是因为是虚拟主机,遇到了很多问题.还好,大部分都已经解决.涉及到的问题大致有如下几个:

继续阅读

把 Feedburner 作为 Blog Proxy 来用

很多朋友是 FeedBurner 的忠实用户,把自己的 Blog ,图片书签等交给 FeedBurner 统一烧制成一个 Feed .其实,FeedBurner 也可以用来做 Blog 代理, BlogSpot 上的很多内容由于某种原因,国内都是不可以访问的,但是可以直接用 FeedBurner 烧制 Feed,这样间接的转一下,就可以看到大部分的 Blog 内容.

比如,Oracle 公司专家 Thomas Kyte 的 Blog ,就可以直接把 URL 交给 FeedBurner 烧制,可以自动探测出 Feed .

这样有的时候只能看到 Blog 的一部分.所以如果作者的 Blog “量给的足”,不是只有摘要(Excerpt)或者链接.这个在 OpenRSS.net 上当我抓取 Official Google Blog 的 Blog 的时候很有体会.一次给足是个不错的习惯.期待 FeedBurner 以后能够推出可以抓取 Blog 全文的服务.毕竟这不是难事.

继续阅读