Hi,
I have been using the CXF WS-RM component for a while. And I can say,
I am enjoying it. Right now, among others, I am experimenting with
some ideas to get more control over its behavior and more robustness
in certain situation. I would like to share these ideas. In
particular, I am describing the three related issues whose possible
solution may affect the current RMStore API and wanted to ask your
opinion before CXF 2.4.0 comes out.

1. Retry Behavior at Source Sequence
Currently, there is no maximum retry count and a retry can run forever
if the message is not acknowledged. I would like to introduce an
optional parameter to configure the maximum retry count. If the retry
count reaches this limit, the status of the message can be set to
undelivered or failed. The failed message can be removed from the
retransmission queue and may only be retried after a manual
intervention.

For this change, it is necessary to introduce this property itself and
this is simple. In addition, it is to decide whether to store the
status information of the message in the storage. In this case, the
retry count information becomes persistent. I think we can omit
storing this count information per message as it incurs increased
access to the storage. However, if all the unacknowledged messages in
a sequence are set failed, the sequence should be marked as failed in
the storage so that they can be excluded from being restarted at the
next start up.

2. SourceSequence's Expire handling
This field is stored in the source sequence but it does not seem to be
used during the restart of the endpoints to decide which messages must
be placed in the retransmission queue. This value along with the
sequence status value described in 1 should be used to control the
retry behavior of the old unacknowledged messages.

3. Sequence caching in memory
Currently, the source and destination sequences are loaded into memory
from the storage at the startup of the endpoints. This may consume an
increased amount of unnecessary memory if many of the sequences are
not active while not yet expired. This situation may happen when
several conditions are satisfied, for example, when the sequence
termination policy configured to limit the number of unacknowledged
messages per sequence, occurring frequent transmission errors, and
messages generated at a high rate.

For the source sequence, using the change suggested for point 1 and 2,
we can decrease the number of active source sequences. In this case,
only those active source sequences can be read from the storage and
their associated unacknowledged messages can be placed in the
retransmission queue.

For the destination sequence, the situation is different (as there is
no retry) and some no-expiration-set sequences may remain alive
although they may be used only infrequently or perhaps not at all. The
good news, however, is that we need the sequence only when a message
with that particular sequence ID arrives. In this case, some fixed
number of destination sequences can be held in memory and a
destination sequence can be looked up in the storage upon this cache
miss.

To achieve this on-demand loading of the destination sequences, I
added in RMStore a new method to retrieve a single destination
sequence instance given its sequence ID. In addition, considering
points 1 and 2, I would like to have sequence retrieval methods to
retrieve the expired or failed sequences. Here, I am not sure how I
should name them (or rather use an additional filter parameter to the
getSourceSequences method). In either case, this affects the RMStore
interface unless we opt for introducing another API, I wanted to get
your suggestion before 2.4 comes out.

I would greatly appreciate your suggestion.

Best regards, Aki

Reply via email to