# Resoa

Resoa (abgeleitet von englisch Rest Service Oriented Architecture) ist ein quelloffenes Framework für die Entwicklung und den Betrieb internetbasierter Anwendungen in einem verteilten Rechnernetz. Der Fokus der IT-Architektur liegt hierbei auf Leistung, hoher Ausfallsicherheit und Skalierbarkeit. Applikationen werden in Java entwickelt, die Kommunikation nach außen basiert auf HTTP/REST und JSON.

## Komponenten

Resoa basiert im Wesentlichen auf 3 Komponenten, die sich, mehrfach auf unterschiedlichen Servern installiert, zu einem Rechnernetz (Grid / Cloud Computing) verbinden:

### Resoa Nodes

    Nodes bilden den Container für Java Business Services. Services werden in Domains zusammengefasst und auf einem Node „deployed“.

### Resoa Rest

    Rest Server bieten eine Schnittstelle für den Aufruf von Java-Diensten über das Internet. Dabei agieren sie als HTTP-Server auch für statische Inhalte. Die Kommunikation basiert im Wesentlichen auf AJAX/JSON.

### Resoa Controller

    Controller kennen die Grid-Infrastruktur, sie managen die Kommunikation zwischen allen Komponenten und steuern den Einsatz von Java Service Domains auf Nodes sowie von Webanwendungen auf Rest Servern. Darüber hinaus agieren sie als zentrale Instanz für ein Grid-weite Sitzungsverwaltung, der Aufruf von Java-Diensten kann damit auf Basis eines Benutzer-/Rollen-Konzepts eingeschränkt werden.

## Entwicklungsprinzipien

Das Design des Businessmodells erfolgt in XSD. Mittels JAXB kann aus dem Modell automatisiert Java Quellcode erstellt werden, der als Basis für die Implementierung der Anwendungslogik dient.
Resoa bietet die Möglichkeit, aus mittels JAXB kompilierten Klassen automatisiert JavaScript-Bibliotheken zu erstellen. Diese beinhalten neben dem Abbild der korrespondierenden Java Klassen hilfreiche Funktionen für die GUI Entwicklung, so z. B. ein automatisches Befüllen von Web Formularen und eine klassenintegrierte JSON De-/Serialisierung.
Die Implementierung der Geschäftsprozesse erfolgt in Java. Es müssen hierbei keinerlei Interfaces implementiert werden, die Identifizierung eines korrekten Resoa Services erfolgt anhand der Funktionsargumente.
Resoa bietet eine Lösung für die direkte Speicherung von Business Objekten in BTREE basierten Datenbanken. Die Serialisierung der Objekte erfolgt in JSON. Es können hierbei auch Relationen zwischen Objekten definiert werden, die entsprechende Aufbereitung der daraus resultierenden Speicherzugriffe erfolgt ACID transaktionsbasiert.
Mehrere Resoa-Dienste werden zu Service Domains aggregiert (Jar-Dateien). Domains können auf mehreren Nodes eingesetzt werden.

## Deployment und Laufzeitumgebung

Ein Resoa Grid definiert sich aus mindestens einem Controller, einem Node und einem Rest Server. Die Planung der Grid-Topologie erfolgt Ordner / Datei basiert. Die wesentlichen Informationen über die vorhandenen Business Service Domains und Web Anwendungen werden in einer GridDomains.xml Datei beschrieben, die sich im Root Folder einer Topologie Definition befindet. Für jede Komponente des Grids wird ein entsprechender Folder in der entsprechenden Kategorie (controller/node/rest) erzeugt, dort werden die für die Komponente notwendigen Deployment Information in einer Datei DeployDescriptor.xml hinterlegt.
Resoa verfügt über ein Tool, das aus den Grid Folder/Datei Informationen automatisch die Deployment Files, die ein Controller benötigt, erzeugt. Darüber hinaus werden für jede Komponente die scripts zum Starten sowie eine verschlüsselte Lizenz Dateien generiert. Mittels der Lizenzdateien wird sichergestellt, dass die Grid interne Kommunikation höchsten Sicherheitsanforderungen entspricht.
Die Einrichtung einer Laufzeitumgebung erfordert folgende Schritte:
* Installation von Java- und der Resoa-Bibliotheken
* Kopieren der Start scripts aus dem entsprechenden Grid Topology Folder auf den Server
* Starten der Anwendung
Jede Komponente verbindet sich beim Start mit einem Controller und erhält von dort alle relevanten Informationen. Der Controller kann diese Informationen auch zur Laufzeit aktualisieren, ohne dass ein Neustart einer Komponente notwendig ist.
Rest Server und Nodes unterhalten untereinander Verbindungen, wenn Abhängigkeiten aufgrund der Deployment Konfiguration bestehen. Ebenso tauschen Nodes, die dieselbe Domain bereitstellen, Daten aus, primär um eine Synchronisierung der lokalen BTREE Datenbanken sicherzustellen.
Geht ein Node offline, so werden Web/Rest Request zu einem anderen Node weitergeleitet, der die entsprechende Business Service Domain bereitstellt. Sind mehrere Nodes dafür verfügbar, erfolgt die Auswahl zufallsgesteuert. Startet ein neuer Node, so verbindet dieser sich automatisch zu allen Rest Servern, die Web Anwendungen mit Abhängigkeiten zu einer bereitgestellten Service Domain aufweisen, sowie zu anderen Nodes, die für diese Domains zur Verfügung stehen.

## Geschichte

Resoa hat seine Wurzeln in Börsenhandelssystemen. Ziel war die Entwicklung einer Softwarearchitektur, mit der in Echtzeit Datenströme von Börsen ausgewertet und komplexe Analysen durchgeführt werden können. Die Ergebnisse daraus dienten als Basisinformation für ein vollautomatisiertes Handelssystem für Terminkontrakte und Optionen. Die täglich zu verarbeitenden Informationen umfassten mehrere Gigabyte, zudem sollte eine Analyse historischer Daten integriert werden. Die Berechnungen mussten zeitgleich für mehrere tausend börsennotierte Titel im Bereich von Millisekunden stattfinden.
Ein kleines Team von Entwicklern aus Deutschland und Russland, das sein Know-how aus mehrjähriger Tätigkeit für Cortal Consors sammeln konnte, begann 2003 mit dem Entwurf und der Entwicklung auf privater Basis. Dabei wurden zahlreiche quelloffene Lösungen einer eingehenden Analyse unterzogen, und letztendlich entstand nach einigen fundamentalen Änderungen die Basisarchitektur der jetzigen Resoa-Komponenten. Sehr bald war offensichtlich, dass die Zusammenführungen von „Web-Services“ mit „Grid Computing“ ein zentrales Thema für alle internetbasierten Anwendungen sein wird. Dies führte 2008 zu der Entscheidung, die vorhandenen Komponenten so weiterzuentwickeln, dass eine generelle Verwendung als Entwicklungsframework und Laufzeitumgebung möglich ist. Ende Juli 2009 wurde dann die erste Version 0.9.1 veröffentlicht.