[prev in list] [next in list] [prev in thread] [next in thread]
List: activemq-users
Subject: Re: consuming artemis with a reactive stream
From: Matthieu Baechler <matthieu () apache ! org>
Date: 2020-06-12 6:55:46
Message-ID: f073e03774e486877af4209867429e652e8def48.camel () apache ! org
[Download RAW message or body]
Hi Howard,
Thank you for your answer.
On Fri, 2020-06-12 at 10:47 +0800, Howard Gao wrote:
> If I understand it right, you are using concurrent consumers that
> share the
> session. The session is not thread safe.
> You should use one consumer per session.
We are aware of that, we built the reactive stream in a way that
respect that requirement:
* an Akka actor is running in a fixed thread and receive the messages
from the message queue
* it then read the payload (the actor is practically the only consumer)
and put in the stream alongside a correlation id that the worker can
use to ask the actor the ack or nack a given message
* the message sending is also handled by the same Akka actor
Does it make sense?
I understand that it's not the way the driver is meant to be used to it
should be a decent design for adapting it to a reactive stream.
We just lack with individual nack thing.
Cheers,
-- Matthieu Baechler
>
> On Thu, Jun 11, 2020 at 3:14 PM Matthieu Baechler <
> matthieu@apache.org>
> wrote:
>
> > Hi folks,
> >
> > I work on Apache James, the JVM mail server, for some years.
> >
> > We implemented our Mail Queue using ActiveMQ a long time ago.
> >
> > The code is not really nice and the performances are not great (if
> > you
> > are curious you can look at it here
> >
> > https://github.com/apache/james-project/tree/master/server/queue/queue-activemq
> > )
> >
> > James is using reactive streams more and more to enable good
> > performances, so I decided to rewrite our ActiveMQ Mail Queue using
> > Akka Stream.
> >
> > We start to have a working implementation using artemis core
> > protocol
> > but we fall today on an unexpected problem.
> >
> > For our streaming architecture, we take advantage of async handling
> > of
> > messages using a `MessageHandler`. We have a single thread source
> > that
> > receive messages from the driver and push them in a stream.
> >
> > We then have many subscribers (workers) to the stream because
> > handling
> > email is a heavy process.
> >
> > Finally, we ack each message individually when a worker succeed at
> > handling the mail.
> >
> > This is the happy path and we found what we want in the driver API
> > for
> > this.
> >
> > However, we didn't found a way to handle the failure path: when a
> > worker fails, we are supposed to "nack" the message individually to
> > allow another worker to take it from the queue.
> >
> > The only thing we found is that we can rollback the entire session.
> > As
> > there's, by design, a single session open for the stream source,
> > doing
> > a rollback would nack some messages that are being process, right?
> >
> > We looked at the wire package to understand the protocol and didn't
> > find any solution.
> >
> > Is there any solution to this specific issue? What would you advise
> > us
> > to do?
> >
> > Cheers,
> >
> > -- Matthieu Baechler
> >
> >
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic