2017-05-05 4 views
3

Ich arbeite an einem Composer-Paket für PHP-Apps. Das Ziel besteht darin, einige Daten nach Anforderungen, Warteschlangenaufträgen und anderen ausgeführten Aktionen zu senden. Meine anfängliche (und arbeitende) Idee ist, register_shutdown_function zu benutzen, um es zu tun. Bei diesem Ansatz gibt es einige Probleme. Erstens erhöht sich dadurch die Antwortzeit der Seite, was bedeutet, dass der Aufwand für die Berechnung der Anforderung und das Senden der Daten über meine API höher ist. Ein weiteres Problem ist, dass lang laufende Prozesse, wie z. B. Warteschlangen-Worker, diese Methode lange Zeit nicht ausführen. Daher können zwischen dem Erstellen der Daten und dem Senden und Verarbeiten massive Datenlücken bestehen.Temporärer Speicher zum Sammeln von Daten vor dem Senden

Mein Gedanke ist, dass ich eine Art temporären Speicher verwenden könnte, um die Daten zu speichern und einen Cronjob zu haben, um es jede Minute zu senden. Das einzige Problem, das ich bei diesem Ansatz sehen kann, ist die Verwaltung der Nebenläufigkeit bei High IO. Da viele Prozesse alle (n) ms in die Datei schreiben, gibt es ein Problem beim Lesen der Datei und beim Entfernen von Zeilen, die bereits gesendet wurden.

Eine weitere Option, die ich verzweifelt vermeiden möchte, ist die Verwendung der Client-Datenbank. Dies könnte möglicherweise Leistungsprobleme verursachen.

Was wäre der bevorzugte Weg, dies zu tun?

Bearbeiten: das Paket ist im Wesentlichen ein Überwachungsagent.

+0

Hier RabbitMQ und dergleichen dieses Problem recht elegant lösen würde. – Pete

+0

Es tut es nicht. Dies ist ein Composer-Paket, das nicht von der Client-Infrastruktur abhängig sein sollte. – Ignas

+0

Hm in Ordnung. Ist es dann eine Anforderung, dass jede Anfrage in dieselbe Datei schreibt? Ist dies nicht der Fall, schreibe jedes in eine eindeutige Datei und bearbeite diese im Batch mit dem Cronjob. Dies sollte Nebenläufigkeitsprobleme verhindern. – Pete

Antwort

1

ein paar Probleme mit diesem Ansatz Es gibt zum einen erhöht dies die Seite, Reaktionszeit, was bedeutet, dass es der Aufwand der Anforderung der Berechnung sowie das Senden der Daten über meine API

Ich bin nicht Sicher, dass Sie dies umgehen können, es wird zusätzlichen Aufwand für mehr Arbeit im Zusammenhang mit einer Webanforderung geben. Ich habe das Gefühl, dass ein Job-Queue-basiertes/asynchrones System dies für den Client minimiert. Unabhängig davon, ob Sie ein lokales Dateisystem schreiben oder ein Socket schreiben, haben Sie diesen zusätzlichen Aufwand, aber Sie können sofort zum Client zurückkehren und die Verarbeitung dieser Anfrage nicht blockieren.

Ein weiteres Problem ist, dass lang andauernde Prozesse wie Warteschlangen-Workers diese Methode für eine lange Zeit nicht ausführen. Daher können zwischen dem Erstellen der Daten und dem Senden und Verarbeiten massive Unterschiede bestehen.

Ist das nicht der springende Punkt ?? : p Um zu Ihrem Client sofort zurückzukehren und den Job irgendwann in der Zukunft asynchron zu beenden? Mithilfe einer Jobwarteschlange können Sie den Worker-Pool und den Webserver separat entkoppeln und skalieren. Ihre Webserver können ziemlich schlank sein, da das Heben schwerer Lasten den Arbeitern überlassen wird.

Mein Gedanke ist, dass ich eine Art von temporärem Speicher verwenden könnte, um die Daten zu speichern und einen Cronjob zu haben, um es jede Minute zu senden.

Ich würde empfehlen empfehlen, eine Job-Warteschlange im Gegensatz zu Ihrem eigenen Rollen zu betrachten. Dies ist ziemlich gelöst und es gibt viele extrem populäre Open-Source-Projekte, um dies zu handhaben (jede der MQs) Wird die Minute Cron-Job die Berechnung für den Client tun? Wie skalierst du das? Wenn eine Datei 1000 Einträge enthält oder Sie 10x skalieren und 10000 haben, können Sie alle diese Berechnungen in weniger als einer Minute durchführen? Was passiert, wenn ein Server stirbt? Wie erholst du dich? Interprozess-Nebenläufigkeit? Müssen Sie Sperren für jeden Prozess verwalten? Verwenden Sie für jeden Prozess und jede Minute eine separate Datei? Zu Bucket-Ereignissen? Was passiert, wenn Sie weniger als 1 Minute laufen wollen?

Haltbarkeitsgarantien

Welche Art von Garantien werden Sie Ihren Kunden anbieten? Wenn eine Anfrage zurückkommt, kann der Kunde sicher sein, dass der Job bestehen bleibt und irgendwann in der Zukunft abgeschlossen sein wird?


Ich würde empfehlen, eine Worker-Warteschlange zu wählen, und Ihre Webserver-Prozesse zu schreiben. Es ist ein extrem beliebtes Problem mit so vielen Ressourcen, wie man es skalieren kann, und mit klaren Haltbarkeits- und Leistungsgarantien.

enter image description here

+0

Im Wesentlichen ist mein Paket ein Überwachungsagent. Ich sehe nicht, wie meine Kunden MQ-Software installieren, verwalten und warten würden, die nichts mit ihren Anwendungen zu tun hat. Das ist das Hauptproblem hier. Ich schätze Ihre Antwort, aber sie löst mein Problem nicht:/ – Ignas

+0

Werden Ihre Kunden Cron registrieren und verwalten/warten? Werden sie die Anzahl der Hintergrundjobs, Erfolge und Ressourcen überwachen? Gibt es eine Möglichkeit, einen bereits erstellten Überwachungsagenten zu nutzen? statsd, gesammelt, fluentd, etc? Sie haben nach dem bevorzugten Weg gefragt, und ich würde defever extrem populäre Architektur empfehlen, die gut studiert ist, hat viele ausgezeichnete kampferprobte, gut dokumentierte Dienste mit blühenden Gemeinschaften, die einer selbstgewählten Lösung entgegenstehen – dm03514

+1

Die Cron ist auf der registriert Clientanwendung und wird als Unterprozess vom CLI-Hauptskript ausgelöst, das in das Framework integriert ist, auf das ich abziele (Laravel). Ich habe beschlossen, 4 Speicher-Engines zu implementieren, die die Benutzer auswählen können: Speicher (Daten nach Anfrage senden wurde dem Client über 'fastcgi_finish_request' bereitgestellt, falls verfügbar), Datenbank, Datei und einer Ihrer vorgeschlagenen Agenten. Welcher der 3, die du erwähnt hast, wäre am besten für die JSON-Sammlung geeignet? Ich versuche nur, Integrationskomplexität zu vermeiden, selbst auf Kosten der Leistung. Ich baue einen MVP, also muss ich die Idee zuerst testen :) – Ignas

Verwandte Themen