In letzter Zeit liest man viel zu Mandantenfähigkeit – der Trend rund um die Cloud lässt diese Anforderung in den Vordergrund rücken, da sie verständlicherweise bei SAAS ein Muß ist. So liest man zu verschiedensten Frameworks / Tools, dass sie „mandantenfähig“ sind. Beispiele:
- Athena Framework
- Grails hat ein MultiTenant-Plugin
- Google App Engine
- Windows Azure Appfabric
Da gibt’s noch viel mehr – auch zahlreiche Blogeinträge und Dokumentationen zu anderen Frameworks, wie man Mandantenfähigkeit abbilden kann, z.B. mit Hibernate (http://relation.to/Bloggers/MultitenancyInHibernate).
Ach ja, und natürlich wird in Java EE 7 „Multi-Tenancy“ eingebaut sein (JSR-342 ), da Java EE 7 die „Cloud“ als wichtigen Treiber für die Java Enterprise Plattform auserkoren hat.
Seit Jahren begleitet mich das Thema Mandantenfähigkeit bei vielen Kunden (schon lange vor der Wolke) und immer war es eine Herausforderung. Und jetzt machen die Frameworks das einfach und mit Java EE 7 ist das dann auch noch standardisiert !
Aber was ist denn nun eigentlich mandantenfähig bei den Frameworks? Aus meiner Sicht gibt es Anforderungen an Mandantenfähigkeit auf verschiedensten Ebenen einer Applikation:
- Verschiedene Oberflächen für verschiedene Mandanten
- Andere Prozesse / Workflows innerhalb einer Anwendung
- Abweichende Geschäftslogik/-regeln je Mandant
- Disjunkte und gemeinsame Daten von Mandanten
- u.v.m.
Ein einfacher Blick in die Dokumentation der verschiedenen Frameworks zeigt jedoch schnell, dass sie immer nur Teilaspekte von Mandantenfähigkeit adressieren. Ist auch korrekt, dass z.B. ein OR-Mapper nur die bekannten Pattern zur Abbildung von Mandanten-Daten (getrennte Datenbanken, eine Datenbank mit getrennten Tabellen, Daten der Mandanten in den gleichen Tabellen, etc.) abbilden muss – und nichts anderes. Das hilft aber schon mal weiter. Viele Frameworks bieten ein Konzept mandantenfähgkeit von Geschäftslogik/-regeln nicht an.
Interessanter werden schon noch die Frameworks, die eher einen kompletten Stack abbilden – z.B. Spring oder Java EE.
Für Java EE 7 ist es noch zu früh wirklich zu sagen, in welchen Bereichen/APIs Manandentfähigkeit Verwendung finden wird. Im Summary des JSRs findet man, dass bestimmte APIs wie JPA, JDBC oder JMS auf Mandantenfähigkeit ausgelegt werden:
…. In particular, all resource manager-related APIs, such as JPA, JDBC and JMS, will be updated to enable multitenancy….
Auch wird man in Java EE über Metadaten zu einer Applikation hinterlegen können, dass sie mandantenfähig ist. Aber man muss mal den Early Draft (geplant für das dritte Quartal in 2011) abwarten und dann mal schauen, was dann wirklich angedacht wird.
Spring hat erstmal keine direkte Unterstützung von Mandantenfähigkeit vorgesehen – allerdings kann man hier mit den vorhandenen Mitteln sehr schnell ein Konzept zur Mandantenfähigkeit abbilden. So haben wir in einem Projekt über Hierarchien von BeanFactories und geschickten Namenskonventionen ermöglicht, einzelne Funktionen pro Mandant auszutauschen. Die Patterns zur Abbildung von Mandanten in der Datenbank lassen sich ebenso in Kombination mit einem OR-Mapper wie Hibernate anwenden. Spring selber kennt keine Mandanten – man kann Spring aber als Framework sehr gut nutzen, um Mandantenfähgkeit auf verschiedensten Ebenen abzubilden.
Was insgesamt sehr wohl eine Rolle spielt ist die Anzahl der Mandanten, die ein System unterstützen muss. Ich denke je mehr Mandaten es sein sollen (wie z.B. bei SaaS-Anwendungen), desto weniger wichtig wird die Anpassbarkeit pro Mandant (z.B. bei einzelnen Funktionen, etc.) – und wenn, dann sollte der Mandant es selber können. Alles andere ist wohl nicht mehr managebar. Viele Kunden von uns haben die Anforderung an eine Unterstützung einer hohen Anzahl an Mandanten nicht – allerdings benötigen die dann die Flexibilität, für jeden Mandant Anpassungen / Erweiterungen vorzunehmen um dann dennoch insgesamt nur ein System zu warten und dieses auch wirklich zu vertretbaren Kosten warten zu können.
Insgesamt ist es immer noch so, dass man bei „Mandantenfähigkeit“ genau hinsehen muss, was die Anforderungen eigentlich sind. Viele Frameworks bieten allerdings heutzutage Mechanismen, die man geschickt nutzen und in die Gesamtlösung integrieren kann.
Bei der Anforderungserhebung einfach mal mit der Frage beginnen „Was ist ein Mandant ?“ – dann wird man schnell erkennen, wie viel Arbeit man vor sich hat…..
Weitere Beiträge
von Rainer Vehns
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Rainer Vehns
Gründer und Vorstand
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.