Warnsystemarchitektur

10

Ich möchte ein System erstellen, das Warnmeldungen von verschiedenen Programmen verarbeitet und diese Warnungen per E-Mail an Down-Wind-Verbraucher verarbeiten kann. Dies alles würde über ein internes Netzwerk enthalten sein.

Ich denke, ich möchte, dass die grundlegende Architektur ungefähr so ​​aussieht:Geben Sie hier die Bildbeschreibung ein

Das Hauptanliegen, das ich derzeit habe, ist das "Message Handler" -Bit, das meine "Art-of-API" sein wird. Ich möchte, dass alle Komponenten dieses Systems Daten an die API senden, die alle Schreibvorgänge in die Datenbank verarbeitet. Ich denke, dieser Ansatz ist einfacher, weil er die Sicherheit vereinfacht und es mir ermöglicht, viele der komplizierteren DB-Abfragen in einem einzigen Programm zusammenzufassen.

Die Sorge ist, dass ich möchte, dass dies sprachunabhängig ist - was bedeutet, dass jeder Code Nachrichten an meinen Handler senden kann -, der sie interpretiert. Ich hoffe, dies über JSON-Flatfiles oder über REST-Aufrufe des Programms zu tun (was den nachgeschalteten Anwendungen Flexibilität verleiht).

Meine Frage ist-

Sollte ich mich mit dem Nachrichtenhandler beschäftigen - oder würde es die Einfachheit erhöhen, nur den direkten Datenbankzugriff auf die nachgelagerten Anwendungen sowie auf die beiden anderen Komponenten (Management Console und Alert Manager) zuzulassen?

Auf diese Weise können sie jede gewünschte Warnung einfügen - solange INSERT in die DB-Tabelle (n) gültig ist.

Ich bin kein Software-Designer von Beruf, entschuldigen Sie mich - ich möchte nur, dass ein Projekt in meiner Freizeit durchgeführt wird.

Christopher
quelle

Antworten:

4

Haben Sie sich mit AMQP (Advanced Message Queuing Protocol: https://www.rabbitmq.com/protocol.html ) befasst?

RabbitMQ ist ein großartiges Tool für so etwas, denke ich (es gibt auch andere, MSMQ-, Azure / AWS-Dienste usw.). Sie erhalten nicht nur einen sprachunabhängigen Nachrichtenhandler (einfach "Nachricht an den Nachrichtenserver mit JSON-Daten senden"), sondern trennen auch die nachgelagerte Nachrichtenverarbeitung und machen sie gut isoliert. Führen Sie einen Nachrichtendienst aus, der eingehende Nachrichten aus den von Ihnen benötigten Warteschlangen verarbeitet und Ihre Benachrichtigungen ausspuckt.

Einer der Gründe, warum ich AMQP wirklich gerne benutze, ist, dass Sie wie jetzt mit einer hausgemachten Lösung beginnen, aber nach einiger Zeit feststellen, dass Sie Nachrichten je nach Typ, zu wem sie gehen müssen usw. etwas anders behandeln müssen. Sie erstellen also ohnehin im Wesentlichen Ihre eigene AMQP-Implementierung.

Was tun Sie, wenn eine Nachricht an 5 verschiedene Empfänger gesendet werden muss? Was ist, wenn Sie eine Nachricht haben, die auf mehreren Prozessoren gedreht werden soll (denken Sie an lang laufende Aufgaben und an X gleichzeitige Prozessoren, auf denen Sie Nachrichten eines bestimmten Typs runden können). Was ist, wenn die Nachricht an eine Person gesendet werden soll, aber wenn sie nicht verfügbar / online ist, sollte sie an eine andere Person gesendet werden? Der AMQP erledigt all dies bereits (ganz nett!), Mit sehr guter Kategorisierung, Warteschlangen, Kanälen, dauerhafter Persistenz und allen möglichen Funktionen.

Hier ist eine grundlegende Übersicht über die Szenarien, mit denen es umgehen kann (beachten Sie, dass dies nicht spezifisch für RabbitMQ ist: Es ist eine AMQP-Sache, aber RabbitMQ erklärt es zufällig gut) - https://www.rabbitmq.com/getstarted.html

jleach
quelle
Ich habe RabbitMQ schon einmal für andere Software implementiert gesehen - schien immer interessant (wenn nicht etwas kompliziert). Ich werde es mir ansehen! Ich glaube, ich habe mich zunächst davor gescheut, weil ich den Datensendern viel Flexibilität bieten wollte. Wenn es also schwierig ist, einen REST-Aufruf auf eine vorhandene Powershell oder Javascript zu implementieren, oder wenn der Himmel eine VB6-App verbietet, können sie normalerweise ziemlich einfach in eine flache Datei ausgegeben werden. Aber in der Lage zu sein, nur einen Großteil der Nachrichtenverarbeitung zu ersetzen, würde mit Sicherheit Zeit und Mühe sparen!
Christopher
2
Ich war ein wenig eingeschüchtert, als ich zum ersten Mal bei RabbitMQ war, aber nach einem Wochenende des Studiums war es wie Wow, das ist wirklich sehr, sehr schön, und jetzt, wo ich verstehe, was ich sehe, ist es eigentlich ganz einfach
jleach
Ich mag die Idee von AMQP, aber die Art und Weise, wie RabbitMQ die Client-APIs für jede Art von Sprache handhabt, macht den gesamten Zweck der Verwendung eines sprachunabhängigen Protokolls zunichte. Was ist, wenn ich einen Client habe, der eine Sprache ausführt, für die keine unterstützte API geschrieben wurde? Einige dieser Funktionen sind wirklich nett ... aber übertrieben, wenn ich nur 1 Nachricht von Punkt A nach Punkt B erhalten muss, ohne dass dazwischen etwas liegt.
Christopher
Ich dachte darüber nach, eine API für schnelle Ruhezeiten darauf zu legen, die Ihre agnostischen Bedenken abdecken würde, stimmte jedoch zu, dass es übertrieben wäre, wenn Sie niemals eine der von AMQP angebotenen Funktionen benötigen würden (entschuldigen Sie, wenn ich Sie in die Irre geführt hätte)
Gänsejagd
Ja - eine schnelle REST-API, um das zu behandeln, würde funktionieren. Aber dann könnte ich genauso gut eine eigene REST-API erstellen. Und keine Entschuldigung erforderlich - es ist eine großartige Technologie und Lernen ist für den Fortschritt unerlässlich :) Wenn nicht jetzt - ich bin sicher, dass es in Zukunft nützlich sein wird.
Christopher
3

Sehr gut gerahmte Frage!

Alle architektonischen Entscheidungen beinhalten Kompromisse. Wenn Sie neugierig auf eine Diskussion über Kompromisse sind, bearbeiten Sie Ihre Frage möglicherweise in diese Richtung. Da die Frage nur nach einer Position fragt, werde ich mich stattdessen für den MessageHandler aussprechen. Ich werde noch einen Schritt weiter gehen und vorschlagen, KEINE Datenbank einzuschließen - zumindest keine SQL-Datenbank, zumindest nicht zu starten. Lassen Sie den MessageHandler einfach JSON im Dateisystem speichern, z. B. ein Verzeichnis pro Stunde empfangener Warnungen (natürlich abhängig vom Volumen), und lassen Sie die API bei Abfrage durch den Warnungsmanager nur die letzten beiden Verzeichnisse von durchlaufen Benachrichtigungen, um zu entscheiden, welche E-Mails zugestellt werden sollen (natürlich abhängig von der Priorität).

In diesem Problem gibt es eine Menge guter Dinge zu kauen, und wenn Sie eine Datenbank in einem frühen Stadium aus dem Bild heraushalten, werden viele Nebengeräusche und unnötige Problemlösungen vermieden. Natürlich haben Sie vielleicht eine versteckte Liebe zum Erstellen relationaler Datenmodelle und träumen davon, SQL zu schreiben. In diesem Fall ist diese Antwort völlig falsch. Aber im Allgemeinen sind selbst die agilsten Datenbanken schreckliche Anwendungsplattformen, und sie werden nur in Systeme aufgenommen, weil sie auf Langlebigkeit und indizierte Abfragen spezialisiert sind.

Viel Glück!

Jonah Benton
quelle
1
Ich mag nur die Möglichkeit, E-Mail-Gruppen, Mitglieder und verschiedene andere nette Dinge über die Verwendung einer relationalen Datenbank zu steuern. Das Datenbankdesign ist wirklich das, womit ich im Projekt angefangen habe - also habe ich nie daran gedacht, es zu entfernen. Vielen Dank für diesen Beitrag und Standpunkt!
Christopher
Ich wusste es! :) Das Wichtigste ist, zu verstehen, was Sie wirklich wollen, um aus etwas herauszukommen. Prost!
Jonah Benton