Mit Spring skalieren - JAXenter
Skalierbarkeit ist eine Eigenschaft, die jede gute Anwendung hat. Wie bekommt man das mit Spring hin?

Mit Spring skalieren

Eberhard Wolff

Das Spring-Framework hat in vielen Projekten gezeigt, dass es sich als Basis für die Entwicklung mit Java hervorragend eignet. Aber wie beeinflusst es nicht-funktionale Anforderungen wie Skalierbarkeit?

Um den Artikel zu strukturieren, sollten zunächst einige Begriffe geklärt werden:

  • Performance bezeichnet die Eigenschaft einer Anwendung, Funktionalitäten schnell abarbeiten zu können. Umgangssprachlich: „Wow, ist das schnell!“. Man kann Performance aufschlüsseln nach der Latenz, die bis zur Erledigung einer Aufgabe benötigt wird, und dem Durchsatz, also wie viele Aktionen einer bestimmten Art pro Zeiteinheit erfolgen können.
  • Skalierbarkeit bezeichnet die Eigenschaft einer Anwendung, bei mehr Ressourcen auch mehr Performance zu erbringen. Im besten Fall ist der Zusammenhang linear: x-mal mehr Ressourcen sorgen für x-mal mehr Performance. In der Realität muss man eher mit z.B. x*0,8-mal mehr Performance wegen eines Overheads rechnen. Auf jeden Fall kann man die Performance beliebig erhöhen, indem man mehr Ressourcen hinzufügt – in der Praxis erreicht man dies meistens nicht, sondern kommt irgendwann an eine Skalierungsgrenze. Umgangssprachlich: „Nachdem wir einen Cluster mit zwei Rechnern haben, ist die Anwendung tatsächlich fast doppelt so schnell.“

Wie kann man nun eine Anwendung skalieren lassen? Dazu lohnt es sich, wieder zwei Begriffe zu klären:

  • Ein Framework bietet ein Programmiermodell, das den Entwickler unterstützt. Wesentliche Eigenschaften sind Integration mit verschiedenen Technologien und Modularität, d.h. idealerweise muss man nicht das gesamte Framework nutzen, sondern kann einzelne Teile verwenden.
  • Eine Plattform bietet eine Ablaufumgebung für eine Anwendung. Typische Beispiele sind ein Application Server oder ein Web Server. Er hat Features wie Management oder Fail Over. Und auch die Performance und die Skalierbarkeit hängen von der Plattform ab – so kann die Plattform beispielsweise eine Unterstützung für Clustering anbieten oder nicht.

Spring gehört nun ganz klar in den Bereich der Frameworks. Ein Framework und eine Plattform bilden zusammen die Infrastruktur für eine Anwendung. An dieser Stelle könnte man den Artikel beenden – Spring ist ein Framework, aber die Plattform entscheidet über die Skalierbarkeit. Es macht also anscheinend keinen Sinn, über die Skalierbarkeit von Spring zu sprechen.

So einfach ist es aber nicht. Spring hat nämlich ein eigenes Programmiermodell, das plattformunabhängig ist. Der Code einer Spring-Anwendung hängt nicht mehr von der verwendeten Plattform ab. Dadurch kann die Anwendung auf verschiedenen Plattformen laufen, ohne dass man den Code ändert – sondern lediglich die Spring-Konfiguration. Beispiele für dieses Feature sind:

  • Das Transaktionsmanagement kann lokale Transaktionen verwenden, die nur eine Datenbank oder eine andere transaktionale Ressource umfassen. Ohne Änderung des Codes kann man aber auch verteilte Transaktionen mit mehreren transaktionalen Ressourcen verwenden, wenn die Plattform das unterstützt – also zum Beispiel ein Application Server verwendet wird.
  • Durch Dependency Injection können Ressourcen aus verschiedenen Quellen kommen – also beispielsweise lokal erzeugt werden oder durch einen Plattform zur Verfügung gestellt werden.
  • Ebenfalls ist es möglich, Spring Beans in Komponenten der verschiedenen Plattformen zu verwandeln. So kann man eine Spring Bean als Web Service, über andere HTTP-Protokolle, als OSGi-Service oder als EJB exportieren. Analog ist es möglich, Dienste, die über solche Protokolle angeboten werden, wie normale Spring-Beans zu importieren und zu nutzen.
Geschrieben von
Eberhard Wolff
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.