Wir arbeiten derzeit an unserem neuen Produkt / Projekt. Es handelt sich um eine Client-Server-Anwendung, die sich an bestimmte Industrie- / Dienstleistungsunternehmen richtet. Wir erstellen einen Server (nur C-Sprache und Linux), auf dem ein benutzerdefiniertes Protokoll auf TCP mit einem Java-Front-End ausgeführt wird. Wir sind zu etwa 20% in der Codierungsarbeit und sehen uns mit einer Situation konfrontiert, in der wir zwischen Mikro- und monolithischer Kernelarchitektur wählen müssen.
Ich bin mir bewusst, dass Micro vs. Monolithic normalerweise in Bezug auf die Kernel-Architektur steht, aber wir sprechen speziell über Server.
Warum ein benutzerdefinierter Server und nichts vorhandenes?
- Unsere UI-Anforderungen sind erheblich und sehr dynamisch, daher waren Web / Webbrowser-basierte Lösungen nicht geeignet.
- Die statistische Verarbeitung ist auf Client-Seite von Bedeutung, weshalb Browser wiederum wenig hilfreich waren. (Natürlich könnten wir die Verarbeitung auf Serverseite durchführen und die verarbeiteten Daten an den Client weitergeben, aber dies würde eine große Belastung des Servers und eine Verschwendung von Clientressourcen bedeuten.)
- Mit mindestens drei Technologien (JS / HTML / CSS), mit denen auch nur ein einziges Ereignis verwaltet werden kann, ist das gesamte Erlebnis wie das Fegen des Hauses inmitten eines Wüstensturms - Sie fegen es n-mal, der Staub sammelt sich n + 1-mal an.
Was ist mit Micro und Monolithic Server? Was redest Du da?
Betrachten Sie die folgende (hypothetische) Kundenanforderung:
request-id: 123
request-service: HistoricDataSets
request-message: Fetch all records upto the year 2010
Beim Empfang einer solchen Anfrage tut dies normalerweise ein Server (der Einfachheit halber ignorieren wir Parallelitätstechniken wie Thread und Gabeln):
- Analysieren Sie die Anforderungszeichenfolge
- Identifizieren Sie die Aktion (
HistoricDataSets LIMIT Year (2010)
in unserem Fall abrufen ) - Interagieren Sie mit der Persistenzschicht (in unserem Beispiel beispielsweise Oracle) und rufen Sie die Daten ab.
Formatieren Sie die Daten gemäß dem Protokoll. Ex:
Antwort-ID: 123
Erfolg: wahrer
Antworttext: DataSetsAntworten Sie dem Kunden mit den so formatierten Daten.
Dies ist das, was wir als monolithischen Server bezeichnen (ähnlich einem monolithischen Kernel, bei dem alle Betriebssystemarbeiten im Kernelbereich ausgeführt werden).
Betrachten Sie dieselbe Anforderung beim Empfang erneut, diesmal beim Server (der Einfachheit halber haben wir nur gemeinsam genutzten Speicher als IPC angenommen):
- Setzt die Anforderung in den gemeinsam genutzten Speicher für den
Parser
Prozess - Das
Parser
analysiert die Zeichenfolge, identifiziert die Aufgabe und weist denExecutioner
Prozess an, die Aufgaben auszuführen. - Das
Executioner
passiert dann die Daten zuFomatter
verarbeiten , die, nach dem Formatieren der Daten in eine Protokollzeichenfolge, kehrt zu dem Server. - Der Server sendet es an den Client (Antwort).
Natürlich statt Parser
, Executioner
und Formatter
es könnte ein einzelner , aber getrennter Prozess gewesen. Dies ist das, was wir als Micro Server bezeichnen (ähnlich einem Micro-Kernel, der kaum ein Minimum benötigt). Der Server hört effektiv nur zu und reagiert, während alle Schritte von verschiedenen Prozessen ausgeführt werden.
Welches soll ich auswählen? Wir sind verwirrt! Während monolithische Server bewährt sind (die meisten HTTP-Web-Server?) Und einfacher zu programmieren sind und mit Parallelität recht gut umgehen können. Auf den ersten Blick scheinen Mikroserver schnell und im Einklang mit dem UNIX-Prinzip eines Programms zu sein, um eine Aufgabe zu erledigen, sind aber auch kompliziert zu entwickeln, insb. unter Berücksichtigung der Parallelität.
Frage (n)
- Was sind (möglicherweise) die Vor- und Nachteile jedes Ansatzes?
- Wann welche verwenden? (Es könnte auch als allgemeine Frage interpretiert werden: Wann soll IPC verwendet werden?)
- Wenn der Mikrokernel ausgewählt ist, welche Funktionen müssen dann Teil des Core-Servers sein und welche nicht?
Ähnliche / verwandte Fragen
- Gefahren einer riesigen monolithischen Anwendung
- Externer Vs Embedded Browser (Tangential)
- Tipps zur Konvertierung der monolithischen App in eine Multithread-App (Tangential)
Einige Informationen, die hilfreich sein können:
- Unsere potenziellen Kunden können in zwei Kategorien unterteilt werden:
- Groß: Ungefähr 1.700 - 2.000 Anfragen pro Minute
- Klein: Ungefähr 650 - 700 Anfragen pro Minute
- Es kann angenommen werden, dass das Datenvolumen pro Anforderungszyklus (Anforderung und nachfolgende Antwort) normal verteilt ist mit einem Mittelwert von ~ 1,20 MB und im schlimmsten Fall etwa 250 bis 300 MB.
- Das Produktkonzept ist relativ neu, kann sich jedoch auf die Kernoperationen auswirken. Daher erwarten wir, dass die Kundenbudgets nur nach einer bestimmten Verzögerung (9-12 Monate) nach der Bereitstellung flexibel sind. Dies begrenzt die Menge an Hardware, die der Kunde bereit sein wird esp. die kleinen.
- Jeder Kunde hat seinen eigenen Client-Server-Stack. Der Server wird auf der vom Kundenteam verwalteten Hardware des Kunden ausgeführt, während die Clients auf den Computern der funktionalen Mitarbeiter bereitgestellt werden
- Remote-Updates für Client- und Serveranwendungen sind ein Muss
- Echtzeitdienste
PUSH
vom Server können sehr erwünscht sein, wenn das Produkt klickt!