Micro vs Monolithic Server-Architektur

11

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: DataSets

  • Antworten 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 ParserProzess
  • Das Parseranalysiert die Zeichenfolge, identifiziert die Aufgabe und weist den ExecutionerProzess an, die Aufgaben auszuführen.
  • Das Executionerpassiert dann die Daten zu Fomatterverarbeiten , 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, Executionerund Formatteres 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


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 PUSHvom Server können sehr erwünscht sein, wenn das Produkt klickt!
check123
quelle
4
Sie benötigen keinen benutzerdefinierten Server, nur weil Sie keine Webprotokolle verwenden möchten. Sie könnten weiterhin einen Anwendungsserver verwenden, z. B. einen J2EE-EJB-Container, der eine Vielzahl von Funktionen bietet, die Sie von Hand schreiben, z. B. zuverlässiges Messaging, verteilte Transaktionen usw. Das Schreiben eines benutzerdefinierten Kabelprotokolls auf einem C-Server im Jahr 2011 klingt nach einer Ego-Reise nach mir.
Jeremy

Antworten:

7

Wirtschaft regelt manchmal eine viel kritischere Antwort als die Kerntheorie hinter Entscheidungen. Das Wichtigste ist, dass wenn Sie sich in Ihrem Fall etwas „Großes“ ansehen, bei dem Ihre Anwendung eine wirklich harte Bereitstellung erfordert - je weniger Räder Sie selbst erfinden, desto besser ist es. Wenn es funktioniert, ist es mir egal, ob es monolithisch oder mikro ist; wenn nicht, ist es mir auch egal!

Es mag sein, dass sehr konventionelle Webseiten-basierte Apps möglicherweise nicht für Sie geeignet sind - aber Sie müssen einen etwas breiteren Blick darauf werfen und sehen, dass Sie Dinge verwenden können, die sofort einsatzbereit sind, und später Ihren Ausweg weiterentwickeln können, um zu sehen, ob Sie dieses Element durch etwas ersetzen können besser. Auf diese Weise sparen Sie nicht nur Zeit für das Erste, sondern verbessern auch Ihr Verständnis dafür, worauf es im wirklichen Leben wirklich ankommt. Hier sind einige Hinweise, die Sie berücksichtigen könnten.

  1. Wenn Sie wirklich eine sehr hohe Skalierbarkeit benötigen, sollten Sie überlegen, wie Ihre Server die Aufgabe aufteilen, anstatt die Zahlen so schnell wie möglich zu ändern. Schließlich haben Sie eine Last, die ein Server nicht wirklich aufnehmen kann, selbst wenn Intel den schnellsten Prozessor der Welt herstellt und der Kunde bereit ist zu zahlen! Anforderungsrouting und Lastausgleich sind daher wichtiger als die Effizienz des Protokolls.

  2. HTTP ist immer noch am besten - wenn Sie eine Skalierung benötigen. (Sie können auch einfach Load Balancer kaufen, wenn Sie es verwenden). Benutzerdefiniertes Protokoll erfordert benutzerdefinierte Vereinbarungen.

  3. HTTP bedeutet nicht, dass Sie HTML, Java-Skript überhaupt herumwerfen müssen. Das bedeutet nicht einmal, dass Sie einen regulären Apache-Server und einen Webbrowser benötigen. Sie können HTTP zwischen zwei benutzerdefinierten Clients und Elementen wie AOL-Server oder lighthttpd verwenden, die als Bibliothek verwendet werden können, wenn die Kommunikation keine großen Datenübertragungen darstellt. Sie können SOAP auch auf beiden Seiten mit Toolkits wie gSOAP verwenden .

  4. Auch wenn HTTP definitiv nicht in die Rechnung passt , sollten Sie BEEP in Betracht ziehen , um die Dinge effizienter zu gestalten. Alternativ gibt es viele bewährte RPC- und RMI-Mechanismen.

  5. Versuchen Sie zu sehen, dass Sie durch parallele Verarbeitung im Back-End mehr maximale Arbeit leisten können, und Server werden erst nach Abschluss der Arbeit abgefragt. Wenn dies funktioniert, gibt es Frameworks wie MPI oder es gibt viele andere verteilte Computer-Toolkits, die hilfreich sein können.

  6. Obwohl ich möglicherweise nicht in der Lage bin, die genauen Anforderungen zu kennen, müssen Sie möglicherweise entweder viele Daten verteilen oder viele Berechnungen durchführen, wenn Sie beides benötigen - es gibt immer noch einige grundlegende architektonische Ineffizienzen.

Für mich ist das Erstellen eines neuen Protokolls und das Erstellen eines neuen Server-Frameworks ein doppeltes Experiment, das Sie nicht zusammen durchführen sollten. Wenn Ihr Einsatz so hoch ist, sollten Sie zunächst versuchen, mit vorhandenen Tools zu experimentieren, um die Grenzen der bisherigen Aktivitäten zu ermitteln. Erst dann kennen Sie die tatsächlichen Herausforderungen.

Bei der Erforschung verteilter Systeme wurde viel mehr erreicht als nur Web-Apps. Also sollten Sie das untersuchen.

Dipan.

Dipan Mehta
quelle
2

Das scheint mir sehr akademisch zu sein. Und ehrlich gesagt finde ich den zweiten Ansatz genauso monolithisch. Dies ist so weit wie Sie gehen sollten:

  1. Analysieren Sie die Anfrage
  2. Behandeln Sie die Anfrage

Der auf der Grundlage der Anforderungsparameter ausgewählte Anforderungshandler sollte alle Aspekte der Bearbeitung der Anforderung umfassen. Ob der Handler tatsächlich Abfragen in Ihrem Datenspeicher ausführt oder nicht und ob er die Standardformatierung verwendet, um die Daten zurückzugeben, spielt in der obigen Ebene keine Rolle. In der Tat wird es wahrscheinlich genau das tun, aber es hat keinen Wert, Annahmen darüber zu treffen.

back2dos
quelle
1
  1. Der monolithische Kernel ist viel älter als der Mikrokernel . Es wird in Unix verwendet. Die Idee des Mikrokernels erschien Ende der 1980er Jahre .

  2. Das Beispiel für Betriebssysteme mit monolithischen Kerneln ist UNIX, LINUX, während Betriebssysteme mit Mikrokernel QNX, L4, HURD sind. Zunächst wird Mach (nicht Mac OS X) später in Hybrid-Kernel konvertiert. Selbst MINIX ist kein reiner Kernel, da dies Gerätetreiber sind als Teil des Kernels kompiliert.

  3. Monolithischer Kernel ist schneller als Mikrokernel . Der erste Mikrokern Mach ist 50% langsamer als der monolithische Kernel, während die spätere Version wie L4 nur 2% oder 4% langsamer als der monolithische Kernel ist .

  4. Monolithischer Kern ist im Allgemeinen sperrig . Der reine monolithische Kernel muss klein sein und sogar in den Cache der ersten Ebene des Prozessors (Mikrokernel der ersten Generation) passen.

  5. im monolithischen Kernel befinden sich Gerätetreiber im Kernelraum . Während sich der Microkernel-Gerätetreiber im Benutzerbereich befindet .

  6. Da sich der Gerätetreiber im Kernel befindet, ist der monolithische Kernel weniger sicher als der Mikrokernel. (Ein Ausfall des Treibers kann zum Absturz führen), während Mikrokerne sicherer sind als der monolithische Kernel, der daher in einigen militärischen Geräten verwendet wird.

  7. Monolithische Kernel verwenden Signale und Sockets , um IPC sicherzustellen, während der Mikrokernel-Ansatz Nachrichtenwarteschlangen verwendet . 1 Generation von Mikrokernel hat IPC schlecht implementiert, daher waren die Kontextwechsel langsam.

  8. Das Hinzufügen neuer Funktionen zu einem monolithischen System bedeutet das Neukompilieren des gesamten Kernels, während Sie neue Funktionen oder Patches hinzufügen können, ohne sie neu zu kompilieren .

Rahul Bhadana
quelle