Wie kann ich hunderte von gleichzeitig laufenden Prozessen mit einer Datenbank über eine oder wenige permanenten Sitzungen kommunizieren?

StackOverflow https://stackoverflow.com/questions/830106

  •  06-07-2019
  •  | 
  •  

Frage

Lange Rede kurz: Wie kann ich Hunderte von gleichzeitig laufenden Prozessen machen kommunizieren mit einer Datenbank über eine oder wenig permanente Sitzungen

Die ganze Geschichte:
Ich baute einmal eine Reihe Knirschen Motor, der durch abzweigt ein Kind nach dem anderen geben jeweils eine kleine Anzahl von Dateien zu arbeiten auf große Mengen von großen Daten-Dateien verarbeitet. Das Sperren von Dateien, Verlaufskontrolle und Ausbreitungs Ergebnis passieren in einer Oracle-Datenbank, die alle (Teil-) Zugang zu verschiedenen Zeiten verarbeitet unter Verwendung eines anwendungsspezifischen Modul, das DBI kapselt.

Das funktionierte gut auf den ersten, aber jetzt mit höheren Volumina von Eingangsdaten, die Anzahl der Datenbanksitzungen (eine pro Kind, und sie können sehr kurzlebig sein) ständig geöffnet und geschlossen wird immer ein Thema. Ich möchte jetzt Zugriff auf die Datenbank zentralisieren, so dass es nur eine oder wenige feste Datenbanksitzungen sind die alle Datenbankzugriff für alle (Teil-) Prozesse behandeln. Das Vorhandensein des Datenbank-Abstraktionsmodul sollte die Änderungen einfach machen, weil die Funktion in den Arbeiter-Instanzen nennt kann das gleiche bleiben. Mein Problem ist, dass ich nicht von einer geeigneten Art und Weise denken kann das Modul zu verbessern, um alle Prozesse, um die Kommunikation zwischen und dem Datenbank-Connector (s).

Ich dachte an Message Queuing, konnte aber nicht mit einer Art und Weise zum Verbinden einer großen Herde von Anforderer mit einer oder wenigen Datenbank-Anschlüsse in einer Art und Weise kommen, so dass eine bidirektionale Kommunikation möglich ist (zum Sammeln des Abfrageergebnisses).
Ein asynchroner Ansatz könnte hier, dass alle Anfragen helfen zu derselben Warteschlange und der Datenbank-Connector Service die Anfrage geschrieben wird „Rückruf“, um das Ergebnis zu unterbreiten. Aber mein Geist versagt mir ein Bild klar genug zu erzeugen, so dass ich in den Code malen kann.
statt Forking einfädeln könnte mir einen einfacheren Start gegeben hat, aber das würde jetzt massive Änderungen an die Codebasis erfordert, dass ich nicht bereit zu einem Live-System zu tun.

Je mehr ich davon, je mehr die Grundidee sieht aus wie ein Pre-gegabelt Webserver mir nur, dass es nicht auf Webseiten nicht dienen, aber Datenbankabfragen. Alle Ideen, was zu graben in, und wo? Probe (Pseudo-) Code inspirieren mich, Links zu möglicherweise verwandten Artikeln, fertige Lösungen auf CPAN vielleicht?

War es hilfreich?

Lösung

Ich glaube, Sie zum Hinzufügen eines Tieres denken sollen. Ich denke, POE kann die mittlere Ebene behandeln.

Andere Tipps

Hier finden Sie aktuelle DBD :: Gofer . Es wird entwickelt, einen separaten Prozess zu Datenbankverbindungen zu bündeln und zu verwalten.

Sie möchten auf Ihren DBA über „Shared Server“, die in Oracle> = 10. Sie denken, dieser wie Verbindung auf der Serverseite Pooling können zu implementieren ist ganz einfach reden. Also, wenn Sie für eine Verbindung fragen, Sie müssen nicht unbedingt einen neuen dedicate Server-Prozess zu schaffen und zu zerstören, wenn Sie eine Verbindung herstellen.

Sie können auch Connection-Pooling auf Ihrer Seite tun.

Sie könnten sqlrelay sehen, die einige andere Vorteile als auch auf die Proxy-Seite der Dinge hat.

http://sqlrelay.sourceforge.net/sqlrelay/

In dem gegebenen Szenario kann es am besten sein, eine Nachrichtenwarteschlange zu verwenden:

  • Für die Arbeitseinheit Verriegelung: eine Anforderung an eine Verriegelungs- / Entriegelungs-Singletons Warteschlange. Wenn keine Sperre erworben werden kann, für einen späteren Zeitpunkt der Arbeitseinheit neu planen.
  • Für die Überwachung der Fortschritte: Legen Sie alle Fortschritte Updates in eine Warteschlange von einigen Logger / Status Updater usw. verarbeitet werden
  • .
  • Für das Ergebnis Vorlage, die Ergebnismengen in eine Warteschlange gestellt, um durch spezielle Ergebnis Autoren eingefügt werden. Die Queue-Einträge können sehr groß, aber jede anständige Nachrichtenwarteschlange soll, dies umgehen kann. In einer Prise Proxy konnten wir die Nutzlast in Dateien und nur die Dateinamen und Speicherort Warteschlange.
  • Die Konfigurationsdaten können aus der Datenbank beim Start eingelesen werden, bevor die Arbeitsprozesse gegabelt sind, so dass sie erben die komplette Konfiguration während gabeln und keine Datenbankverbindung ihrer eigenen benötigen.

Während wir gerade dabei sind, könnten wir das gesamte Design Refactoring eine Reihe von langlebigen Arbeitern Dämonen statt kurzlebigen Gabeln zu verwenden, die aus einer Warteschlange als auch ihre Arbeitseinheiten erhalten. Dies würde den Aufwand für die ganze Forking speichern.

durch Einschränkungen Corporate Software-Installation beschränkt zu sein, diesen Ansatz zu der Zeit unmöglich gemacht hätte, aber wenn jetzt eine ähnliche Sache von Grund auf neu bauen würde dies der richtige Weg für mich zu gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top