Efcore does not natively support row level locking, this makes it possible for two instances of your app to compete over the next available message to be processed, potentially wasting cycles. For this reason it is reccomended that you only use AsyncMonolith.Ef when you are running a single instance of your app OR for development purposes. Using AsyncMonlith.PostgreSql / AsyncMonolith.MySql / AsyncMonolith.MsSql / AsyncMonolith.MariaDb will allow the system to lock rows ensuring they are only retrieved and processed once.
Test your desired throughput
All consumers must finish executing for a batch of messages before the next batch is started, therefore it is not currently reccomended to execute long running tasks inside your consumers. If you have a need for this please get in touch.