Web requests in Warteschlange legen

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Web requests in Warteschlange legen

    Guten Abend,

    ich wollte mich hier mal schlau machen, wie man am besten an folgende Sache herangeht.

    Ich tätige am Tag ca. 30000 API Abfragen, die natürlich einige Zeit in Anspruch nehmen.

    Beispiel: 1. Abfrage (Webrequest) -> Signieren im Programm -> 2. Abfrage (Webrequest)

    Um die Sache zu beschleunigen, wollte ich nach der 1. Abfrage, die nachfolgende Signierung und 2. Abfrage asynchron im Hintergrund weiterverabeiten lassen.

    Die ganzen Abfragen sind in einer List<T> und sollen natürlich durch den Rückgabewert der 2. Abfrage ergänzt werden.

    Kann mir da einer grob den Ablauf schildern, wie man an so etwas herangeht?

    Gruß Marco
    Das ist sicherlich ein Fall für den Async-Pattern.
    Musste mal im ObjectBrowser gucken, wie die Async-Methoden des Webrequests so heissen.
    ich hab aber nicht genau verstanden, was du machen willst - ob du 3000 Requests abfahren willst, oder ob das eine Abfolge von Requests ist, die häufig vorkommt oder was.
    auch nicht verstandne, ob die eine Abfrage das Ergebnis einer anderen benötigt, und so Sachen.

    Marcolotti schrieb:

    30000 API Abfragen
    als Client?
    auf einen fremden Server?
    übers Internet?
    Kann Server und Leitung das überhaupt verkraften?
    Erlaubt der Server das überhaupt oder begrenzt der vorher?

    Marcolotti schrieb:

    30000 API Abfragen, die natürlich einige Zeit in Anspruch nehmen.
    Du hast durchschnittlich 3 Sekunden pro Request und das 24/7?
    Macht in Spitzenzeiten wahrscheinlich weniger als 1 Sekunde maximale Durchlaufzeit.
    Stolzes Programm.

    Marcolotti schrieb:

    List<T>
    Ich würde eher eine ConcurrentQueue<T> nehmen, aus der sich 4-8 Threads bedienen und die Aufgaben seriell abarbeiten.
    Denn wahrscheinlich müssen die beiden Webrequests zwingend in derselben Session nacheinander abgearbeitet werden-
    Und mehr als 4 Sessions auf denselben Server wird wahrscheinlich eh nicht sinnvoll gehen.

    Aber wie auch oben schon erwähnt wurde, sind hier zu viele offenen Fragen, um definitiv etwas raten zu können.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Guten Morgen,

    das ist eine Blockchain-Anwendung die die Wähler eines Repräsentanten belohnt. (dpos)

    Das heißt 4x am Tag gibt es einen Wahlzyklus und danach startet die Auszahlung. Das mache ich seit ca. 1 1/2 Jahren und es sind schon über 10 Millionen Transaktionen getätigt wurden.
    Server gibt es viele. Ich betreibe auch eigene Nodes, die einen Großteil der Abfragen entgegen nehmen.

    So eine Transaktion besteht aus 3 Aktionen: Transaktion erstellen, Signieren und Broadcasting der Transaktion. Eine Abfrage habe ich bereits eingespart und Signiere offline im Programm. Jetzt bleiben nur noch 2 Abfragen übrig.
    Das wären 4x mal am Tag ca. 3000-3500 Transaktionen.

    Daher: 1x Transaktionserstellung (1. Abfrage), dann offline-signing und dann broadcasten. (2.Abfrage) Wobei Schritt 2 und 3 zeitlich versetzt sein kann. (Bis zum Ablaufzeitpunkt, ich glaube 5 Minuten)
    Transaktionserstellung und Broadcasting müssen NICHT auf einem und dem selben Server abgewickelt werden. Das war auch die zusätzliche Idee dahinter.

    Ich habe also eine Schleife, welche alle Transaktionen durchläuft völlig synchron und das dauert um die 30 Minuten.

    Ich hoffe, ich konnte alle Fragen beantworten.

    Gruß Marco

    P.S. Die Server sind ProLiants Gen9 mit genug RAM und 2x CPU´s ala 8 Kernen. Das sollte genügen.



    Marcolotti schrieb:

    Ich habe also eine Schleife, welche alle Transaktionen durchläuft völlig synchron und das dauert um die 30 Minuten.
    Wie gesagt, die ganzen Transaktionen in eine ConcurrentQueue<T> werfen und die von n Threads parallel abarbeiten lassen.

    Oder drei Queues, für jede Aufgabenart eine.

    Wenn es rechenintensive Tasks sind, kannst du auch versuchen, zusätzlich mit Parallel.ForEach zu arbeiten.
    docs.microsoft.com/en-us/dotne…ard/parallel-programming/
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --