[erlang-questions] design pattern question for messaging

Miles Fidelman mfidelman@REDACTED
Wed Jul 23 16:34:46 CEST 2014


Hi Rich,

Jesper's writeup is interesting.

I guess a question that now comes to mind is: How does RabbitMQ 
implement message persistence?  After all, it's written in Erlang.  Off 
to do some research (unless someone can point to a good architectural 
reference).

Thanks,

Miles

Youngkin, Rich wrote:
> Hi,
>
> An application I'm working on has a similar requirement regarding 
> message persistence.  We elected to use RabbitMQ.  One notable 
> difference between this app and the one you're describing is we're not 
> moving a message between states as in a work-flow model. But as Dmitry 
> said below, "if the message persistency is a MUST then you have to 
> look into a reliable message broker..." or some other way to manage 
> persistence.
>
> I may have missed it, but in Jesper's reply I didn't see the 
> persistence requirement addressed.  Jesper has a nice write-up "On 
> Erlang, State and Crashes that you might find useful 
> (http://jlouisramblings.blogspot.com/2010/11/on-erlang-state-and-crashes.html). 
>
>
> Cheers,
> Rich
>
> Date: Tue, 22 Jul 2014 22:58:08 +0300
> From: Dmitry Kolesnikov <dmkolesnikov@REDACTED 
> <mailto:dmkolesnikov@REDACTED>>
> To: Miles Fidelman <mfidelman@REDACTED 
> <mailto:mfidelman@REDACTED>>
> Cc: erlang-questions Questions <erlang-questions@REDACTED 
> <mailto:erlang-questions@REDACTED>>
> Subject: Re: [erlang-questions] design pattern question for messaging
>   system
> Message-ID: <B61EC9A8-DC4B-48F1-84A2-D8FCE65C3994@REDACTED 
> <mailto:B61EC9A8-DC4B-48F1-84A2-D8FCE65C3994@REDACTED>>
> Content-Type: text/plain; charset=windows-1252
>
> Hello,
>
> "Except, that model kind of falls down because Erlang message are 
> unreliable by design, and don't persist in the event of a process 
> crash (much less a node crash).?
>
> This is a trade off you have to accept. If the message persistency is 
> MUST then you have to look into reliable message broker solution then.
>
> I think you already articulate the basic pattern, which is used in 
> many applications
>
>  ?[ mq ]?[ worker ]?[ mq ]-[ worker ]?
>
> You are right if you keep messages within mailbox then crash of 
> process destroys mailbox. Thus, you need an intermediate process to 
> hold messages. The intermediate process does not do any work except 
> enqueue / dequeue operation. Therefore, the number of failures is 
> limited. The worker is pool of processes Jesper Louis gave you list 
> pool libraries, I can give one more if you need ;-)
>
> I am using a similar pattern at one of my application. The biggest 
> problem is node crash due to OOM or external factors. I am trying to 
> solve it by duplicating the processing path into N-distinct node (my 
> app uses last-write wins but you might use other conflict resolution 
> technique).
>
> You can extend the pattern by having persistent mq to check-point 
> intermediate results to survive node crash but I found it complicated.
>
> ?[ p-mq ]?[ worker ]?[ mq ]?[ worker ]?[ mq ]?[ worker ]?[ p-mq ]-
>
> Best Regards,
> Dmitry
>
> On 22 Jul 2014, at 14:53, Miles Fidelman <mfidelman@REDACTED 
> <mailto:mfidelman@REDACTED>> wrote:
>
> > Hi Folks,
> >
> > So far, I've mostly been experimenting w/ Erlang, and using 
> Erlang-based technology (notably CouchDB).  As I'm thinking about a 
> new application, I'm having trouble getting my hands around an 
> appropriate design pattern.  I wonder if anybody might be able to 
> point me in the right direction.
> >
> > The application is message handling (back to that in a minute).  I 
> realize that I have a pretty good idea how to handle some kinds of 
> applications in a highly concurrent fashion, such as:
> > - modeling/simulation (obviously, each entity - such as a vehicle - is 
> a process) - this is what led me to Erlang in the first place
> > - protocol engines as state machines - e.g., spawn a process for each 
> tcp connection
> > - transaction systems - spawn a process for each transaction
> > - transaction oriented
> >
> > But I'm looking at a work flow application that maps onto a 
> paper-forms-based model.  It's a classic queuing system - work 
> elements move from queue to queue as they're worked on.  The obvious 
> first thought is:
> > - a process for each queue
> > - a worker process for each work step
> > - a message for each piece of work-in-process -- moving from queue to 
> queue via the worker processes
> >
> > Except, that model kind of falls down because Erlang message are 
> unreliable by design, and don't persist in the event of a process 
> crash (much less a node crash).
> >
> > My first two thoughts are:
> > - spawn a process for each queue entry, pass around the PIDs
> > - use Mnesia to hold the queues
> >
> > But neither of those feels quite right.  This must be a solved 
> problem, but I'm hitting a blind spot.  So... what is the design 
> pattern for queuing systems and/or reliable message passing in Erlang?
> >
> > Any good examples to look at?  Good presentation slides or reference 
> materials to review?
> >
> > Thanks very much,
> >
> > Miles Fidelman


-- 
In theory, there is no difference between theory and practice.
In practice, there is.   .... Yogi Berra




More information about the erlang-questions mailing list