Your understanding of this is good and you've got the right concepts here. The only two reasons I can think of that you shouldn't use a mesh (which I think is the same as a complete graph, though you drew a distinction between the two in your email so maybe there's a difference I'm not understanding) is if you have non-homogeneous network links where the most efficient routing between two brokers isn't necessarily the path "directly" (from a network-of-brokers standpoint, not from a network standpoint) between the two, or if you don't want to have to specify all of the other clusters so you'd use a hub-and-spoke topology so you only have to specify the hub node in your config.
On Fri, Mar 13, 2015 at 12:21 AM, James A. Robinson <jim.robin...@gmail.com> wrote: > Hi folks, > > I joined this list because we're starting to look into setting up > ActiveMQ for our developers. My preference at this time is to set > up a highly reliable system that doesn't have single points of > failure. > > Due to the concern about single points of failure I didn't want to > introduce a shared persistence layer. That's why I've been looking > at replicated LevelDB. > > After spending some time reading up on ActiveMQ my first inclination > has been to propose setting up 3-node replicated LevelDB clusters, > and to build a network of brokers out of sets of those 3-node > clusters. > > E.g., start with two clusters, and then keep adding on as we see > the need in terms of capacity. > > [amq-1a, amq-1b, amq-1c] > [amq-2a, amq-2b, amq-2c] > ... > [amq-9a, amq-9b, amq-9c] > ... > > I'm not sure what the best option is w/re to the network of broker > topology. I could see mesh working, but my first instinct would > be to set up a complete graph, and have each broker cluster configured > with a uni-directional network connector to every other cluster > using the masterslave scheme. > > I am wondering if this is a naive approach, and if so why it wouldn't > be a good idea. > > If it is reasonable, I'm still trying to fully understand how one > deals with forwarding messages from brokers w/o consumers to those > brokers w/ consumers. The page > > http://activemq.apache.org/networks-of-brokers.html > > discusses this topic and mentions rebalanceClusterClients, and it > isn't clear to me how that option will help if the clusters and > clients are fairly static: > > rebalanceClusterClients: > if true, connected clients will be asked to rebalance across a > cluster of brokers when a new broker joins the network of brokers > (note: priorityBackup=true can override) > > Reading the list of options available for transport connectors, it > seems reasonable to configure the transport connector with: > > updateClusterClients="true" > rebalanceClusterClients="true" > updateClusterClientsOnRemove="true" > > But if one has mostly static clients and we aren't frequently > bringing broker clusters up and down, I would assume there would > still be a problem of having messages on a broker that doesn't have > consumers attached. If I'm wrong I'd like to understand what I'm > missing. > > The network-of-brokers page, after mentioning rebalanceClusterClients > as one solution, continues the discussion and states that: > > Another, is to allow replay of messages back to the origin as > there is no local consumer on that broker. > > There is a destination policy that allows this behavior for queues > by configuring a conditionalNetworkBridgeFilterFactory with > replayWhenNoConsumers=true. The conditionalNetworkBridgeFilterFactory > provides an optional replayDelay based on the broker-in time. > > N.B.: When using replayWhenNoConsumers=true for versions < 5.9, > it is necessary to also disable the cursors duplicate detection > using enableAudit=false as the cursor could mark the replayed > messages as duplicates (depending on the time window between > playing and replaying these messages over the network bridge). > The problem is fully explained in this blog post. > > And I see in that ticket AMQ-4607 says this about the network > connector options: > > networkTTL sets both consumerTTL and messageTTL a value of -1 > denotes infinite hops. > In a mesh, use consumerTTL=1, messageTTL=-1 to allow consumers to > bounce around the mesh and messages to follow demand. > In a linear topology use networkTTL == length of network (as before) > > So would it be reasonable to set up a complete graph, with each > 3-node cluster configured with a uni-directional network connector > to every other 3-node cluster using masterslave, and to set > > consumerTTL="1" > messageTTL="-1" > decreaseNetworkConsumerPriority="true" > > and a networkBridgeFilterFactory/conditionalNetworkBridgeFilterFactory > with > > replayWhenNoConsumers="true" > > I'd appreciate any input from the folks here, including any pointers > on any more material I should read. > > Jim >