2009年6月10日星期三

[PerlChina] Re: 多进程并行处理多文件,使用共享内存

On 6/11/09, Edmond Chen <oscar.ernest@gmail.com> wrote:
> 都改进了哪些地方阿。。。是否可以共享下:)
>

其实也谈不上"改进"了,主要是根据我们的集群调度需要扩展了功能(这种扩展不是没有开销的!哈哈!):

我们的 xunxin++ 对 memcacheq 进行的功能扩展主要包括:

* 给 memcacheq 添加了队列长度上限支持,可以通过 memached 命令 add <queue-name>
<length-limit> 在创建队列时指定,当队列长度超过其对应的 length limit 时直接在 memcached 级别报
NOT STORED 错误。
* 取消 memcacheq 添加新元素的 set <queue-name> <elem-data> 命令在 queue-name
不存在时自动创建队列的"副作用"。当指定队列不存在时,给客户端直接返回 NOT FOUND 错误。
* 为 memcacheq 的 stats queue
命令的输出列表添加了对各队列的当前长度和预设长度上限值的支持。比如我们线上的任务调度队列群的 stats queue 的一次快照如下:

STAT done 1 1234567
STAT done_101001 0 2000000
STAT done_101002 3 2000000
STAT done_101003 1 2000000
STAT done_101004 3 2000000
STAT done_901005 0 2000000
STAT done_901007 1 2000000
STAT done_901008 1 2000000
STAT initial 10 1234567
STAT preprocessed 2 500

这里第二列是队列名,第三列是队列的当前长度,最后一列是队列创建时预设的队长上限。

这些改动的补丁我们正在考虑是否提请作者去 merge 到 trunk 里。。。呵呵。确实开源一下也挺好的,哈哈!

值得一提的是,我做的一个 Perl 模块,叫做 Queue::Memcached::Buffered,用于
memcacheq/mcqueue 等兼容协议的队列的客户端访问(带透时的 buffer 合并)。引用其中的 SYNOPSIS 标例:

use Queue::Memcached::Buffered;

my $queue = Queue::Memcached::Buffered->new({
# or use memc => $memcached_object below:
servers => ['127.0.0.1:11211', 'foo.bar.com:12345'],
item_size => 1005,
queue => 'queue_name',
});
for my $elem (@elems) {
$queue->push_elem($elem);
}
$queue->flush; # don't forget this!

while (my $elem = $queue->shift_elem) {
# do something with $elem here...
}

通过此模块,大大简化了我们的 WebKit 集群中的 prefetcher, xhunter, pg2hunter,
done-dispatcher 等众多组件的源代码,并比较充分地利用了 memcacheq 中的定长 queue
元素的存储空间。未来准备将此模块发布到 CPAN。呵呵。如果有朋友着急要,可以发邮件催我,呵呵。

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

没有评论: