Sobre o "exige consumidores idempotentes", no Service Bus a duplicata aparece mesmo sem nenhum erro. No modo padrão (peek-lock) a mensagem fica travada pro consumidor durante o lock duration, que por padrão é 1 minuto. Se o processamento passar disso, o lock expira, a mensagem volta pra fila e outro consumidor pega de novo. O ServiceBusProcessor do SDK renova o lock sozinho até o MaxAutoLockRenewalDuration (5 minutos por padrão), então job mais longo que isso precisa de ajuste.
E a detecção de duplicatas do próprio Service Bus só pega mensagem repetida com o mesmo MessageId dentro da janela configurada. Ela protege contra o produtor reenviando, mas não contra o consumidor processando duas vezes. Também só dá pra ligar na criação da fila e ela não existe no tier Basic.