When you already have a JMS broker then you can sure test it out. When not
you need to sure set up (best fault tolerant), this complicate things.

>From my experience, one can use Camel to move the data/commands in
parallel. Use the integration patterns to route, transform the data (Camel
is very fast and powerful in this area), but I put the executing and
conflict handling to a separate application/service. When using queues this
application/service can read from it when it needs (Kafka is also good for
this). When the command is executed and it needs to send something back,
this could be a separate integration. In this way parallel and async are
optimized. I've seen all-in-one solutions with a lot more more issues then
when it is divided into separate (loosely-coupled) simple integrations and
services. Less is more.

Raymond

On Thu, Sep 8, 2022 at 4:46 PM Mansour Al Akeel <mansour.alak...@gmail.com>
wrote:

> Raymond,
>
> I am not sure how to simplify this. I have multiple clients, sending
> commands. Commands that act on the same object, may conflict. I need to
> orchestrate the execution of these commands to:
>
> - avoid two commands to execute for the same object-id,
> - ensure ordering are preserved, as commands from the same client depends
> on the execution of the previous command.
> - ensure parallelism.
>
> I don't see how this is a complex requirement and requires more
> simplification, but I would love to hear other opinions.
> As Claus suggested, to use jms-group might be a good idea, and use cases
> described in the page he refers to are very similar.
>
> If you have an idea to simplify this and remove the smell, please share.
>
>
>
> On Thu, Sep 8, 2022 at 4:20 AM ski n <raymondmees...@gmail.com> wrote:
>
> > Hi Mansour,
> >
> > Your use case sounds a bit complicated. On one hand you need parallel
> > processing, on the other hand you need blocks/sequential processing. This
> > may have a bad smell, but I don't know the details of your use case. I
> > would say try to come up with a way for real parallel processing where
> > ordering doesn't matter. At the end this will make it both simpler and
> > faster.
> >
> > Based on your use case, here are some things you could look at:
> >
> > 1) A dynamic endpoint of 1
> >
> > toD("vm:${header.groupId}?queueSize=1&concurrentConsumers=1&
> > defaultBlockWhenFull=true")
> >
> > The question is when this is really dynamic who will listen to this
> > endpoint?
> >
> > https://camel.apache.org/components/3.18.x/vm-component.html
> >
> > 2) Some other constructs:
> >
> > https://camel.apache.org/manual/try-catch-finally.html
> >
> > https://camel.apache.org/components/3.18.x/eips/throttle-eip.html
> >
> > https://camel.apache.org/components/3.18.x/eips/recipientList-eip.html
> (It
> > has parallel processing)
> >
> > https://camel.apache.org/components/3.18.x/eips/split-eip.html (It has
> > parralel processing)
> >
> > But as said combinations of above are not obvious. A throttle can be used
> > for example when an external API has rate limiting, but for internal use
> in
> > Camel I try to avoid it. You may eloborate a bit about what you trying to
> > achieve functionally.
> >
> > Raymond
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > On Thu, Sep 8, 2022 at 4:07 AM Mansour Al Akeel <
> mansour.alak...@gmail.com
> > >
> > wrote:
> >
> > > I have a stream of commands that needs to be processed in parallel for
> > > performance reasons, and to be grouped on a key for sequential
> processing
> > > to avoid conflicts.
> > >
> > > I don't know the number of groups in advance. One way that came to my
> > mind,
> > > is dynamic channels/queues. So the stream of commands is sorted into
> > > queues, where each queue represents a group. Then handle those
> > > sequentially.
> > >
> > > I have been looking at toD, and dynamic router, but no luck.
> > > I am hoping to be able to achieve something like:
> > >
> > > from("direct:commands")
> > > .to("direct:${header.groupId})
> > > .process(new MyProcessor())
> > >
> > >
> > > Therefore processing commands in parallel, across all queues, while
> > > blocking on the same queue.
> > > If an error occurs, during the process of a command, I would like to be
> > > able to flush/return the failed, and all the pending ones. In other
> > words,
> > > empty the queue.
> > >
> > >
> > > How to achieve this ?
> > > I am open for advice about better ideas/setup.
> > >
> >
>

Reply via email to