Dubblettidentifiering
Om ett program misslyckas på grund av ett allvarligt fel omedelbart efter att ett meddelande har skickats, och den omstartade programinstansen felaktigt tror att den tidigare meddelandeleveransen inte skedde, orsakar en efterföljande sändning samma meddelande att visas i systemet två gånger.
Det är också möjligt att ett fel på klient- eller nätverksnivå inträffar en stund tidigare och att ett skickat meddelande checkas in i kön, där bekräftelsen inte returneras till klienten. Det här scenariot lämnar klienten osäker på resultatet av sändningsåtgärden.
Dubblettidentifiering tar bort tvivel från dessa situationer genom att aktivera avsändaren skicka samma meddelande igen, och kön eller ämnet tar bort eventuella duplicerade kopior.
Kommentar
Den grundläggande nivån för Service Bus stöder inte dubblettidentifiering. Standard- och Premium-nivåerna stöder dubblettidentifiering. Skillnader mellan dessa nivåer finns i Service Bus-priser.
Hur det fungerar
Genom att aktivera dubblettidentifiering kan du hålla reda på det programkontrollerade MessageId
som skickas till en kö eller ett ämne under en angiven tidsperiod. Om ett nytt meddelande skickas med MessageId
som loggades under tidsfönstret rapporteras meddelandet som godkänt (sändningsåtgärden lyckas), men det nyligen skickade meddelandet ignoreras omedelbart och tas bort. Inga andra delar av meddelandet än MessageId
beaktas.
Programkontroll av identifieraren är nödvändig, eftersom endast det gör att programmet kan koppla MessageId
till en affärsprocesskontext som kan återskapas förutsägbart när ett fel inträffar.
För en affärsprocess där flera meddelanden skickas under hantering av viss programkontext MessageId
kan det vara en sammansatt av kontextidentifieraren på programnivå, till exempel ett inköpsordernummer och ämnet för meddelandet, till exempel 12345.2017/betalning.
MessageId
Kan alltid vara vissa GUID, men förankring av identifieraren till affärsprocessen ger förutsägbar repeterbarhet, vilket önskas för att använda dubblettidentifieringsfunktionen effektivt.
Viktigt!
- När partitionering är aktiverat
MessageId+PartitionKey
används för att fastställa unikhet. När sessioner är aktiverade måste partitionsnyckeln och sessions-ID:t vara desamma. - När partitionering är inaktiverat (standard) används endast
MessageId
för att fastställa unikhet. - Information om
SessionId
,PartitionKey
ochMessageId
, finns i Använda partitionsnycklar. - När du använder partitionering och skickar batchar med meddelanden bör du se till att de inte innehåller någon partition som identifierar egenskaper. Eftersom deduplicering förlitar sig på att uttryckligen ange meddelande-ID:er för att fastställa unikhet rekommenderar vi inte att du använder deduplicering och batchbearbetning tillsammans med partitionering.
Kommentar
Schemalagda meddelanden ingår i dubblettidentifiering. Om du skickar ett schemalagt meddelande och sedan skickar ett duplicerat icke-schemalagt meddelande tas därför det icke-schemalagda meddelandet bort. På samma sätt tas det schemalagda meddelandet bort om du skickar ett icke-schemalagt meddelande och sedan ett duplicerat schemalagt meddelande.
Fönsterstorlek för duplicerad identifiering
Förutom att bara aktivera dubblettidentifiering kan du även konfigurera storleken på tidsfönstret för dubbletidentifieringshistorik under vilken meddelande-ID:t behålls. Det här värdet är som standard 10 minuter för köer och ämnen, med ett minsta värde på 20 sekunder till maximalt värde på 7 dagar.
Aktivering av dubblettidentifiering och fönstrets storlek påverkar direkt kön (och ämnets) dataflöde, eftersom alla inspelade meddelande-ID:er måste matchas mot den nyligen skickade meddelandeidentifieraren.
Att hålla fönstret litet innebär att färre meddelande-ID:er måste behållas och matchas, och dataflödet påverkas mindre. För entiteter med högt dataflöde som kräver dubblettidentifiering bör du hålla fönstret så litet som möjligt.
Nästa steg
Du kan aktivera duplicerad meddelandeidentifiering med hjälp av Azure Portal, PowerShell, CLI, Resource Manager-mall, .NET, Java, Python och JavaScript. Mer information finns i Aktivera identifiering av duplicerade meddelanden.
I scenarier där klientkoden inte kan skicka ett meddelande på nytt med samma MessageId som tidigare är det viktigt att utforma meddelanden som kan bearbetas på ett säkert sätt. Det här blogginlägget om idempotens beskriver olika tekniker för hur du gör det.
Prova exemplen på det språk du väljer för att utforska Azure Service Bus-funktioner.
- Azure Service Bus-klientbiblioteksexempel för .NET (senaste)
- Azure Service Bus-klientbiblioteksexempel för Java (senaste)
- Azure Service Bus-klientbiblioteksexempel för Python
- Azure Service Bus-klientbiblioteksexempel för JavaScript
- Azure Service Bus-klientbiblioteksexempel för TypeScript
Se exempel för äldre .NET- och Java-klientbibliotek här:
- Azure Service Bus-klientbiblioteksexempel för .NET (äldre)
- Azure Service Bus-klientbiblioteksexempel för Java (äldre)
Den 30 september 2026 drar vi tillbaka Azure Service Bus SDK-biblioteken WindowsAzure.ServiceBus, Microsoft.Azure.ServiceBus och com.microsoft.azure.servicebus, som inte följer Riktlinjerna för Azure SDK. Vi kommer också att avsluta stödet för SBMP-protokollet, så du kommer inte längre att kunna använda det här protokollet efter den 30 september 2026. Migrera till de senaste Azure SDK-biblioteken, som erbjuder kritiska säkerhetsuppdateringar och förbättrade funktioner, före det datumet.
Även om de äldre biblioteken fortfarande kan användas efter den 30 september 2026 får de inte längre officiell support och uppdateringar från Microsoft. Mer information finns i meddelandet om supportavgång.