Search code examples
databasemqttmosquitto

I want to log all mqtt messages of the broker. How should I design schema of database. Avoiding dulplicate entries and fast searching


I am implementing a callback in java to store messages in a database. I have a client subscribing to '#'. But the problem is when this # client disconnects and reconnect it adds duplicate entries in the database of retained messages. If I search for previous entries bigger tables will be expensive in computing power. So should I allot a separate table for each sensor or per broker. I would really appreciate if you suggest me better designs.


Solution

  • Subscribing to wildcard with a single client is definitely an anti-pattern. The reasons for that are:

    1. Wildcard subscribers get all messages of the MQTT broker. Most client libraries can't handle that load, especially not when transforming / persisting messages.
    2. If you wildcard subscriber dies, you will lose messages (unless the broker queues endlessly for you, which also doesn't work)
    3. You essentially have a single point of failure in your system. Use MQTT brokers which are hardened for production use. These are much more robust single point of failures than your hand-written clients. (You can overcome the SIP through clustering and load balancing, though).

    So to solve the problem, I suggest the following:

    • Use a broker which can handle shared subscriptions (like HiveMQ or MessageSight), so you can balance all messages between many clients
    • Use a custom plugin for doing the persistence at the broker instead of the client.

    You can also read more about that topic here: http://www.hivemq.com/blog/mqtt-sql-database