How to get configuration data to a large number of threads?

Joe Armstrong joe@REDACTED
Wed Oct 27 11:32:41 CEST 2004

   How about some lateral thinking here:

> I have a transaction based system that spawns a
> thread to handle every incoming transaction.  Unfortunately there is
> quite a large chunk of relatively static configuration information that
> is needed by every thread....
> The question is, how do I get this information to every thread without
> significantly slowing things down or using up all the available memory?

   You don't - you move the functions to the data - not the data to the
functions :-)

   Assume the  configuration data is HUGE  (GBytes) - if  this case I'd
send the computations to  the configuration data. Exactly the opposite
of what you did :-)

   So you make a global server like this


   start() ->
 	AHugeDataStructure = read_initiaal_config_data(),

   loop(AHugeDataStructure) ->
 	   {upgrade, AnotherHugeDataStructure} ->
 	   {compute, From, Fun} ->
 		Val = (catch Fun(AHugeDataStructure)),
 	        From ! {self(), Val},

... now about the clients ...

    Suppose the client wants a username and password

    Make a query

 	Query = fun(Config) ->
 		   {get_from_config(username, Config),
 		    get_from_config(password, Config)

   Send it to the config process with a

 	Config ! {compute, self(), Query}

 	and wait for the reply

   Note that sending Funs in messages (locally) is a very lightweight
operation (as I have explained before :-)

   Now you possibly have a bottleneck in the server - how to solve this?

   Make several servers with identical copies of the configuration data.

   Remember - it might be cheaper to move the functions to the data
than moving the data to the functions.

   RPC style programming in "Other Languages" (TM) makes you believe
that there is only only way of doing RPCs (ie moving the data to the functions)

   Erlang offers freedom of choice.



More information about the erlang-questions mailing list