Bessere Möglichkeiten als herkömmliche Abfragemethoden


10

Ich bin derzeit in einer AngularJS / Javascript-Umgebung.

Derzeit verwendet die Anwendung die Abfragemethode (dh, um neue Daten in einer festgelegten Anzahl von Sekunden vom Server abzurufen).

Dies ist ziemlich anstrengend und ruft das neueste Ergebnis nicht sofort ab. Angenommen, der Server verwendet ASMX für Webservice-Funktionen und wie kann ich die Anwendungseffizienz besser verbessern, wenn dies ohne größere Überarbeitung möglich ist?

Bearbeiten 1:

Mit Steuern meine ich, dass der Server verschiedene SQL-Tabellen und zugehörige Daten und Dinge aufrufen müsste, was eine komplexe Datenverarbeitung bedeutet. Wenn viele Benutzer gleichzeitig arbeiten, befürchte ich, dass es in Zukunft möglicherweise Probleme mit der Serverleistung geben könnte.

Die neuesten Daten werden nicht abgerufen, da die Anwendung derzeit https-Anrufe vom Typ Anfrage-Antwort verwendet.

Ich kann mich auf der Seite der mobilen Anwendungen weiter verbessern, aber auf der Serverseite kann ich außer den Webservice-Dateien des Servers nicht viel ändern.

Antworten:


10

Wenn mit "traditionell" gemeint ist, dass jeder Client den Server so oft wie möglich hämmert, kann ich auf architektonischer Ebene helfen.

Das geeignete Design hängt davon ab, wo Ihr Server in dieses Raster fällt:

Control \ Resources : Sufficient | Insufficient
Customizable        :     SC     |     IC
Untouchable         :     SU     |     IU
  • SC: Lassen Sie den Server dem Beobachtermuster folgen . Ermöglichen Sie Kunden, sich als Beobachter zu registrieren.

  • IC: Erlaube nur einem Proxy-System, sich beim Server zu registrieren. Kunden registrieren sich beim Proxy.

  • SU: Erlauben Sie nur einem Proxy-System, den Server abzufragen. Kunden registrieren sich beim Proxy.

  • IU: Erlauben Sie nur einem Proxy-System, den Server abzufragen. Kunden registrieren sich beim Proxy.

Ein Proxy, der dem Beobachtermuster folgt, kann sowohl Anpassungs- als auch Ressourcenprobleme lösen. Dies funktioniert über das Internet genauso gut wie zwischen Objekten. Wenn Sie sich registrieren, möchten Sie angerufen werden, wenn etwas passiert. Hören Sie auf einen Port und Sie sind bereit, angerufen zu werden. Ajax, REST, UDP, was auch immer.

Das Problem beim Abrufen besteht darin, dass der Beobachter steuert, wann der Anruf erfolgt, jedoch nicht weiß, wann sich der Status ändert, sodass viele unnötige Anrufe getätigt werden. Dies verbraucht Ressourcen, insbesondere wenn es viele Beobachter gibt. Der Schlüssel zum Umgang mit Abstimmungen liegt darin, die Richtung der Anrufe so schnell wie möglich vom Punkt der Zustandsänderung zum Beobachter zu bringen. Dann kommen Anrufe, wenn sie gebraucht werden. Nicht wenn sie nicht sind.

Wenn Sie folgende Abrufanrufe haben:

  • Server <=== Viele Beobachter

All dies wäre ein besserer Weg, um Änderungen zu erkennen:

  • SC: Server ===> Viele Beobachter

  • IC: Server ===> Ein Proxy ===> Viele Beobachter

  • SU: Server <=== Ein Proxy ===> Viele Beobachter

  • IU: Server <=== Ein Proxy ===> Viele Beobachter


7
Sie haben das Szenario "Lazy Fix" verpasst: Erstellen Sie einfach einen einfachen Proxy zwischen den Parteien und führen Sie überall Abfragen durch. Das Hauptleistungsproblem liegt wahrscheinlich darin, dass der Server bei jeder Abfrage viele komplexe Arbeiten ausführt. Durch die Verwendung eines Rate-Throttling-Proxys (Nginx-, Memcached-, In-Memory-LRU-Struktur, was auch immer) sollte es möglich sein, bessere Antwortraten zu erzielen, ohne die serverseitigen Berechnungen bei jeder Javascript-Abfrage aufzurufen.
user1643723

@CandiedOrange, in Bezug auf Beobachter wäre es so etwas wie SignalR?
Gene

@Gene wenn ihr Hype geglaubt werden kann dann ja. Sie reden davon, dasselbe zu tun.
candied_orange

6

Sie können Server-Sent-Events als Alternative zum Polling verwenden.

Anstatt Ihren Server alle n Sekunden nach neuen Daten zu fragen, öffnen Sie eine dedizierte Verbindung und lassen Sie Ihre neuen Daten senden, sobald sie verfügbar sind!

Die Verbindung bleibt geöffnet, bis sie entweder vom Client oder vom Server (oder durch deren plötzliche Beendigung) explizit geschlossen wird.

Sie können Ihren Server so einrichten, dass Daten in festgelegten Intervallen oder zu bestimmten Zeiten auf Ihrem Server an Ihren Client gesendet werden (z. B. wenn ein Objekt den Status ändert oder wenn ein Scheduler einen Job auslöst oder wann).

Sie können verschiedene Ereignistypen definieren und verschiedene Routinen unterschiedliche Ereignistypen behandeln lassen.

Auf der Serverseite können Sie eine Warteschlange mit Benutzern halten, die derzeit Ihren Anwendungs- / Ereignistyp abonniert haben. Wenn ein Ereignis erstellt wird, sendet Ihr Server es an alle Benutzer in der Warteschlange. Frameworks wie Jersey2 implementieren diesen Ansatz bereits mithilfe eines Broadcaster-Objekts .

Auf der Clientseite müssen Sie einen Dienst schreiben , der vom Server gesendete Ereignisse unter einer bestimmten URL abhört .

Wenn Sie einen Status / eine Route eingeben, müssen Sie einen Servertyp abonnieren und sich abmelden $destroy, um ein Leck zu vermeiden.


Hallo svarog, können wir Multicast mit vom Server gesendeten Ereignissen erreichen? Außer Jesey 2 ist jede andere Client-Implementierung verfügbar? Ich suche einen http2-Client, der SSE-Ereignisse abonnieren kann.
Kapil das

3

Sie sind Websockets: Sie sind eine Erweiterung von HTTP und arbeiten im selben Port.

Es ermöglicht die bidirektionale Kommunikation zwischen Client und Server und natürlich steht dafür eine eckige Integration zur Verfügung.

Ansonsten gibt es auf der Backoffice-Seite, wenn Sie sich Spring in Java ansehen, andere Möglichkeiten:

  • Lange Umfrage
  • STAMPFEN
  • ...

Dieser Link enthält Websocket und andere Methoden, die an Ihre Bedürfnisse angepasst sind.

Wenn Sie Spring / Java nicht haben, sollten Sie es trotzdem lesen und nach einer entsprechenden Lösung in Ihrem Technologie-Stack suchen.


Wie viele offene Socket-Verbindungen kann ein Server maximal gleichzeitig verarbeiten? Sind die Websockets skalierbar?
Thewebjackal

Das weiß ich nicht, es gibt sehr wahrscheinlich einige Sachen, die das ausgleichen können, aber ich weiß es nicht.
Walfrat

1

Sie müssen Dinge wie "ziemlich anstrengend" besser definieren und herausfinden, warum das neueste Ergebnis nicht sofort abgerufen wird. Dies sind Fragen, die wahrscheinlich auftreten, unabhängig davon, ob Sie von Ihrem Kunden abfragen oder nicht.

Mit einem browserbasierten Front-End haben Sie jedoch grundsätzlich zwei Möglichkeiten, wenn Sie in nativem Javascript bleiben möchten: Polling (wie Sie es tun oder möglicherweise lange Polling) oder Web-Sockets. Ich habe noch nie zuvor Web-Sockets mit ASMX gesehen (ohne zu sagen, dass dies nicht möglich ist, nur dass ich dort keine Erfahrung habe und daher nicht weiß, wie schwierig es für Sie wäre, sie erneut zu implementieren). Wenn Sie, wie gesagt, Leistungs- oder Genauigkeitsprobleme haben, sind diese möglicherweise auch bei Verwendung von Web-Sockets noch vorhanden.


Hallo, bitte sehen Sie das Update!
Gene
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.