2011-07-12 63 views
1

我需要編寫一個服務器程序,它將打開並保持5個實時Telnet,SSH和服務器的各種連接,同時監聽另一端的JSONRPC調用。AnyEvent的主人服務器

我已經開沒有問題,並保持5個連接,偵聽請求:

# workers: 
open_myconnections(1..5); 
my $w1 = AnyEvent->timer (interval => $seconds, cb => sub { keep_conn_alive(1) }); 
my $w2 = AnyEvent->timer (interval => $seconds, cb => sub { keep_conn_alive(2) }); 
... 

# now listen for requests 
use AnyEvent::JSONRPC::Lite; 
# master: 
my $server = jsonrpc_server '127.0.0.1', '4423'; 
$server->reg_cb(
    queue_up => sub { 
     my ($res_cv, @params) = @_; 
     my $res = send_params_to_connection_queue(@params); 
     $res_cv->result($res); 
    }, 
); 

但現在我卡住試圖找出最好的方式(即無阻塞AnyEvent的方式)在5名工作人員之間分配隊列,這是我的功能send_params_to_connection_queue()所做的。

任何模塊建議表示讚賞,雖然我試圖避免使用POE,因爲這應該是一個非常微小的服務器,除非沒有其他的明智的選擇存在,我會通過。

+0

我不確定這種情況下究竟意味着什麼,你能否詳細說明一下? – MkV

+0

我的意思是,將一個傳入請求分配給5個可用工作人員之一。 – ojosilva

回答

3

在YAPC :: NA 2011我學習了一個非常好的排隊系統ZeroMQ。使用Perl綁定在Direct Perl BindingsAnyEvent bindings

 

               |----- ssh worker 
JSONRPC-Listener-EventLoop---->QueueingSystem---|----- telnet worker 
               |----- etc. 
+1

還有AnyMQ和AnyEvent :: MP(後者大​​多隻有當你有多個進程/節點時纔有意思) – MkV

+1

AnyEvent :: MP很棒!我可能會使用它。但我的問題是,Net :: OpenSSH和Telnet阻塞庫,這使得真的很難使用事件隊列。 – ojosilva

+0

你使用一個非阻塞的主事件循環,它將阻塞服務(telnet等)所要完成的工作進行非阻塞排隊,主循環還設置了一個回調函數,以便在阻塞隊列完成時調用時,它可以發回到運行回調的主循環,並且通常後處理數據,並將它發送給事件請求者。我在上面的答覆中畫了一張照片。 –

2

只有你知道什麼是「最好的」,但對如何做到這一點,這也許就是你真正的問題的一般模式。

基本上,你需要一個隊列,比方說,一個陣列,存儲所有的請求尚未發送:

我@queue;

那麼,你想要做的請求每次,你首先將數據推到隊列,然後調用「調度」功能:

子do_req { 我($數據,$ CB)= @_; push @queue,[$ data,$ cb]; 調度程序; }

時間表功能的目的是選擇一個工人和火斷 下一個請求:

子調度{ @queue或返回; #沒有與空隊列

for my $worker (@workers) { 
    if ("$worker is free") { 
     my ($data, $cb) = @{ shift @queue }; 
     $worker->doit (sub { 
      &scheduler; 
      $cb->(@_); # call original callback 
     }); 
     return; 
    } 
    } 

}

這裏做的事情是要找到一個自由工作者,發送請求給它(「DOIT」),並 做的時候,它的完成,它調用調度再次。

這取決於你如何決定工人是否是「免費」的。例如,您可以始終選擇具有最少未完成請求數的工作人員。 或者,您可以選擇一個擁有少於5個未完成請求的工作人員。 或以最好的方式。

重要的是,只要工作人員可能變得空閒(因爲工作 完成),您再次調用調度程序來排隊下一個工作。

通過這種方式,您可以對工作人員強加任意限制,同時不會忘記 您需要做的但由於此限制而無法發送的工作。

有許多variatins這種技術,但其基本思想總是 相同:第一隊列的東西,然後讓你倆後 排隊和作業後調用一個函數完成,然後應分發排隊 工作。

事件發生時,您可能需要發出 請求時發生兩個事件:創建/排隊新作業/請求時以及未完成的 作業完成。