[jboss-dev-forums] [Design of Messaging on JBoss (Messaging/JBoss)] - Paging can cause the order of message delivery broken (1.4)
gaohoward
do-not-reply at jboss.com
Mon Jul 20 02:02:26 EDT 2009
The paging can disrupt the order of message delivery in the following way:
1. Starting a queue with fullSize=20, pageSize=10, downCacheSize=10
2. Sending 35 persistent messages (m0 to m34) to the queue
3. The JBM_MSG_REF table will look like this:
| +------------------+----------+
| | MESSAGE_ID | PAGE_ORD |
| +------------------+----------+
| | m0's id | NULL |
| | .... | NULL |
| | m19's id | NULL |
| | m20's id | 0 |
| | .... | 5 |
| | m29's id | 9 |
| | m30's id | NULL |
| | .... | NULL |
| | m34's id | NULL |
| +------------------+----------+
|
No the order of messages in the table is exactly the same order as they were added to the in-memory queue, only
that m20 to m34 are paged and waiting to be loaded to the in-mem queue. Please note that messages m0 to m19 have
NULL page_ord because they are in-memory messages, messages m20 to m29 have non-null page_ord values because they
have been paged down to DB, messages m30 to m34 have NULL page_ord values because they are in the down cache and haven't
yet been written to DB.
If we at the moment shutdown and restart the server, the messages will be loaded from the DB in the same order as before.
But if we cosume a message (m19) before shutdown, it's possible that the table may look like this
| +------------------+----------+
| | MESSAGE_ID | PAGE_ORD |
| +------------------+----------+
| | m0's id | NULL |
| | .... | NULL |
| | m18's id | NULL |
| | m20's id | 0 |
| | .... | 5 |
| | m29's id | 9 |
| | m30's id | NULL |
| | .... | NULL |
| | m34's id | NULL |
| +------------------+----------+
|
Now if we start the server again, it will load m0 to m18, plus m30 into the in-memory queue and update the paging status. The key sql statement is this
| LOAD_UNPAGED_REFS=SELECT MESSAGE_ID, DELIVERY_COUNT, SCHED_DELIVERY FROM JBM_MSG_REF WHERE STATE = 'C' AND CHANNEL_ID = ? AND PAGE_ORD IS NULL ORDER BY ORD
|
This will cause m30 to be delivered before messages m20 to m29. So the order is broken.
View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4244556#4244556
Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4244556
More information about the jboss-dev-forums
mailing list