Rilevamento duplicati

Se un'applicazione non riesce a causa di un errore irreversibile immediatamente dopo l'invio di un messaggio e l'istanza dell'applicazione riavviata ritiene erroneamente che il recapito del messaggio precedente non si sia verificato, un invio successivo fa sì che lo stesso messaggio venga visualizzato due volte nel sistema.

È anche possibile che si verifichi un errore a livello di client o di rete un attimo prima e che venga eseguito il commit di un messaggio inviato nella coda, con il riconoscimento non restituito correttamente al client. Questo scenario lascia il client in dubbio sull'esito dell'operazione di invio.

Il rilevamento dei duplicati consente di evitare queste situazioni, consentendo al mittente di inviare nuovamente lo stesso messaggio che, se duplicato, verrà rimosso automaticamente dalla coda o dall'argomento.

Nota

Il livello di base di bus di servizio non supporta il rilevamento dei duplicati. I livelli Standard e Premium supportano il rilevamento dei duplicati. Per le differenze tra questi livelli, vedere Prezzi del bus di servizio.

Funzionamento

Abilitare il rilevamento dei duplicati consente di tenere traccia di MessageId controllato dall'applicazione di tutti i messaggi inviati a una coda o un argomento durante un intervallo di tempo specificato. Se un nuovo messaggio viene inviato con MessageId che è stato registrato durante l'intervallo di tempo, il messaggio viene segnalato come accettato (l'operazione di invio ha esito positivo), ma il messaggio appena inviato viene immediatamente ignorato ed eliminato. Viene presa in considerazione esclusivamente la parte MessageId del messaggio.

Il controllo dell'applicazione dell'identificatore è essenziale, perché consente solo all'applicazione di collegare MessageId a un contesto di processo aziendale da cui può essere ricostruito in modo prevedibile quando si verifica un errore.

Per un processo aziendale in cui vengono inviati più messaggi nel corso della gestione di un contesto dell'applicazione, può MessageId essere una composizione dell'identificatore di contesto a livello di applicazione, ad esempio un numero di ordine di acquisto e l'oggetto del messaggio, ad esempio 12345.2017/pagamento.

Può MessageId essere sempre un GUID, ma ancorando l'identificatore al processo aziendale si ottiene una ripetibilità prevedibile, che si desidera usare in modo efficace la funzionalità di rilevamento duplicati.

Importante

  • Quando il partizionamento è abilitato, MessageId+PartitionKey viene usato per determinare l'univocità. Quando le sessioni sono abilitate, la chiave di partizione e l'ID sessione devono essere uguali.
  • Quando il partizionamento è disabilitato (impostazione predefinita), viene usato solo MessageId per determinare l'univocità.
  • Per informazioni su SessionId, PartitionKeye MessageId, vedere Uso delle chiavi di partizione.

Nota

I messaggi pianificati sono inclusi nel rilevamento duplicati. Pertanto, se si invia un messaggio pianificato e quindi si invia un messaggio duplicato non pianificato, il messaggio non pianificato viene eliminato. Analogamente, se si invia un messaggio non pianificato e quindi un messaggio pianificato duplicato, il messaggio pianificato viene eliminato.

Dimensioni della finestra di rilevamento duplicati

Oltre ad abilitare solo il rilevamento dei duplicati, è anche possibile configurare le dimensioni dell'intervallo di tempo della cronologia di rilevamento duplicati durante il quale vengono conservati gli ID messaggio. Il valore predefinito è 10 minuti per le code e gli argomenti, con un valore minimo di 20 secondi fino al valore massimo di 7 giorni.

L'abilitazione del rilevamento dei duplicati e delle dimensioni della finestra influiscono direttamente sulla velocità effettiva della coda (e dell'argomento), poiché tutti gli ID dei messaggi registrati devono essere confrontati con l'identificatore del messaggio appena inviato.

Mantenere la finestra piccola significa che un minor numero di ID messaggio deve essere mantenuto e corrispondente e la velocità effettiva è meno interessata. Per le entità con velocità effettiva elevata che richiedono il rilevamento dei duplicati, è consigliabile ridurre la finestra al minimo.

Passaggi successivi

È possibile abilitare il rilevamento di messaggi duplicati usando portale di Azure, PowerShell, interfaccia della riga di comando, modello di Resource Manager, .NET, Java, Python e JavaScript. Per altre informazioni, vedere Abilitare il rilevamento dei messaggi duplicati.

Negli scenari in cui il codice client non è in grado di inviare nuovamente un messaggio con lo stesso MessageId di prima, è importante progettare messaggi che possono essere rielaborati in modo sicuro. Questo post di blog sull'idempotenza descrive varie tecniche per eseguire questa operazione.

Provare gli esempi nel linguaggio preferito per esplorare bus di servizio di Azure funzionalità.

Vedere gli esempi per le librerie client .NET e Java precedenti qui:

Il 30 settembre 2026 verranno ritirati le librerie bus di servizio di Azure SDK WindowsAzure.ServiceBus, Microsoft.Azure.ServiceBus e com.microsoft.azure.servicebus, che non sono conformi alle linee guida di Azure SDK. Il supporto del protocollo SBMP verrà terminato, quindi non sarà più possibile usare questo protocollo dopo il 30 settembre 2026. Eseguire la migrazione alle librerie più recenti di Azure SDK, che offrono aggiornamenti critici della sicurezza e funzionalità migliorate, prima di tale data.

Anche se le librerie precedenti possono ancora essere usate oltre il 30 settembre 2026, non riceveranno più il supporto e gli aggiornamenti ufficiali da Microsoft. Per altre informazioni, vedere l'annuncio di ritiro del supporto.