A single memory queue is easy to support FIFO(first in, first out) semantic, inspired by that, many messaging systems support ordered messaging in a storage queue/partition.
Ordered Messaging is designed to enhance messaging between applications when the order of operations and events is critical, for example:
- The chat messages should be displayed orderly in the same chat channel.
- Execute the concurrent modifications in the right order, like product price.
- The operations of the same user should be executed orderly in the electricity system.
As described earlier, it's easy to support ordered messaging in a single queue/partition, the producer can send a kind of messages to the fixed partition with a sharding key. But this solution doesn't have a good scalability and has hot-pot issue obviously.
To resolve this issue, we need a global ordered messaging mechanism to have a good scalability without hot-pot issue.
A practical proposal is that sending messages to distributed queue/partition with an ordered key. Messages are ordered in the same queue, then implement an OrderConsumer to pull messages from these queues then perform merge sort, finally deliver these ordered messages to users.