En händelsedriven arkitektur ( EDA ) är ett mjukvaruarkitekturmönster som tillåter skapande, definition, konsumtion och respons på händelser .
En händelse kan definieras som en "stor förändring i tillståndet " [1] . Till exempel, när en kund köper en bil ändras bilens tillstånd från "till salu" till "såld". Bilhandlarens systemarkitektur kan behandla denna tillståndsändring som en händelse skapad, publicerad, definierad och konsumerad av de olika applikationerna inom arkitekturen.
Detta arkitektoniska mönster kan tillämpas vid design och implementering av applikationer och system som kommunicerar händelser mellan löst kopplade programvarukomponenter och tjänster . Ett händelsedrivet system innehåller vanligtvis händelsekällor (eller agenter) och händelsekonsumenter (eller sänkor). Sinks ansvarar för att svara när en händelse har inträffat. Reaktionen kan eller kanske inte genereras helt av diskhon. Till exempel kan en diskbänk endast vara ansvarig för att filtrera, transformera och leverera en händelse till en annan komponent, eller så kan den skapa sin egen reaktion på denna händelse. Den första kategorin av sänkor kan vara baserad på traditionella komponenter som meddelandemellanprogram, och den andra kategorin sänkor (som bildar sitt eget svar när den körs) kan kräva en mer lämplig plattform för transaktionsexekvering.
Genom att skapa applikationer och system inom en händelsedriven arkitektur kan de designas på ett sätt som främjar bättre interaktivitet, eftersom händelsedrivna system är mer strukturerade mot oförutsägbara och asynkrona miljöer [2] .
En händelsedriven arkitektur motsvarar en tjänsteorienterad arkitektur (SOA) eftersom tjänster kan aktiveras av triggers som utlöses från inkommande händelser [2] [3] .
Detta paradigm är särskilt användbart när diskbänken inte tillhandahåller sin egen utförande av åtgärder.
Event Driven Service Oriented Architecture utvecklar SOA- och EDA-arkitekturer för att tillhandahålla ett djupare och mer robust lager av tjänster genom att utnyttja tidigare okända orsak- och verkansrelationer för att bilda en ny händelsemodell. Detta nya affärsintelligensmönster leder till ytterligare automatisering av bearbetningen, vilket tillför företaget en tidigare ouppnåelig produktivitet genom att injicera värdefull information i det erkända aktivitetsmönstret.
En händelse kan bestå av två delar: en händelsehuvud och en händelsetext. Händelsehuvudet kan innehålla information såsom namnet på händelsen, tidsstämpeln för händelsen och typen av händelse. Händelsetexten beskriver vad som faktiskt hände. Brödtexten i en händelse ska inte förväxlas med mallen eller logiken som kan användas som svar på händelser.
Den händelsedrivna arkitekturen består av fyra logiska lager. Det börjar med själva ljudet, dess tekniska representation i form av en händelse, och slutar med en icke-tom uppsättning reaktioner på denna händelse. [fyra]
Det första logiska lagret är händelsegeneratorn, som registrerar ett faktum och representerar det faktumet som en händelse. Eftersom praktiskt taget allt som kan uppfattas kan vara ett faktum, så kan även en händelsegenerator. Som ett exempel kan generatorn vara en e-postklient, ett e-handelssystem eller någon typ av sensor. Att konvertera de olika sensordata till en enda, standardiserad form av data som kan utvärderas är en stor utmaning i utformningen och implementeringen av detta lager. [4] Men med tanke på att händelsen är strikt deklarativ kan alla omvandlingsoperationer enkelt tillämpas, vilket eliminerar behovet av en hög standardiseringsnivå.
En händelsekanal är en mekanism genom vilken information skickas från en händelsegenerator till en händelsehanteringsmekanism [4] eller sink.
Detta kan vara en TCP/IP-anslutning eller vilken typ av indatafil som helst (oformaterad text, XML-format, e-post, etc.) Flera händelsekanaler kan vara öppna samtidigt. På grund av kraven på händelsebearbetning i nästan realtid läses händelsekanaler typiskt asynkront. Händelser lagras i en kö och väntar på senare bearbetning av händelsemotorn.
Händelsehanteringsmekanismen är platsen där en händelse identifieras och en lämplig reaktion på den väljs, som sedan exekveras. Detta kan också resultera i att ett antal påståenden genereras. Till exempel, om en händelse som har anlänt till bearbetningsmotorn rapporterar att "Produkt N håller på att ta slut", kan detta faktum generera reaktionerna "Beställ produkt N" och "Meddela personal". [fyra]
Här är konsekvenserna av händelsen. Det kan yttra sig på olika sätt och former; till exempel ett meddelande som skickats till någon, eller ett program som visar någon form av varning på skärmen. [4] . Beroende på nivån av automatisering som tillhandahålls av diskbänken (händelsemotorn), kanske dessa steg inte är nödvändiga.
Det finns tre huvudsakliga händelsehanteringsstilar: enkel, gängad och komplex. Ofta används dessa tre stilar tillsammans i en stor händelsestyrd arkitektur [4] .
Enkel händelsehantering avser händelser som är direkt relaterade till specifika mätbara förändringar i förhållandena. Med enkel händelsehantering uppstår kända händelser som utlöser efterverkningar. Enkel händelsehantering används vanligtvis för att hantera arbetsflödet i realtid, och därigenom minska latens och kostnad [4] .
Enkla händelser genereras till exempel av en sensor som upptäcker en förändring i däcktrycket eller omgivningstemperaturen.
Under händelseströmsbehandling (ESP) inträffar både normala och kända händelser. Regelbundna händelser (kommandon, RFID-sändningar) kontrolleras för kunskap och sänds till informationsabonnenter. Händelseflödesbearbetning används vanligtvis för att hantera informationsflödet i realtid och på företagsnivå, vilket möjliggör beslutsfattande i rätt tid [4] .
Komplex händelsebearbetning låter dig överväga sekvenser av enkla och vanliga händelser och härleda förekomsten av en komplex händelse. Komplex händelsebearbetning utvärderar händelsernas ömsesidiga påverkan och vidtar sedan åtgärder. Händelser (kända eller vanliga) kanske inte följer skrivningen och inträffar under långa tidsperioder. Händelsekorrelation kan vara kausal, tidsmässig eller rumslig. Att hantera komplexa händelser kräver användning av komplexa händelsetolkare, händelsemönster och matchning samt korrelationsmetoder. Komplex händelsebearbetning används vanligtvis för att identifiera och reagera på avvikande beteenden, hot och möjligheter [4] .
Den händelsedrivna arkitekturen är extremt löst kopplad och väl distribuerad. Den bästa fördelningen av denna arkitektur beror på att en händelse kan vara vad som helst som existerar var som helst. Arkitekturen är extremt löst kopplad, eftersom händelsen i sig inte känner till konsekvenserna av dess inträffande, det vill säga om vi har ett säkerhetssystem som registrerar information när ytterdörren öppnas, då vet inte själva dörren att säkerhetssystemet kommer att lägga till information om öppningen av dörren. [fyra]
Java Swing - biblioteket är baserat på en händelsedriven arkitektur. Detta stämmer särskilt väl med Swings motivation att tillhandahålla UI-relaterade komponenter och funktionalitet. Gränssnittet använder namnkonventioner (som "ActionListener" och "ActionEvent") för att organisera relationer mellan händelser. En klass som behöver meddelas om någon händelse implementerar helt enkelt lämplig avlyssnare, åsidosätter ärvda metoder och läggs till i objektet som skapar händelsen. Nedan är det enklaste exemplet:
public class FooPanel utökar JPanel implementerar ActionListener { public FooPanel () { super (); JButton btn = new JButton ( "Klicka på mig!" ); btn . addActionListener ( detta ); detta . add ( btn ); } @Override public void actionPerformed ( ActionEvent ae ) { System . ut . println ( "Knappen har klickats!" ); } }Ett alternativ är att bädda in lyssnaren i objektet som en anonym klass . Nedan följer ett exempel.
public class FooPanel utökar JPanel { public FooPanel () { super (); JButton btn = new JButton ( "Klicka på mig!" ); btn . addActionListener ( ny ActionListener () { public void actionPerformed ( ActionEvent ae ) { System . out . println ( "Knappen har klickats på!" ); } }); } }Samma Java 8 funktionella stilkod, med en lambda istället för en anonym klass:
public class FooPanel utökar JPanel { public FooPanel () { super (); JButton btn = new JButton ( "Klicka på mig!" ); btn . addActionListener ( ae -> System . out . println ( "Knappen har klickats!" )); } }JavaScript-plattformen på serversidan använder i stor utsträckning händelsegeneratorer ( EventEmitter ). Många objekt i Node genererar händelser: net.Server höjer en händelse vid varje inkommande begäran, fs.readStream höjer en händelse när en fil öppnas. Exempel på att arbeta med EventEmitter:
bar.js:
var Foo = require ( "./foo.js" ). Foo , foo = ny Foo (); foo . addListener ( "skriva" , funktion () { console . log ( "Bar" ); });foo.js:
var EventEmitter = require ( "händelser" ). EventEmitter , Foo = function () { var foo = this ; foo . skriv = funktion () { konsol . log ( "foo" ); foo . emit ( "skriv" ); }; setTimeout ( denna .skriva , 3000 ) ; }; foo . prototyp = ny EventEmitter (); export . foo = foo ;