Ich bin am Anfang eines Projekts, bei dem von mehreren Sensoren gelesen und die Daten von diesen Sensoren zusammengeführt werden. Insgesamt werden 4 Sensoren über USB und eine Webcam, ebenfalls über USB, angeschlossen.
Einer meiner Kollegen ist sehr lautstark darüber, wie schön es ist, Programme in kleinere Teile aufzuteilen und sie über das Netzwerk kommunizieren zu lassen. Er schlägt vor, dass wir für jeden Sensor (oder jede Kamera) eine ausführbare Datei und dann eine zentrale Steuerungsanwendung haben sollten, die mit den anderen kommuniziert.
Ich mag diese Idee intuitiv nicht. Der betreffende Kollege arbeitete an einem anderen Projekt, das diesen Ansatz verwendete und endlose Probleme hatte, die schwer zu finden und zu debuggen waren.
Es scheint kein sehr staatliches Design zu sein und erscheint mir etwas unelegant. Ich möchte eine Bibliothek für den Umgang mit jedem Sensor schreiben und sie möglicherweise in separaten Threads ausführen.
Es sollte auch darauf hingewiesen werden, dass die Berechnungen, die wir durchführen müssen, Aktualisierungen für ein anderes System bei fast 1000 Hz liefern. Das Hinzufügen einer Ebene der Netzwerkkommunikation scheint einen potenziellen Engpass hinzuzufügen.
Es würde mich interessieren, die Meinungen anderer Leute dazu und vielleicht einige Hinweise zu dieser Art von Praxis zu hören.
Antworten:
Intuitiv gefällt mir die Idee, Programme in kleinere Teile aufzuteilen. Wenn die verschiedenen Prozesse jedoch immer alle auf demselben Computer ausgeführt werden, ist die Netzwerkkommunikation wahrscheinlich nicht die optimale Form von IPC. Für die Hochgeschwindigkeitskommunikation zwischen Prozessen ist der gemeinsam genutzte Speicher möglicherweise die bessere Option. Unabhängig davon, für welchen Ansatz Sie sich entscheiden, müssen Sie die Leistung messen oder zumindest schätzen, bevor Sie Entscheidungen treffen.
Sie müssen überprüfen, welche Art von Problemen und wo die Hauptursachen waren. Wenn sie aufgrund von Parallelität Probleme hatten, werden Sie beim Versuch einer Multithread-Lösung auf dieselben Probleme stoßen (wenn nicht sogar mehr).
Wenn dies "hohe Geschwindigkeit" ist, hängt dies von der Geschwindigkeit der Produktionsmaschinen und der Größe des Betriebs ab, der mit jedem Update verbunden ist. Wenn es um Leistung geht, sind Bauchgefühle äußerst unzuverlässig. Sie müssen die Dinge messen . Wenn Ihr Kollege glaubt, dass sein Ansatz schnell genug sein wird und Sie glauben, dass dies nicht der Fall ist, muss mindestens einer von Ihnen seinen Glauben beweisen oder verfälschen. Zum Beispiel könnte einer von Ihnen einen kleinen Prototyp implementieren, um die Interprozesskommunikation zu simulieren und die Geschwindigkeit zu messen. Alles andere schaut in eine Glasschale.
quelle
Sie können für Ihre Anwendung relevant sein oder nicht, aber einige Vorteile für die Multiprozesslösung, die Sie anscheinend nicht in Betracht gezogen haben, sind:
Zusätzliche Nachteile der Multiprozesslösung:
quelle
Der Ansatz, den Ihr Kollege befürwortet, wird oft als Microservices-Architektur bezeichnet und ist heutzutage ziemlich im Trend. Es hat eine Reihe von potenziellen Vorteilen:
Es hat auch eine Reihe von Nachteilen:
Ich bin mir nicht ganz sicher, was Sie meinen, wenn Sie sagen, dass das Design "nicht wie ein sehr staatliches Design erscheint". Im Allgemeinen wird "zustandsvoll" als schlechtes Merkmal eines Entwurfs angesehen, und "zustandslose" Mikrodienste werden als gutes Entwurf angesehen.
Angesichts der Informationen zu Ihren Anforderungen, die Sie in Ihrem Beitrag angeben, denke ich, dass ein auf Microservices basierendes Design für Ihren Anwendungsfall übertrieben wäre und die Vorteile die zusätzliche Komplexität nicht rechtfertigen würden. Die Vorteile von Microservices-Architekturen kommen in der Regel nur dann zum Tragen, wenn größere Webdienste erstellt werden, bei denen Skalierbarkeit, Robustheit und Erweiterbarkeit im Vordergrund stehen.
Die potenziellen Vorteile einer Microservices-Architektur werden auch nur mit einem durchdachten Design realisiert. Meiner Meinung nach erfordert eine solche Architektur mehr Vorabentwurf (insbesondere wenn es um das Protokoll für die Kommunikation zwischen Mikrodiensten geht) als ein Einzelprozessentwurf, um das vorliegende Problem erfolgreich zu lösen.
quelle