[erlang-questions] Imagine every (active) entity is a process

Alexander Lamb alexander.lamb@REDACTED
Mon Nov 5 15:11:56 CET 2007


So I am back with my design questions. I listened to the Armstrong  
interview and thought a bit more about processes keeping the state of  
an application.

For example, in an application which handles customers, would it make  
sense to create a process for each customer being worked on? Imagine a  
user searches for a customer to update his address, another user is  
creating an invoice for a customer, etc... When a given customer  
becomes active (in the sense that someone is working on the customer  
and his data), a process is created. Potentially, if the application  
is used by many users, you could have hundreds of customer processes  
being created. I assume this is not a problem with Erlang and  
encapsulated well the business logic.

Going one step further, I would imagine it is better to create only  
one process for any given customer at any given time. In other words,  
if I (a user) is updating customer "23" and at the same time, another  
user is adding an invoice to customer "23", we should both be speaking  
to the same process. It allows a better encapsulation and avoids  
mismatches because I would be updating a database with some customer  
info without the other user seing my update until a refresh. So I  
imagine it would be a good design to have one and only one process for  
a given entity with a given primary key.

Going this way, I therefore have a question (in addition to  
understanding if this is a correct way of thinking in Erlang):

When I would want to start working on customer "23" for example, I  
will first need to check if customer "23" is already an active  
process. If yes, I get the Pid and exchange whatever messages I need  
with customer "23". If not, I create the process and proceed.
Now, obviously, for my process to be known by all potential users of  
the process, I must register the process using the register(Name,Pid)  
function. As a name I could concatenate the entity name and its  
primary key (in my case: "customer_23").

Isn't there a race condition here. Since I have to check first if a  
process exists before creating it, I might end up in a situation where  
two other processes are doing the same thing and creating twice a  
process for the same entity. The second would obviously fail and we  
could catch the error. But is this a correct way of proceeding? Also,  
is it possible to have thousands of registered processes (as opposed  
to non registered processes)?


Alexander Lamb
Founding Associate

4 ch. de la Tour de Champel
1206 Geneva

Tel:  022 347 77 37
Fax: 022 347 77 38


More information about the erlang-questions mailing list