[erlang-questions] time consuming operations inside gen_server

Serge Aleynikov <>
Wed Dec 12 14:47:20 CET 2012


Max,

If the system implementation is entirely based on casts, then it would
only work property under small loads, otherwise its lack of congestion
control would be subject to "fast producer slow consumer" problems.  In
the later case a gen_server that for one reason or another is not
fetching messages from its message queue fast enough would accumulate
many messages in its queue which will degrade performance of the entire
system.

On the other hand, the use of calls removes this problem by slowing down
the producer, and the gen_server's implementer has a design decision to
make in terms of how to ensure that producer is only minimally delayed
and the server is scalable.  This may indeed involve spawning processes
from gen_server or using a pool of resources, and returning an error
when all resources are busy, or some other design.

Serge

On 12/12/2012 5:04 AM, Max Bourinov wrote:
> Hi Martin,
> 
> First of all I try to avoid calls in my systems. I believe that is there
> is a call - there is a potential lock. Casts are friends.
> 
> In your case I would suggest you to have "special" workers for time
> consuming operations. Workers should be gen_servers and should be a part
> of your supervisors tree.
> 
> This is just a general suggestion - of course each case is unique.
> Please adapt it to your case if possible.
> 
> Best regards,
> Max
> 
> 
> 
> 
> On Wed, Dec 12, 2012 at 1:46 PM, Martin Dimitrov <
> <mailto:>> wrote:
> 
>     Thanks, this sounds very cool.
> 
>     On 12/12/2012 11:42 AM, Attila Rajmund Nohl wrote:
>     > 2012/12/12 Martin Dimitrov <
>     <mailto:>>:
>     >> Hi all,
>     >>
>     >> In our application, we have a gen_server that does a time consuming
>     >> operation. The message is of type cast thus the caller process
>     doesn't
>     >> sit and wait for the operation to finish. But while the gen_server is
>     >> busy with the cast message, it doesn't serve any other call, right?
>     >>
>     >> So, would it be appropriate to create a process that will do the time
>     >> consuming operation and then notify the gen_server?
>     >
>     > The pattern I use in this case is to still use gen_server:call (if the
>     > caller needs to be blocked), start a separate process for the
>     > time-consuming stuff, return {noreply, ...} from the handle_call (so
>     > the gen_server can handle other calls), then call gen_server:reply
>     > from the started process when the time-consuming operation finished.
>     > Of course, the applicability of this pattern depends on what you
>     > actually do.
>     >
> 
>     _______________________________________________
>     erlang-questions mailing list
>      <mailto:>
>     http://erlang.org/mailman/listinfo/erlang-questions
> 
> 
> 
> 
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
> 



More information about the erlang-questions mailing list