Had a discussion with @lakshmi-kannan again about this. More insight into what is happening:
1. All the messages will be placed in a queue when we operate in an async mode.
2. One thread will operate on the queue, dequeueing the messages, collating them per partition/topic and sending them to the leader for the partition in sync mode.(blocking call)
3. If for some reason this call blocks forever, the queue will get full and start throwing `QueueFullException`

We decided to configure the `number_of_producers` to 1 now i.e having the same effect as only one producer, see the performance and then take it ahead from their.