En utgivare -prenumerant eller pub / sub är ett beteendemönster för meddelandeutformning där meddelandeavsändare , kallade utgivare , inte är direkt bundna till prenumeranter av .meddelandekoden Istället är meddelanden indelade i klasser och innehåller ingen information om eventuella prenumeranter. På samma sätt hanterar prenumeranter en eller flera klasser av meddelanden, abstraherar från specifika utgivare.
Publisher-subscriber-mönstret är en förlängning av observatörsmönstret som lägger till en beskrivning av en händelsekanal som är speciellt utformad för händelseavisering [1] .
Mönstret för utgivare och prenumeranter, tillsammans med det relaterade konceptet med en meddelandekö, är en del av den händelsedrivna middleware-verktygssatsen i ett stort system. De flesta meddelandesystem stöder både en publiceringsprenumerationsmodell och en meddelandekö i deras API . Ett exempel på ett sådant system skulle vara Java Message Service (JMS) [1] .
Detta mönster ger större skalbarhet och en mer dynamisk nätverkstopologi .
I en utgivare-abonnentmodell får prenumeranter vanligtvis endast en delmängd av alla publicerade meddelanden. Processen att välja meddelanden att ta emot och bearbeta dem kallas filtrering . Det finns två huvudformer av filtrering: ämnesbaserad och innehållsbaserad .
I ett ämnesbaserat system publiceras meddelanden i "ämnen" eller namngivna logiska rör. Prenumeranter i sådana system kommer att få alla meddelanden som publiceras i de ämnen de prenumererar på, och alla prenumeranter som prenumererar på samma ämne kommer att få samma meddelanden. Utgivaren ansvarar för att fastställa de meddelandeklasser som prenumeranter prenumererar på.
I ett innehållsbaserat system levereras meddelanden till abonnenter endast om attributen eller innehållet i dessa meddelanden accepteras av abonnenten. I detta system är abonnenten ansvarig för att klassificera meddelanden.
Vissa system är en hybrid mellan de två: en utgivare skickar meddelanden till ett ämne, medan prenumeranter registrerar en innehållsbaserad prenumeration för ett eller flera ämnen.
I många implementeringar av utgivare-abonnentmönstret skickar utgivaren meddelanden till en mellanhand, som kan vara en meddelandeförmedlare eller en buss. I ett sådant fall registrerar prenumeranter ett abonnemang hos denna filtreringsmäklare. Mäklaren utför vanligtvis meddelandelagring och vidarebefordran för att dirigera meddelandet från utgivaren till abonnenten. Dessutom kan en mäklare prioritera meddelanden i en meddelandekö innan den dirigerar dem.
Prenumeranter kan prenumerera på specifika meddelanden vid kodningstid, under programinitiering eller vid körning. På system med ett grafiskt användargränssnitt kan abonnenter prenumerera manuellt med hjälp av kommandon (som att trycka på en knapp). Vissa ramverk och programvara använder konfigurationsfiler i XML- eller JSON -format för prenumeration , sådana filer läses under initiering. Andra programvarusystem kan lägga till eller ta bort en prenumeration under körning, till exempel databasutlösare eller RSS .
De flesta DDS -distribuerade realtidssystem använder inte mäklare. Istället delar varje utgivare och prenumerant metadata om varandra. Utgivaren och abonnenten cachelagrar denna information lokalt och dirigerar meddelanden baserat på denna information.
Publisher-subscriber-mönstret presenterades först offentligt 1987 av Association for Computing Machinery (ACM) vid Operating Systems Principles Symposium på SOSP '87, i artikeln "Applying virtual synchrony to distributed systems. 123-138” [2] som en del av Isis Toolkit-nyhetsundersystemet.