Why, after all this time, are you moving to a clustered deployment? The
fact that you require strictly ordered message processing means that
processing will be quite slow, relatively speaking, which means performance
is likely not a limiting factor in your use-case. Typically folks leverage
clustering as a way to increase performance via horizontal scaling.
Conceptually speaking, strictly ordered message processing and horizontal
scaling don't mix well. This is briefly discussed in the documentation [1].


Justin

[1]
https://activemq.apache.org/components/artemis/documentation/latest/message-grouping.html#clustered-grouping

On Fri, Jan 26, 2024 at 12:42 AM Sebastian Götz <
s.go...@inform-technology.de> wrote:

> Hello group,
>
> we were using ActiveMQ Artemis and it's predecessor HornetQ over years
> now but never came to the point where we had to use clustering and ha.
> Now this has changed and I have worked through the examples to setup a
> ha cluster with 6 nodes (3 live, 3 backup).
>
> While this works like a charm I have some major problems in the way we
> use the messaging I want to explain in the following.
> We have some sort of network devices attached to our software and
> changes to the configuration causes "orders" to be placed into an order
> queue (only one global queue). While processing these orders, messages
> are produced for devices and placed into an outbox queue (one per
> device). Our requirement to this order queue is sequential processing
> (the first message from a queue for a device has to be completely
> processed before the next one is picked). So far we managed this using
> the concept of grouping messages and filtering via a certain message
> property (i.e. the device id). This offered the possibility to handle
> this inside our software because the broker dispatches all messages with
> the same group to the same consumer with the matching filter, which is
> great.
> Moreover we have a so called event topic where we distribute messages
> between the parts of the software which is made up of several
> independent processes. This is done through a classic topic (one address
> with several queues attached).
>
>       Node A               Node B                Node V
>    ___________          ___________           ___________
>   |___QUEUE___|        ||||QUEUE||||         |___QUEUE___|
>     |                    ^                     |
>     |                    |                     |
>     |                    |                     |
>    Consumer 1           Producer              Consumer 2
>
> With clustering a big problem arises from these requirements (I tried to
> picture that above):
>   For of the queues it is possible that the producer is connected to
> node B and consumers connected to node A and C leading to B building up
> a queue with a large message count while the two consumers starve.
>
> I already worked through the concepts of message redistribution, diverts
> and bridges but none of them seems to solve this problem. Message
> redistribution only kicks in, when there are no more consumers on a
> queue of a distinct node. But for our order queue there might well be
> several consumers on different nodes with different filters, so its
> quite difficult to say which message should be dispatched to which node.
> Diverting could do more on this but I do not see how this could work
> with the concept of failover and failback, because we could never know
> in advance to which of the available node a consumer would connect after
> failover and its messages could well be all on a failed node.
> We would like to see a queue as an abstract source of messages for the
> consumers they can read from never mind to which node of the cluster
> they are connected. I understand that this would mean that message
> reception and removal would have to be replicated to all members of a
> cluster (event the backup nodes) which would cause high load I guess. I
> am hoping that someone has a hint for me how we could address this.
>
> Kind regards
>
> Sebastian
>
>

Reply via email to