zare has asked for the wisdom of the Perl Monks concerning the following question:

Hello dear Monks, i come upon you with the following question :

We're developing small client that controls one SIP locale via Asterisk Manager interface. However, the number of clients is somewhat large (around 500), and i'm not confident about AstMan's capability to handle such number of connections...it wasn't designed for that anyway. Issue number two would be AstMan's incapability to forward events for only one SIP channel. If the client connects directly to AstMan, it needs to parse all incoming data (about all channels), and take appropriate ones.

Therefore, i was given a task to program a small daemon that connects to AstMan on one side, and clients on another, relaying AstMan information to appropriate client. I went with Perl, and i want to use Net::Server package to handle all connections. However, i ran into a problem;

If i use Net::Server::(something)Fork personality, the server behaves in a way that it spawns a child process for each connection. That's great, but, the general idea is to have 500 connections to my daemon, and a single connection between the daemon and Asterisk Manager. Behaviour of the Net::Server::Fork personality implies that i'll again have one AstMan connection for each client connection, and that's not the point.

I've seen Net::Server::Multiplex personality, but i'm not confident about it's capabilities, especially when you take the ratio of incoming events for 500 SIP channels...the user client should be very responsive.

So i'm seeking your ultimate wisdom on this issue. I wanted to do this in Perl because of time...i didn't want to program the daemon from ground zero in C. However, if i'm forced to program a multithreaded daemon with critical sections i'm going to go with C (nothing against Perl, but i'm really more experienced with C).

Thank you in advance,
Zarko Bulatovic

Replies are listed 'Best First'.
Re: Net::Server capabilities
by shmem (Chancellor) on Feb 21, 2009 at 18:58 UTC
    If i use Net::Server::(something)Fork personality, the server behaves in a way that it spawns a child process for each connection. That's great, but, the general idea is to have 500 connections to my daemon, and a single connection between the daemon and Asterisk Manager. Behaviour of the Net::Server::Fork personality implies that i'll again have one AstMan connection for each client connection, and that's not the point.

    There are several IPC ways to let forked workers communicate with their parent - pipes, message queues, shared memory segments and so on.

    Threads are available in perl, too; essentially, anything you have in C. You will have to choose your means, same if you write your server in C, so choice of language isn't relevant here.

    You could write a multitasking server in POE and register a session in it for each accept()ed client connection, and have those sessions post events back to the session(s) which talk(s) to AstMan, which you could also spawn dynamically based on responsiveness, latency and load.

      You could write a multitasking server in POE and register a session in it for each accept()ed client connection, and have those sessions post events back to the session(s) which talk(s) to AstMan, which you could also spawn dynamically based on responsiveness, latency and load.

      POE::Component::Client::Asterisk::Manager may help, if you're looking to POE for a potential solution.