Hi Everyone,

Greetings! This forum is very helpful, and i was able to come up with a
solution for my use case.  I just want to confirm if my configurations are
correct.

My requirements are simple. I  have 4 queues, and they are named:
 
1) incoming - I have a web service that post messages to this queue. This
queue gets big.
2) incoming.error - This queue holds the error of incoming. If the listener
received error from consumer, it moves the message to this queue, for
re-processing.
3) outgoing - I have a web service that post message to this queue, and this
can also grow big.
4) outgoing.error - This queue holds the error for outgoing.(same idea as
the incoming.error)

The reason why I have a separate error queue, is for reprocessing. If I need
to reprocess failed messages, all i have to do, is to move the messages from
the error queue to the real queue. (e.g. move message from incoming.error to
incoming ).

The messages need to be persistent for recovery, and I have used kahaDB for
fast storage.

I am using activeMQ 5.5.1 (Is the latest version 5.6.0 have a lot of bug
fixes and performance enhancement, that I really need to upgrade? )


First I set the JVM to be 2G.

# Set jvm memory configuration

ACTIVEMQ_OPTS_MEMORY="-Xms256M -Xmx2048M"



activeMQ.xml
---------------
QUESTIONS:

1) Since I am using persistent message, I dont need to define the
memoryUsage. (True or False? )
2) Since I have a drive that is 50G in size, it is better to explicitly
define it in storeUsage (True or False?)
3) I have to define the tempUsage as 20% of my storeUsage. In my
understanding the tempUsage is use when i am about to run out of
memory.(more like paging it to disk, from memory )

        <systemUsage>
            <systemUsage>
              
                <storeUsage>
                    <storeUsage limit="50 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="13 gb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>



I predefined the queue in the config, to be created during start up.

        <destinations>
            <queue physicalName="incoming" />
            <queue physicalName="incoming.error" />
            <queue physicalName="outgoing" />
            <queue physicalName="outgoing.error" />
        </destinations>


destination configs:

        <destinationPolicy>
            <policyMap>
              <policyEntries>

          
                <policyEntry topic=">" producerFlowControl="true"
memoryLimit="1mb">
                  <pendingSubscriberPolicy>
                      <vmCursor />
                  </pendingSubscriberPolicy>
                </policyEntry>

                <policyEntry queue="incoming" advisoryWhenFull="true" 
producerFlowControl="false"   >
                  <deadLetterStrategy>
                     <individualDeadLetterStrategy  queuePrefix="dlq."
processNonPersistent="true" useQueueForQueueMessages="true" />
                  </deadLetterStrategy>
                  <pendingQueuePolicy>
                    <vmQueueCursor/>
                  </pendingQueuePolicy>
                </policyEntry>

                <policyEntry queue="outgoing" advisoryWhenFull="true" 
producerFlowControl="false"   >
                  <deadLetterStrategy>
                     <individualDeadLetterStrategy  queuePrefix="dlq."
processNonPersistent="true" useQueueForQueueMessages="true" />
                  </deadLetterStrategy>
                  <pendingQueuePolicy>
                    <vmQueueCursor/>
                  </pendingQueuePolicy>
                </policyEntry>

              </policyEntries>
            </policyMap>        
</destinationPolicy>



1) Since I expect heavy load on the "incoming" and "outgoing" queue, I set
the producerFlowControl to false (so that my producer is not block, when
consumer is slow. I believe 50G space is adequate). I also did not specify
memory limit, because i am using persistent message.

2) I added advisoryWhenFull=true, so that I can be notified space is about
to run out. I have to subscribe to the topic, "ActiveMQ.Advisory.FULL" to
get the notifications. Or maybe via JMX?

3) I added individual dead letter queue, even though I don't use it, because
I have a dedicated queue (incoming.error and outgoing.error for specific
error) for errors. But If for any reason, it will throw an error, I have it
isolated per queue.

4) I added a vmQueueCursor, for fast processing. (Since my consumer have a
potential to slow down or become unavailable - unlikely to happen but it can
happen,  is using a file based cursor better? )

5) I did not add configuration for "incoming.error" and "outgoing.error"
queue, since they don't have any consumer. They are only there to hold the
error for reprocessing.



Any help will be greatly appreciated!



Thanks in advance,
WenTong 



--
View this message in context: 
http://activemq.2283324.n4.nabble.com/configuration-question-tp4656494.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to