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