Néhány nappal ezelőtt néhány drága felhasználónk felhívta a figyelmünket, hogy az elektronikus számla letöltésének az ideje "meghosszabbodott", volt olyan akinek fél percet is kellett várnia mire letöltött a számla. Az nagyon messze van az általunk ideálisnak tekintett "pár másodperc"-től.

Figyelem: Fejfádítóan technikai cikk következik! :)
Mi lehet a gond?
Az egész folyamatot elemezve, a következő történik:
- A szerver generál egy PDF fájlt a számla adatai alapján - ez nem lehetett lassú, mivel kizárólag az elektronikus számlákat érinti a lassulás, a hagyományos nyomtatott számlákat nem
- A PDF fájlt átadjuk egy Java processnek, ami egyrészt végig ellenőrizi a PDF fájl struktúráját, hogy megfelelő-e.
- A PDF fájlból készítünk egy hash, amit aláírunk a tanúsítványainkkal
- Az aláírást továbbküldjük a TSA-nek (timestamping authority), ők rábiggyesztik a hivatalos időbélyeget, és visszaküldik nekünk
- Ezt az egészet összegyúrjuk CAdES aláírássá, és újraírjuk a PDF fájlt az aláírással
- A kész PDF fájlt visszaküldjük a felhasználót kiszolgáló folyamatnak
A teljes folyamatot profiloztuk, és sikerült néhány bottlenecket találnunk benne. Az első, hogy néhány tanúsítványt nem cacheltünk, és mivel a szerverek ahonnan összegyűjtöttük őket nagyon lassan válaszoltak rá, ezzel jelentősen lelassították a mi folyamatunkat.
A mostani verzió
A jelenleg futó verzióban több folyamat részbe tettünk memória cacheeket, valamint a teljes folyamatot tovább gyorsítottuk egy kis optimalizálós fekete mágiával. Már ezzel sikerült 5 másodperc alá szorítanunk a generálás sebességét (ez már így is közel 300% -os sebesség növekedés).
További másodpercek harca
Sajnos az egyik leglassabb rész a használt PDF könyvtár sebességéből adódik. Nincs megfelelően optimalizálva a mentés sebessége, mivel digitális aláíráshoz egy úgynevezett inkrementális mentést kell használni, és a PDF összes részét végig ellenőrizni. Ráadásul mindezt nem tudjuk memóriában csinálni, hanem kénytelen vagyunk lemezen ideiglenes fájlokba a mentést megcsinálni. Attól függetlenül, hogy kizárólag SSD merevlemezeket használunk, sajnos ez még mindig egy lassú folyamat.
Azon kívül, hogy elkezdtünk beletúrni a nyílt forráskódú PDFBox könyvtárba (természetesen ha sikerült megoldást találnunk, azt átadjuk a PDFBoxnak, valószínűleg nem csak nekünk van szükségünk gyorsabb könyvtárra), még további optimalizálsokat csináltunk a rendszerben, így a mostani fejlesztés alatt lévő aláíró szerver már 1-2 másodperc alatt képes egy aláírást létrehozni, de ezt még tovább szeretnénk gyorsítani akár a mágikus másodperces határ alá szorítani.
Mennyiben befolyásol ez engem?
Tulajdonképpen csak annyiban, hogy kicsit többet kell most várni egy elektornikus számlára mint azt szeretnénk. Ettől függetlenül a mostani 4-5 másodperces várakozás (és a következő verzió 1-2 másodperces ideje) szerintünk az elfogadható határon bőven belül van, csak szeretnénk ha tudnátok, hogy mindent megteszünk annak érdekében, hogy ez még sokkal-de-sokkal gyorsabb legyen! Így is a 2 másodperces elkészítés több mint 100% gyorsulás a mostanihoz képest, szóval most már abban a kategóriában mozgunk ahol egy-egy komolyabb fejlesztés is minimális érezhető sebesség növekedést okoz.
Miért ilyen nehéz ez?
Mert a mostani 4 másodperces generálási sebességhez képest a 2 másodperc 100%-os növekedés, és egy-egy jól megírt algoritmus optimalizálása is kb. 10-20% -os növekedést eredményez jobb esetben. Ezért mások nem szoktak foglalkozni ezekkel, mivel az érezhető sebesség nem változik (nagyon kevesen fognak észrevenni különbséget 2.5 másodperc és 2 másodperc között). Ettől függetlenül mi tovább harcolunk minden egyes tizedmásodpercért. :))
Mondtam én, tiszta Forma 1!