A queue message exists on only one broker at a time, no matter what. If there is a consumer on broker 2 and A hasn't been excluded, or if your broker 1's networkConnector is configured to statically route A to broker 2, the message will be forwarded. Otherwise, the message will sit on broker 1 till it is consumed locally or one of those things changes.
Setting networkTTL=3 for a 2-broker network is fine as long as you don't expect your consumers to hop between the brokers more than twice between when a message is published and when it is consumed. If you expect your consumers to move, you should also set replayWhenNoConsumers=true, to avoid stuck messages. BTW, you should really have started a new thread for this new question. Tim On Dec 17, 2015 6:10 AM, <barry.barn...@wellsfargo.com> wrote: > If I have a NoB (total 2), and queue A is defined on one, it shows up on > both as I would expect. > > If a Producer puts a messages to queue A on one of the brokers, does the > message get forwarded over the bridge to 'both queue instances', or does it > simply reside on the broker it was put on? > I am asking this as I am curious about the network connector parameter: > > excludedDestinations > > destinations matching this list won't be forwarded across the network > > > Additionally, in this 2 broker network, I have networkTTL=3. Does this > matter, or would you recommend that being changed? > > Regards, > > Barry > > > -----Original Message----- > From: tbai...@gmail.com [mailto:tbai...@gmail.com] On Behalf Of Tim Bain > Sent: Tuesday, November 10, 2015 10:56 AM > To: ActiveMQ Users > Subject: Re: Correctly configuring a network of brokers > > On Thu, Nov 5, 2015 at 2:02 PM, jahlborn <jahlb...@gmail.com> wrote: > > > So I've spent some time digging around the internet and experimenting > > with our setup, trying to determine the best configuration for a > > network of brokers. > > There are a variety of things which seem to conspire against me: the > > multitude of configuration options present in activemq, options which > > seem to have no "optimal" setting (each choice has different pros and > > cons), and behavior/features which change over time such that old > > recommendations may now be irrelevant or no longer correct. For > > reference, we are using a mesh network of brokers, where consumers may > > arrive at any broker in the network. > > We use topics, queues, and virtual queues. We use explicit receive() > > calls as well as listeners. We also utilize the "exclusive consumer" > > feature for some of our clustered consumers. All messaging is > > currently durable. Some relevant configuration bits (changes from the > > defaults). > > > > * using activemq 5.9.1 > > * advisory support is enabled > > * PolicyEntry > > ** optimizedDispatch: true > > * Using ConditionalNetworkBridgeFilterFactory > > ** replayWhenNoConsumers: true > > ** replayDelay: 1000 > > * NetworkConnector > > ** prefetchSize: 1 > > ** duplex: false > > ** messageTTL: 9999 > > > > Alright, now that we got through all the context, here's the meat of > > the question. There are a bunch of configuration parameters (mostly > > focused in the NetworkConnector), and it's not at all clear to me if > > my current configuration is optimal. For instance, although we had > > been using a configuration similar to the above for about a year now > > (same as above except that messageTTL was 1), we only recently > > discovered that our exclusive consumers can sometimes stop processing > > messages. In certain cases, the consumer would end up bouncing around > > and the messages would end up getting stuck on one node. Adding the > > messageTTL setting seems to fix the problem (is it the right fix...?). > > > > If your problem was that you were getting stuck messages due to consumers > bouncing around the Network of Brokers (which is what it sounds like), then > yes, increasing the networkTTL (or the messageTTL, depending on your > topology) is the correct fix, in addition to the > replayWhenNoConsumers=true setting you said you had already set. > > * NetworkConnector > > ** "dynamicOnly" - i've seen a couple of places mention enabling this > > and some > > indication that it helps with scaling in a network of brokers (e.g. > > [3]). > > The description in [1] also makes it sound like something i would > > want to > > enable. However, the value defaults to false, which seems to > > indicate that > > there is a down-side to enabling it. Why wouldn't i want to enable > > this? > > > > One major difference here is that with this setting disabled (the default) > messages will stay on the broker to which they were first produced, while > with it enabled they will go to the broker to which the durable subscriber > was last connected (or at least, the last one in the route to the consumer, > if the broker to which the consumer was actually connected has gone down > since then). There are at least two disadvantages to enabling it: 1) if > the producer connects to an embedded broker, then those messages go offline > when the producer goes offline and aren't available when the consumer > reconnects, 2) it only takes filling one broker's store before you Producer > Flow Control the producer (whereas with the default setting you have to > fill every broker along the last route to the consumer before PFC kicks > in), and 3) if you have a high-latency network link in the route from > producer to consumer, you delay traversing it until the consumer > reconnects, which means the consumer may experience more latency than it > would otherwise need to. So as with so many of these settings, the best > configuration for you will depend on your situation. > > Also, default values are often the default because that's what they were > when they were first introduced (to avoid breaking legacy configurations), > not necessarily because that's the setting that's recommended for all > users. Default values do get changed when the old value is clearly not > appropriate and the benefits of a change outweigh the inconvenience to > legacy users, but when there's not a clear preference they usually get left > alone, which is a little confusing to new users. > > > > ** "decreaseNetworkConsumerPriority", > "suppressDuplicateQueueSubscriptions" > > > - > > these params both seem like "damned if you do, damned if you don't" > type > > parameters. The first comment in [2] seems to imply that in order to > > scale, you really want to enable these features so that producers > prefer > > pushing messages to local consumers (makes sense). Yet, at the > > same time, > > it seems that enabling this feature will _decrease_ scalability in > > that it > > won't evenly distribute messages in the case when there are > > multiple active > > consumers (we use clusters of consumers in some scenarios). Also > > in [2], > > there are some allusions to stuck messages if you don't enable this > > feature. Should i enable these parameters? > > > > You're right that decreaseNetworkConsumerPriority is a bit of a "damned if > you do, damned if you don't" type parameter when you're trying to load > balance between local and network clients, but if you're trying to load > balance well, you should have small prefetch buffer sizes anyway. If you > do, it really shouldn't matter which consumer gets prioritized; they'll > each be given a small number of messages and then there will be a large > backlog sitting on the broker, who will hand them out as the initial small > batches get worked off. But the more important contribution of > decreaseNetworkConsumerPriority is that it favors more-direct routes over > less-direct ones through a network where multiple routes exist from a > producer to a consumer, and (less important but still positive) enabling it > seems likely to reduce the load on your broker network by having a message > pass through fewer brokers, so I'd definitely enable it given what you've > said about your concerns. > > suppressDuplicateQueueSubscriptions disallows multiple routes to a given > consumer, but those routes are only a problem if > decreaseNetworkConsumerPriority isn't used (because with > decreaseNetworkConsumerPriority, you won't choose the non-optimal routes > unless the optimal one disappears due to a broker going down). So if > you're using decreaseNetworkConsumerPriority (and it sounds like you > should), then I don't see a reason for you to use > suppressDuplicateQueueSubscription. But it could be useful for anyone > who's not using that option. > > > > ** "networkTTL", "messageTTL", "consumerTTL" - until recently, we kept > > these > > at the defaults (1). However, we recently realized that we can end > > up with > > stuck messages with these settings. I've seen a couple of places > which > > recommend setting "networkTTL" to the number of brokers in the network > > (e.g. [2]), or at least something > 1. However, the recommendation > for > > "consumerTTL" on [1] is that this value should be 1 in a mesh > > network (and > > setting the "networkTTL" will set the "consumerTTL" as well). > > Additionally, [2] seems to imply that enabling > > "suppressDuplicateQueueSubscriptions" acts like "networkTTL" is 1 > > for proxy > > messages (unsure what this means?). We ended up setting only the > > "messageTTL" and this seemed to solve our immediate problem. > > Unsure if it > > will cause other problems...? > > > > messageTTL controls how far actual messages are allowed to propagate > before they have to be consumed locally. consumerTTL controls how far > advisory messages (which flow in the opposite direction as the actual > messages, so that brokers that receive a message know where to send it to) > are allowed to propagate. networkTTL sets both values to the same thing; > you should use either networkTTL (if you're using the same value) or > messageTTL & consumerTTL (if you need different values), but don't mix > them. I'm not aware of any problems caused by having a "too-large" > consumerTTL/networkTTL unless you have a non-homogenous NoBs where you want > to keep messages produced in one part from propagating into another part; > if all you have is a uniform mesh where each message is "allowed" anywhere > if an appropriate consumer needs that, then just use networkTTL and avoid > the confusion/hassle of splitting the configuration. > > In a mesh (all brokers connected to each other), you only need a > consumerTTL of 1, because you can get the advisory message to every other > broker in one hop. But in that same mesh, there's no guarantee that a > single hop will get you to the broker where the consumer is, because the > consumer might jump to another node in the mesh before consuming the > message, which would then require another forward. So in a mesh with > decreaseNetworkConsumerPriorty you may need a messageTTL/networkTTL of 1 + > [MAX # FORWARDS] or greater, where [MAX # FORWARDS] is the worst-case > number of jumps a consumer might make between the time a message is > produced and the time it is consumed. In your case you've chosen 9999, so > that allows 9998 consumer jumps, which should be more than adequate. > > > > ** "prefetchSize" - defaults to 1000, but I see recommendations that > > it should > > be 1 for network connectors (e.g. [3]). I think that in our initial > > testing i saw bad things happen with this setting and got more even > load > > balancing by lowering it to 1. > > > > As I mentioned above, setting a small prefetch size is important for load > balancing; if you allow a huge backlog of messages to buffer up for one > consumer, the other consumers can't work on them even if they're sitting > around idle. I'd pick a value like 1, 3, 5, 10, etc.; something small > relative to the number of messages you're likely to have pending at any one > time. (But note that the prefetch buffer can improve performance if you > have messages that take a variable amount of time to process and sometimes > the amount of time to process them is lower than the amount of time to > transfer them between your brokers or from the broker to the consumer, such > as with a high-latency network link. This doesn't sound like your > situation, but it's yet another case where the right setting depends on > your situation.) > > > > I think that about summarizes my questions and confusion. Any help > > would be appreciated! > > > > [1] http://activemq.apache.org/networks-of-brokers.html > > [2] https://issues.jboss.org/browse/MB-471 > > [3] > > > > http://www.javabeat.net/deploying-activemq-for-large-numbers-of-concur > > rent-applications/ > > > > > > > > > > -- > > View this message in context: > > http://activemq.2283324.n4.nabble.com/Correctly-configuring-a-network- > > of-brokers-tp4703715.html Sent from the ActiveMQ - User mailing list > > archive at Nabble.com. > > >