Page 1 of 2 1 2 LastLast
Results 1 to 15 of 20

Thread: http POST performance

  1. #1

    http POST performance

    Hi delphiliefhebbers!

    Ik heb een applicatie gemaakt die op de achtergrond van seconde tot seconde diagnostische gegevens verzameld (cpu, memory load etc) en deze sla ik op in een Tstringlist. Deze gegevens POST ik via idhttp request naar een php script die ze in mysql zet. Allemaal geen probleem.
    Echter ga ik deze applicatie op meerdere bedrijfscomputers inzetten waar mensen op werken en ik vraag me af of dit proces qua load efficiënter kan (dus dat gebruikers er geen ‘last’ van hebben). Aangezien ik deze gegevens niet realtime hoef te hebben (1x per dag syncen met db is ook goed) zijn er wellicht betere opties.
    Oftewel wat is sneller:

    - Elke 20min kleinere hoeveel heden data posten naar het script
    - De tstringlist elke 20min opslaan naar een file (want als pc reboot is alles weg anders), en die file in 1x posten 1x per dag
    - andere opties?

    mijn delphi kennis is niet extreem hoog. Optie 1 heb ik al voor elkaar.
    Ondanks dat de post naar een https is zit ik er ook nog over na te denken om de data encrypted te sturen. Dus dit zal ook wat extra load kosten.

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,531
    Deze gegevens POST ik via idhttp request naar een php script die ze in mysql zet.
    Dan stel ik de eerste vraag: Waarom op deze manier? Is het niet simpeler om de gegevens rechtstreeks te versturen naar de database of staat deze op een plek waar je officieel niet bij kan?

    Je kan met Delphi makkelijk de MySQL database benaderen. Met verschillende computers is dat geen probleem.
    Delphi is great. Lazarus is more powerfull

  3. #3
    Quote Originally Posted by jkuiper View Post
    Dan stel ik de eerste vraag: Waarom op deze manier? Is het niet simpeler om de gegevens rechtstreeks te versturen naar de database of staat deze op een plek waar je officieel niet bij kan?

    Je kan met Delphi makkelijk de MySQL database benaderen. Met verschillende computers is dat geen probleem.
    Bedankt voor je reactie! heb ik inderdaad ook over nagedacht, maar mijn php skills zijn iets beter dan delphi aangezien er op basis van deze gegevens nog calculaties gemaakt moeten worden aan de server kant doe ik dit liever zo.
    Performance server side maakt niet zoveel uit overigens.

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,531
    Echter ga ik deze applicatie op meerdere bedrijfscomputers inzetten waar mensen op werken en ik vraag me af of dit proces qua load efficiënter kan (dus dat gebruikers er geen ‘last’ van hebben).
    De load ligt meer aan de server kant, dan aan de client kant. HTTPOST stuurt deze weg en dan is het klaar voor de client.
    - Elke 20min kleinere hoeveel heden data posten naar het script
    Als de pc in die tussentijd crashed of de applicatie heb je niets meer.
    - De tstringlist elke 20min opslaan naar een file (want als pc reboot is alles weg anders), en die file in 1x posten 1x per dag
    Zelfde probleem als optie 1. Echter kan er een gap ontstaan van je gegevens. 1x posten is dan heel weinig.
    - andere opties?
    Stringlist telkens laten opslaan is geen goed idee. Dan ga je de schijf onnodig belasten door continue dezelfde gegevens op te slaan. Al is een schijf tegenwoordig best wel snel en met de uitkomst van HHD is dat best te verwaarlozen. Echter veel tekst maakt het schrijven wel onnodig traag. Hoe wil je dat oplossen als je maar 1 keer per dag wil posten.

    Als je je aan je principe wilt vasthouden met httppost, zal ik toch kiezen om gebruik te maken van een lokale database. Dat kan SQLite zijn (Embedded firebird is een goede optie). Je data wordt ten alle tijden opgeslagen. Daarna kan je op jouw gewensde tijdstip de gegevens 'flushen' naar de server.
    Delphi is great. Lazarus is more powerfull

  5. #5
    Ik denk persoonlijk dat de oplossing die je nu gebruikt echt prima zal werken - zelf heb ik ook een groot aantal apparaten die op een simpele php api posten (json) en die schrijft alles weg naar een mysql db. Deze api krijgt elke 30sec een post met allerlei data - nu is die post op zich zo groot niet, en op de api kant heb ik een soort "Pool" gemaakt, die op de server kant zoveel mogelijk updates bij elkaar verzameld om dan een multi query te doen - zodat niet voor elke losse post een query uitgevoerd moet worden.

    Je zou zoiets ook kunnen proberen, clientside heb je dan niks van belasting - zoals JKuiper al zei, het is "maar" een post - en als je op de server kant goed opvangt zou de server load ook minimaal moeten zijn;

    Info php: https://www.php.net/manual/en/class.pool.php

  6. #6
    Posten van data, zeker als het maar weinig is, zou niet zo'n probleem moeten zijn. Je kan die data posten vanuit een achtergrond thread.

    Wij loggen ook allerlei informatie (nog wel heel wat meer, trouwens), naar een folder op een netwerkshare. In de applicatie is er een logger die die gegevens verzamelt en periodiek lokaal opslaat (voor het geval de computer uitvalt of de share wegvalt). Na het lokaal opslaan probeert hij ook om de gegevens naar het netwerk te schrijven. Lukt dat niet, dan is er altijd nog de lokale kopie, die er zelfs nog staat als de applicatie of de hele PC herstart wordt.

    Ik weet niet hoe relevant deze informatie voor jou is, en hoe erg het is als er af en toe een blokje ontbreekt, maar ik zou zelf denk ik gewoon proberen om die gegevens elke minuut (of elke paar minuten) naar je script te posten. Lukt dat, dan gooi je de stringlist leeg. Lukt het niet, dan bewaar je de info in de stringlist en probeer je het een minuut later opnieuw met de extra verzamelde informatie. Als je 100 gebruikers hebt, dan zou je 100 requests per minuut naar je script sturen. Dat zou zelfs op een heel eenvoudige server geen probleem moeten zijn.
    1+1=b

  7. #7
    de oplossing van posten naar een api is ook vanuit security oogpunt beter.

    Database poorten wil je niet publiek open hebben staan. In een lan zou je het kunnen doen in een omgeving aan internet zou ik het nooit doen.

  8. #8
    I7 7700K 32Gb Win10 Pro Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    1,917
    Quote Originally Posted by Mrorange View Post
    op de achtergrond van seconde tot seconde diagnostische gegevens verzameld (cpu, memory load etc.
    Denk wel om te AVG,.. je kan veel meer laten sturen dan wat strikt noodzakelijk is.
    Ook diagnotische gegevens moet je goed onderbouwen, waarom het nodig is dat je deze logt, het is misschien wel doomdenken maar in extreme gevallen zou het kunnen zijn dat de werknemer die achter die computer zit,
    waar jij dan de gegevens van logt, deze actie gaat ge-/mis bruiken als die werknemer in een conflict komt met de werkgever.

    Zie het als videobewaking na een bepaalde tijd worden deze gewist, dat zal met logfiles ook moeten gebeuren.
    Staat er geen alert melding in het bestand, dan word deze na 2 dagen gewist.

    Je zal de gebruiker in ieder geval op de hoogte moeten stellen van de actie dat er gegevens gelogd worden.
    Aan de andere kant ben ik wel nieuwsgierig, wat wil je met die gegevens? als de computer aanstaat, heb je cpu en memory load. dat is redelijk normaal toch.
    Je kan pingen naar die computer om te kijken of hij nog in het netwerk zit, maar verder lijkt het me toch meer applicatie/database afhankelijk, wanneer en of er iets fout gaat.

    Peter
    10.3.1, Delphi2010, of Lazarus 2.0.2

  9. #9
    Bedankt voor alle reacties, helemaal helder. Gelukkig zat ik op de goede weg dus.
    AVG is zeker rekening mee gehouden, maar thx voor aankaarten!

    is idhttp (indy) het snelste component voor een simpele post?

  10. #10
    Quote Originally Posted by Mrorange View Post
    is idhttp (indy) het snelste component voor een simpele post?
    Of Ararat Synapse.

    Maar vergeet dit niet in een TThread te doen zodat je main-programma gewoon onverstoord door blijft lopen. Anders geeft die een 'hikje' op het moment dat jij de http-post doet.

  11. #11
    Quote Originally Posted by rvk View Post
    Of Ararat Synapse.

    Maar vergeet dit niet in een TThread te doen zodat je main-programma gewoon onverstoord door blijft lopen. Anders geeft die een 'hikje' op het moment dat jij de http-post doet.
    thanks!

    Ik ben al een tijdje aan het rommelen met threads. echter blijft ie haperen dus ik vermoed dat de thread geen thread is
    Heb je wellicht een klein vd van een idhttp post in een execute TThread?

  12. #12
    Simplistisch voorbeeld (niet getest, zo uit de hand getypt):

    (wel voor Synapse omdat ik niet zo graag met Indy werk en dat niet zo uit de vuist kan tikken maar je kunt het voorbeeld makkelijk aanpassen)

    Delphi Code:
    1. uses httpsend, synautil;
    2.  
    3. type
    4.   TThreadLogger = class(TThread)
    5.   private
    6.     FUrl: String;
    7.     FData: String;
    8.   protected
    9.     procedure Execute; override;
    10.   public
    11.     constructor Create(const AUrl, AData: String); reintroduce; virtual;
    12.   end;
    13.  
    14. constructor TThreadLogger.Create(const AUrl, AData: String);
    15. begin
    16.   inherited Create(false);
    17.   FreeOnTerminate := true;
    18.   FUrl := AUrl;
    19.   FData := AData;
    20. end;
    21.  
    22. procedure TThreadLogger.Execute;
    23. var
    24.   HTTP: THTTPSend;
    25. begin
    26.   HTTP := THTTPSend.Create;
    27.   try
    28.     WriteStrToStream(HTTP.Document, ansistring(FData));
    29.     HTTP.MimeType := 'application/x-www-form-urlencoded';
    30.     { Result := } HTTP.HTTPMethod('POST', FUrl);
    31.   finally
    32.       HTTP.Free;
    33.   end;
    34. end;
    35.  
    36. // -----------------------
    37. // GEBRUIK
    38. // -----------------------
    39.  
    40. procedure Test;
    41. // var Thrd: TThreadLogger;
    42. begin
    43.   { Thrd := } TThreadLogger.Create('https://somewebsi.te/page.php', 'somedata');
    44. end;

  13. #13
    thanks, de code lijkt te werken.
    Ben zelf nieuw met threads, maar als ik in de execute de return data wil uitlezen. dus: form1.memo1.text:=data;
    Dan lijkt ie weer te schokken.
    Last edited by GolezTrol; 13-Jun-19 at 23:58.

  14. #14
    Alle communicatie vanuit een thread naar de main moeten via Synchronize:
    http://docwiki.embarcadero.com/Libra...ad.Synchronize

    Delphi Code:
    1. Synchronize(
    2.   procedure
    3.   begin
    4.     Form1.Memo1.Lines.Add('Added from thread');
    5.   end);

    Je kan de output van je post ook gewoon naar een variable schrijven in je thread, en als je er mee klaar bent deze via synchronize naar je memo schrijven.

  15. #15
    Quote Originally Posted by Mrorange View Post
    is idhttp (indy) het snelste component voor een simpele post?
    Kan misschien uitmaken wat je post and hoe maar ics is imho sneller. (en kan je async posten)

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •