The answers above are missing an important point about FIFO.
When a message arrives in a topic / queue in which separation is not enabled, FIFO * is observed for message delivery.
When you enable separation for the topic / queue and SessionId is used for the separation key, then the messages are no longer guaranteed as FIFOs relative to each other, they are guaranteed to be only FIFOs in relation to the section in which they were divided to.
An interesting fact is that sharing as a whole can have some interesting side effects if you have a small number of subscribers to the same subscription / queue, as the partition reader assignments are done in a cyclic style, and if you have more sections than subscribers, you can see that the messages are exhausted (verification from the SB team is required, this is empirically from the tests that I conducted on my own because my messages were exhausted).
* As @Dan Rosanova pointed out above, if you have asynchronous processing or multiple readers, then your message processing cannot be guaranteed as FIFO, but the order in which messages were distributed between the handlers will be FIFO.
When you use the Session message handler (which requires filling in the SessionId), you take it one step further and ensure that the messages are processed in order, as the Session message handler blocks SessionId + MessageId and not just MessageId, thus ensuring that other processors do not will receive other messages in the same session.
source share