» tagged pages
» logout
Jabber-linux
Return to Jabber XMPP resource

利用memcache协议来服务器间通讯,即作为comet input channel

Tags Applied to this Entry

1 person has tagged this page:
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 查看评论
Username:
Password:
(or Cancel)