SQL Server asynchrone Trigger & Service Broker im Repository

By Sascha Lorenz

Posted on Jan 26, 2011 von in Allgemein, SQL Server, Business Intelligence

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!

Dieser Eintrag wurde eingetragen von und ist abgelegt unter Allgemein, SQL Server, Business Intelligence.

4 Kommentare

Benutzerwertungen
5 Stern:
 
(2)
4 Stern:
 
(0)
3 Stern:
 
(0)
2 Stern:
 
(0)
1 Stern:
 
(0)
2 Bewertungen
Durschn. Benutzerwertung:
(5.0)
Ich bin der Meinung, dass weder Cursor noch Trigger an und für sich "böse" sind. Vielmehr werden sie vielfach für Sachen eingesetzt, für die sie nicht geeignet sind und/oder konzipiert wurden. Cursor werden häufig dann eingesetzt, wenn ein grundlegendes Verständnis zu Set-Based Logik fehlt, während Trigger häufig überfrachtet werden mit Aufgaben, die auch anderweitig gelöst werden können. Wie Du sagst, sind Trigger für kurze, knackige Aufgaben gut, hingegen sollte man sich nicht über Performance Probleme beschweren, wenn man innerhalb eines Trigger versucht, Mails zu verschicken... Wie würden uns auch gerne näher mit Service Broker beschäftigen, aber das würde unausweichlich zu intensiven Diskussionen mit dem Database Engineering und anderen Infrastrukturteams führen und das war es uns bisher einfach noch nicht wert. Vielleicht könntest Du ja etwas aus Deiner Praxis mit dem Broker berichten? Ich glaube schon, dass es da ein enormes Potential gibt.
26.01.11 @ 20:31
Sascha Lorenz
Der erste Absatz ist ja im Ironie-Modus... :-) Wurde eh schon gefragt, ob ich denn nicht doch mal ein wenig mehr an Beispielen für Repository & Co zeigen kann. Daher passt das gut da rein. Also, zeige ich nun auch ein wenig Service Broker und was wir damit so machen.
27.01.11 @ 11:31
Das habe ich auch so verstanden. :-) Freue mich schon auf die weiteren Beispiele!
27.01.11 @ 11:43
Christoph Ingenhaag
Zum Service Broker ist das Blog von Remus Rusano DIE Informationsquelle http://rusanu.com/
24.02.11 @ 16:54


Formular wird geladen...