SQL Server asynchrone Trigger & Service Broker im Repository
Da schreibe ich über unsere Repositories und schon gibst Schimpfe aus der Community! Sascha hat gesagt, dass er Trigger einsetzt… geht ja man mal gar nicht! So von wegen schlechtes Vorbild und so! Trigger sind doch so was von bööööööööse…… kommen gleich nach Cursorn! :-)
Recht habt Ihr! Grundsätzlich in einer LOB / OLTP Umgebung bin ich sehr selten ein Fan von Triggern. Wobei ich diese Diskussion immer wieder mit ISVs führen muss. Daher hier jetzt mal ein paar Worte dazu…
Warum sind Trigger eigentlich böse? Sind doch ne coole Sache, oder?
Ja, Trigger sind von der Idee her sogar äußerst praktisch. Logik wird ausgelöst durch ein DML oder DDL Statement. Es muss nicht extra eine Prozedur gestartet werden. Das unerfreulich an einem Trigger ist die Tatsache, dass er out-of-the-box immer synchron ist. Das geht leider ganz gewaltig zu Kosten der Gesamtperformance eines Systems, wenn da ein wenig mehr Last drauf kommt. Damit ist gemeint, dass die Aktion, welche der Trigger startet, immer GENAU in dem Moment “passiert”, in welchem der Trigger aufgerufen wird. Das macht in einigen Bereichen durchaus Sinn, aber in den meisten Fällen ist diese 100% Synchronität nicht notwendig. Zum Beispiel in fast all meinen Repository Beispielen. Daher verwenden wir so genannte asynchrone Trigger!
Ok, was sind denn jetzt bitte asynchrone Trigger?
Mit asynchronen Triggern meinen wir in der Regel einen Trigger, welcher einen Service Broker Service (Service ist immer wichtig…) nutzt! Service Broker führt leider in sehr vielen Umgebungen ein Schattendasein, obwohl es jedem, wirklich JEDEM, SQL Server seit 2005 “beiliegt”. (Ok, von kleinen Einschränkungen mal abgesehen.) Und Trigger sind, neben vielen anderen, ein sehr gutes Beispiel für den produktiven und überhaupt nicht esoterischen Einsatz von Service Brokern!
Und was ist dieser “Service Broker”? Und brauche ich dafür eine Enterprise Edition?
Hier kommt ein wenig Text aus der BOL: “Service Brokerunterstützt Datenbankentwickler beim Erstellen zuverlässiger und skalierbarer Anwendungen. Da Service Broker Teil von Database Engine (Datenbankmodul) ist, ist auch die Verwaltung dieser Anwendungen Teil der routinemäßigen Verwaltung der Datenbank.
Service Broker stellt für SQL Server Queuing und zuverlässiges Messaging bereit. Service Broker wird für Anwendungen verwendet, die eine einzige Instanz von SQL Server verwenden, sowie für Anwendungen, die Arbeit über mehrere Instanzen verteilen.
Innerhalb einer SQL Server-Instanz stellt Service Broker ein leistungsfähiges asynchrones Programmierungsmodell bereit. Datenbankanwendungen verwenden normalerweise asynchrone Programmierung, um die interaktive Antwortzeit zu verkürzen und den Anwendungsdurchsatz allgemein zu erhöhen.
Außerdem bietet Service Broker zuverlässiges Messaging zwischen SQL Server-Instanzen. Service Broker unterstützt Entwickler beim Konzipieren von Anwendungen aus unabhängigen, eigenständigen Komponenten, den so genannten Diensten. Anwendungen, die die über diese Dienste bereitgestellte Funktionalität benötigen, verwenden für die Interaktion mit den Diensten Nachrichten. Service Broker verwendet TCP/IP für den Austausch von Nachrichten zwischen Instanzen. Service Broker enthält Features, die den nicht autorisierten Zugriff über das Netzwerk verhindern helfen und über das Netzwerk gesendete Nachricht verschlüsseln.”
Das liest sich für viele Entwickler äußerst spannend, aber leider häufig auch ein wenig weit weg von ihren täglichen Herausforderungen! Dem ist aber gar nicht so! Daher, gebt dem Service Broker eine Chance! Bald wollt Ihr nicht mehr ohne! –> “Service Broker” gefällt mir!