ugrás a tartalomhoz

Analitikai szolgáltatás API

webproghu · 2013. Jún. 16. (V), 14.10
Sziasztok!

A következő problémában szeretném a tanácsotokat kérni:
fejlesztek egy analitikai szolgáltatást, amihez tartozik egy API. Ehhez az API-hoz szeretnék egy PHP library-t írni, ami minél egyszerűbben beépíthető más weboldalakba. A lényeg, hogy szerver oldalon ha történik valamilyen esemény (regisztráció, belépés, stb), akkor azt valamilyen módon el tudjam küldeni az analitikai szolgáltatásnak. Például regisztrációnál a kódba egy ilyet illesztünk:

Event::create(
  'registration',
  'test##kukac##example.com'
);
A háttérben CURL-el hívom az API megfelelő metódusát.
A gondom ezzel az, hogy ha nagy a latency, az analitikai szolgáltatás szervere lassan válaszol, netalántál nem válaszol, akkor az eléggé meg tudja fogni az eredeti oldalt. Olyan megoldást próbálok keresni, ami minél egyszerűbb és akár egy shared hosting-os oldalba is beilleszthető, tehát nem igényel semmilyen különleges PHP extension-t, fork-olást, trükközést, stb.

Valaki találkozott már ilyen problémával, esetleg van javaslata a megoldásra?

Előre is köszönök minden segítséget!
 
1

Szia,

gyoridavid · 2013. Jún. 16. (V), 16.13
2

Röviden: nincs egyszerű

MadBence · 2013. Jún. 16. (V), 17.01
Röviden: nincs egyszerű dolgod, nem igazán alkalmas erre csak a php.
Hosszabban: Azt meg tudod tenni, hogy nem törődsz a válasszal, tehát elküldöd az eseményt, aztán nem is nagyon érdekel mi történik (nem fogod tudni, sikerült-e egyáltalán: ezzel spórolhatsz a legtöbbet). Ettől még minden hívás blokkolódni fog (fsockopen, fwrite). A stream_set_blocking() nem igazán nyújt semmit, hiszen lényegében csak írni akarsz, ezt pedig ha épp nincs tele a buffer, akkor meg tudod tenni, azaz sebességben nem nyersz semmit. Az igazán szép megoldás valamilyen message broker használata (pl. RabbitMQ), plusz egy háttérfeldolgozó üzembe állítása (ha nagyon ragaszkodsz a PHP-hez, akkor ez lehet valamilyen php-s cronjob is).
Abba érdemes beletörődni, hogy mindenképpen overheadet jelent egy ilyen szolgáltatás.

Amit érdemes még megnézni, hogy tud-e olyat a PHP (én nem tudom, viszonylag régen fogalkoztam PHP-val), hogy a kérés kiszolgálása után még szöszmötöl egy kicsit: ilyenkor esetleg még el tudod kapni a szerver válaszát, a felhasználó ezzel a késleltetéssel már nem fog találkozni.
4

Igazából a válasz nem fontos,

webproghu · 2013. Jún. 16. (V), 17.21
Igazából a válasz nem fontos, némi adatvesztés szerintem elfogadható a gyors működésért cserében.
3

Felhasználók

complex857 · 2013. Jún. 16. (V), 17.06
Hasonló telemetria adatokat gyűjtő szolgáltatás, a new relic ahol konkrétan php kiterjesztést kell telepíteni, cserébe alkalmazás szinten már nem kell hookokkal foglalkozni, közvetlenül C level függvényekre illetve kimenetbe automatán berakott beaconokra épülve implementálják az adatok begyűjtését. Mindez meg van fejelve egy a szerveren futó daemonnal, így még a "kliens" oldalon megoldható, hogy az események tömbösítve jussanak fel a szolgáltatáshoz, ha valamiért nem érhető el a távoli gép akkor megoldott az újraküldés és asszinkron a valódi requestektől.
Véleményem szerint ez egy igen jó kombináció, ha a project szempontjából nem volna showstopper az, hogy felhasználóidnak külön kell valamilyen daemont futtatni.

Shared hosting környezete válogatja, de ha cronjobok elérhetőek, létre lehet hozatni a library számára valamilyen lokális adatbázist ahol az események gyűlhetnek és telepítési instrukciók részévé tenni egy cronjobot ami majd elküldi őket a távoli gépre (feltéve, hogy nem real-time monitoring a cél).

Ha cron jobban se lehet bízni meg lehet próbálni simán kimenethez hozzácsapni 0x0 -s képet (output buffering, shutdown function) és http get paraméterei, vagy url részeként minden requestel kicsempészni az adatokat (nyilván valami shared-secrettel titkosítva legalább esetleg több lépcsőben, ha nem fér el egy menetben), így a felhasználód-felhasználóira hárítani az adatok célba juttatását (legtöbb ad szerver, vagy google analytics eventek hasonlóan működnek egyébként).
Nyilván ez valamivel bizonytalanabbá teszi adatok megérkezését, cserébe nem elávrás még a curl extension jelenléte sem a hostingon (én többször futottam bele abba, hogy nem volt elérhető, mert nem része default debian "libapache2-mod-php5" csomagnak) és szintén asszinkron működést biztosít.

Én mindenképp megpróbálnám elkerülni, hogy a konkrét felhasználóid-felhasználóinak requestjeibe valamilyen külső szolgáltatáson blokkoló hívásokat kelljen végezni mert ilyet üzemeltetni utána igencsak hálátlan feladat, de minden azon múlik mennyire biztosan kell célba érniük ezeknek az információknak.
5

Igen, ezeken már én is törtem

webproghu · 2013. Jún. 16. (V), 17.25
Igen, ezeken már én is törtem a fejem. Azon gondolkodom egyébként, ha valamilyen kliens oldali Javascript lib-et írnék a feladatra az lényegesen megkönnyíteni a dolgot, viszont ez esetben az érzékenyebb adatok továbbítása (email cím) aggaszt.
6

Ha a biztonság fontos, azt

MadBence · 2013. Jún. 16. (V), 17.36
Ha a biztonság fontos, azt kell csak megoldani, hogy:
  • A felhasználó ne tudja visszafejteni a küldött adatokat
  • A felhasználó ne tudja észrevétlenül módosítani a küldött adatokat

Ez gyakorlatilag bármilyen szimmetrikus/asszimetrikus kulcsú titkosítással megoldható.
Ami itt problémás lehet, hogy AJAX kéréseket nem lehet csak úgy indítani bárhova, bármilyen böngészővel, a GET kérésekbe pedig esetleg nem fér bele egy nagyobb adatcsomag.

Nem kell túlbonyolítani, hiszen a kliens feladata (elküldeni az adatokat a szervernek) nagyon egyszerű, pár soros script elintézi az egészet.
7

Ez gyakorlatilag bármilyen

webproghu · 2013. Jún. 16. (V), 17.42
Ez gyakorlatilag bármilyen szimmetrikus/asszimetrikus kulcsú titkosítással megoldható.


Húú, erről tudnál írni kicsit bővebben? Illetve, hogy merre érdemes nézelődnöm?

Ami itt problémás lehet, hogy AJAX kéréseket nem lehet csak úgy indítani bárhova, bármilyen böngészővel, a GET kérésekbe pedig esetleg nem fér bele egy nagyobb adatcsomag.


AJAX kérést nem, de JSONP-vel megoldható: http://weblabor.hu/cikkek/jsonp

Egyébként viszonylag kis adatcsomagok lesznek, az egész belefér maximum 100 karakterbe.
8

Nem nagyon fogalkoztam még

MadBence · 2013. Jún. 16. (V), 17.50
Nem nagyon fogalkoztam még PHP oldalon titkosítással/dekódolással, de erre érdemes nézelődni:

http://www.php.net/manual/en/function.mcrypt-encrypt.php

Minden kliens(szerver) kap egy saját kulcsot, ezzel titkosítja az adatokat, a felhasználó a kapott adatokat továbbítja az (analitikai) szerverre, ott pedig valamilyen azonosító (pl kliens-szerver id) alapján kikeresi a megfelelő kulcsot, amivel dekódolni tudja az adatokat. Kb ennyi.
9

nodejs

inf · 2013. Jún. 18. (K), 16.13
A nodejs erre tökéletesen megfelelő, mert eseményvezérelt, a php meg egyáltalán nem, mert nem az...
10

Nem érzem jogosnak :D, a cél

MadBence · 2013. Jún. 18. (K), 16.15
Nem érzem jogosnak :D, a cél egy PHP lib megírása, természetesen opció lehet más nyelveken is megírni ezt a libet, de itt most a PHP megzabolázása a feladat...
11

Hát hajrá :D Végülis dupla

inf · 2013. Jún. 18. (K), 16.17
Hát hajrá :D Végülis dupla idő alatt gányolással ugyanúgy megoldható...
12

Ha minél több platformon kell

MadBence · 2013. Jún. 18. (K), 16.44
Ha minél több platformon kell elérhetővé tenni az API-t, akkor nincs mese, ezt a "gányolást" be kell vállalni.