úterý 24. října 2017

Kolenovrt a Azure Function

Lákají mě nové věci, proč si to nepřiznat. A tak jsem před časem využil oba 45€ vouchery, co máme každý měsíc k Visual Studiu...

Hodně ze široka

Náš největší zákazník, ČHMÚ, se k iniciativě OpenData staví naprosto odmítavě a co z něj nevytluče nadřízený orgán, to nedá, zákon nezákon. Což jednak pěkně ilustruje Honza Cibulka na DataStory, druhak Hackatlon státní správy, kde po Hydráku nebylo ani vidu, ani slechu. 

Ale přeci jenom někudy nějaká data prosakují... budete-li pozorní a probloudíte až na stránku Aktuální hod. přehled na záložce Ovzduší (záložku nelze prolinkovat), tak vpravo nahoře jsou šedě miniaturní odkazy ke stažení dat Informace o kvalitě ovzduší. Data jsou za minulou hodinu a historie se nekoná. Použitelný je formát JSON, obsahuje data z ČR, Horního Rakouska, Polska a hlavně obsahuje čas poslední aktualizace, což zjednodušuje automatizované zpracování.

Ve stejnou dobu jako já se o stejná data začalo zajímat Ekologické centrum Most a Kralupy nad Vltavou, kterým se tenkrát ČHMÚ chystal típnout FTP přístup na imisní data. Vytvořili jsme tedy společně aplikaci MicroISKO, která olízne každých pár minut výše zmíněný JSON, relevantní údaje uloží do databáze a v případě změny dat vygeneruje grafy a excelové tabulky. Řešení funkční, ale své mouchy má, už jen proto, že je to klasická WinForms aplikace a data ukládá na SQL Express. No a stabilita připojení v místě instalace taky není žádná sláva.

Azure

A teď se do toho začíná míchat ten Azure...

Problematiku jsem znal, složku s analýzou MicroISKO pro WinForms jsem měl jednak ve stole a taky jsem ji ještě nosil v hlavě, tedy napřed zkouším:

Virtuální počítač

Prostě jsem vytvořil virtuální počítač a na něm zprovoznil MicroISKO. Bylo to funkční, bylo to někde v holandském datacentru na páteři, ale i když jsem si nakonfiguroval slabou plečku, dost to žralo voucher.

Tedy jsem to přehodnotil a vyzkoušel:

Web App Services

To už bylo lepší. Jedna service se kompletně starala o stažení a aktualizaci dat a spálila jen asi 13€ měsíčně. Druhá, na které běžel MS IIS, si brala závratných 37€, byť jen odbejvala pár návštěvníků denně. Data jsem z úsporných důvodů ukládal na Úložiště tabulkových dat (neplést se SQL). Je to laciné a i dostatečně rychlé, byť si nakonfigurujete COLD storage.

Toto je graf spotřeby € za kompletní stažení a analýzu dat.
Graf za webovou část mě nenapadlo okopírovat,
bo jsem netušil, že o tom někdy budu psát.

Nebylo to už tak drahé, byť IIS byl hodně lenivý a asi to chtělo potunit, ale co bych za ty prachy chtěl, že... no a navíc jsem zrovna neměl čas a chuť k dalším experimentům. Prostě skoro rok to zůstalo u ledu.

No a pak se objevily:

App Functions

což bylo přesně to, co jsem potřeboval. App functions jsou funkce, které se spustí jen v reakci na nějakou událost a pak zase chcípnou. Účtuje se jen propálený procesorový čas.

Spustit je můžou události:
  • Http trigger (někdo vleze na stránku vaší funkce)
  • Timer trigger (klasický cronový časovač, kde se dá nakonfigurovat kde co)
  • Queue trigger (něco spadlo do fronty)
  • Blob trigger (něco bylo zapsáno do úložiště blobů)
  • Manual trigger (klikli jste na tlačítko v řídícím panelu Azure)
  • a pár desítek dalších, u nichž funkci víceméně hádám ;-)

Taky jsem zjistil, že událostí stále přibývá, naposledy asi tři, které se točí kolem IoT Hub-u...

Podporovány jsou jazyky, byť asi ne úplně pro všechny události:
  • Bash
  • Batch
  • C#
  • F#
  • JavaScript
  • PHP
  • PowerShell
  • Python
  • TypeScript

Takže jsem celé MicroISKO Services překopal. Naštěstí zpracování JSONu a jeho persistence do tabulek, kterou mám v C#, jsem použil prakticky beze změn. Logiku aplikace jsem ale založil na frontách a funkcích GetNěco(). No a mapku už to kreslí!

Takto to funguje:
  1. TimmerTrigger každých 5 minut hodí JSON ze stránek Hydráku do fronty input-q
  2. Na to zareaguje queue trigger InputTrig a soubor z fronty nakopíruje do fronty archive-q a table-q
  3. Soubor z archive-q zpracuje ArchiveTrig a po jeho analýze jej uloží do archivní tabulky včetně příslušných klíčů.
  4. Soubor z table-q zpracuje TableTrig a po jeho analýze uloží data do příslušných datových tabulek.
  5. a ještě je tam pár HttpTriggerů, která vrací to nebo ono...

Asi se vám zdá, že je tam dost přetrigrováno, ale takové členění jednak umožňuje asynchronní zpracování a druhak mi umožňuje kutit na datech s minimálním rizikem ztráty dat. Zejména, když jsem ladil table-q, mi stále jelo stahování dat do archivu. Navíc jsem si napsal funkci, která mi data z archivu znova nasype do fronty a já pak mohu testovat až do zblbnutí...




Jak mi dojde zase nějaká volná chvíle, zkusím vyrobit funkci GetData() a zobrazit tabulku hodnot a graf. Ale už teď mi jde zoomovat a zobrazit měřicí stanici v Google Streetview, což Hydrák neumí. A jak tam rozjedu tlačítka na posun v historii, tak se...

A cena?

Predikce tvrdí, že měsíčně zacáluji 0.37€, ale ještě se chystám přidat
pár funkcí, tak uvidím.

Takto vypadá řídící panel pro MicroIskoAzure, všimněte si pulzování, které je způsobeno pětiminutovým intervalem stažení, uložení a analýzy datového souboru ze serveru ČHMÚ. Kdyby podporovali Webhook, tak bych je tak často neotravoval...

Něco chystám, protože cena je už závratných
0.45€ měsíčně.

PS

A to jsem vám říkal, že pokud neurčíte jinak, funkce se pustí tolikrát, kolikrát je potřeba?
To se to pak škáluje!

PSS

Tady mám nějakou mapku s aktuálními daty: µISKO

Žádné komentáře:

Okomentovat