I've done quite the digging in MQTT and I have found one major flaw: you cannot implement an efficient chat.
Imagine N users in a chat room. Each connection is subscribed to the chat room and publishes messages to it. Now, you don't want the sender of a message to receive it from the chat room (that would be 1 extra send, not needed since the sender already knows what it sent).
There is no way to specify that a publish should be sent to everyone EXCEPT the sender. There is also no way to subscribe to a set of topics EXCEPT one. So if we want to solve this by having each user be its own topic, and have every other user subscribe to all other clients topics (which is incredibly inefficient), you get tremendous amounts of subscribe/unsubscribe overhead and it simply doesn't scale.
What the standard needs is:
* Publish flags that specify "exclude the sender if he is subscriber" (this is the behavior of Socket.IO and many others).
* XOR-wildcards (all-but-one): chatRoom/~client1 (same as chatRoom/#, but not including client1)
MQTT already works fine if you have producer and consumer separate like a sensor and a monitor, but as soon as you want to make things like a chat where you have the producer and the consumer overlap there is no efficient way to express this. I have asked many people and they have no good answer to this problem even though it is a no-brainer example of pub/sub.