百度空间 | 百度首页 
 
查看文章
 
利用memcache协议来服务器间通讯,即作为comet input channel
2008-02-22 14:44
comet http server是一个非常简单的服务器,它只是一个通道管理器,把application server需要发送的信息送到browser。application server通常在别的服务器,可能采用任何语言任何操作系统开发。他们之间必须选择一种方式通讯。如果是同一种语言通讯就比较简单,但是异构系统通常要用web service等方法来实现,比较低效。memcache协议是一种更高效的方式,同时具有各种语言的client library。

图示如下,是一个share nothing的架构,comet server之间不需要通讯
(这个图是 orbited.org 作者画的,他实现了一个python的comet方案)

至于memcache协议层的server实现就可以找现成的,比如用memcached的code修改。前不久刚好下载了sina开发的memcachedb,封装得也很好,就一个memcachedb.c文件。只要把自己用C实现的comet http server,基于libevent的源代码合并进去即可。当然它里面的bdb部分也不需要了,可以全部删掉。因为只需要他的协议处理部分。

修改部分的Source code
/* add function for send to comet */
void notify_comet(char *key, char *str) {
int nudge = atoi(key);
if (requests[nudge] != NULL) {
evbuffer_add_printf(bufs[nudge], "Oops, from memcache: %s!\r\n", str);
evhttp_send_reply_chunk(requests[nudge], bufs[nudge]);
}
}

/*
* we get here after reading the value in set/add/replace commands. The command
* has been stored in c->item_comm, and the item is ready in c->item.
* 这个函数完全修改了
*/
void complete_nread(conn * c) {
item *it = &(c->item);

int comm = c->item_comm;

int ret;

stats.set_cmds++;

while (1) {
if (strncmp(ITEM_data(it) + it->nbytes - 2, "\r\n", 2) != 0) {
out_string(c, "CLIENT_ERROR bad data chunk");
break;
}
out_string(c, "STORED");

// send to comet server
notify_comet(ITEM_key(it), ITEM_data(it));
break;
}

return;
}


类别:Web Im | 添加到搜藏 | 分享到i贴吧 | 浏览() | 评论 (2)
 
最近读者:
 
网友评论:
1
2008-02-23 14:34 | 回复
有点意思:) ps:百度空间怎么帖代码的?
 
2
2008-02-23 19:47 | 回复
呵呵,百度空间贴代码很复杂…… 我的方法: 修改css,修改模板添加
的css,
PRE {
    font-family: "Courier New", Courier, mono;
    font-size: 12px;
    margin-top: 5px;
    margin-bottom: 5px;
    padding: 5px;
    background-color: #eff7ff;
    border: 1px dashed #333;
    overflow: auto;
    max-height: 500px;
    margin-right: 20px;  
}

然后把代码在另外的HTML编辑器里面设成
再粘贴进来。

不知道有没有更简单的办法。:)
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu