With QOS=0, the client sends a message and forgets about it. Since
it's riding on top of a TCP connection, there's a pretty good chance
that it will arrive at the broker, unless the network connection is
dropped in the middle of the transmission. But you don't "know."
With QOS=1, the broker sends an ACK back to the client for each
individual message. Only after receiving the ACK does the client
consider the publish "transaction" complete. If the client doesn't
receive the ACK after a reasonable amount of time, it re-sends the
original message. This is normally done by the client library
without any additional work for the app.
If the ACK got lost or the server took too long to send it, the
client will re-transmit the message, and this second copy of the
message will arrive and be sent to the subscribers. If this second
copy is acceptable, then QOS=1 is fine. But if you need to make sure
that one-and-only-one copy of each message arrives, then consider
QOS=2. This involves another pair of handshake messages, but might
be worthwhile.
So QOS=0 makes no promises; QOS=1 insures that individual messages
arrive properly one or more times; QOS=2 insures that messages
arrive once and only once.
But your solution is the best thing: Try QOS=1 and compare.
Frank