Välimuisti, Cloud functions, PostgreSQL, Avoin data - Pääteohjaus 6

Cloud Run Functions

Google tarjoamat pilvifunktiot (Cloud Run functions) ovat yksi mahdollisuus Cloud runin lisäksi rakentaa omia sovelluksia tai erityisesti sovelluksen osia. Jos on tarve yksittäiselle toiminnolle, voi sen hyvin toteuttaa cloud functiona. Cloud run soveltuu paremmin kokonaisille Flask-sovelluksille ja sovelluksille joiden pitää vastata pyyntöihin nopeammin. Aiemmin toteutettu alkulukulaskenta olisi sopiva pilvifunktio. Pilvifunktioina voi toteuttaa myös taustalla toimivia funktioita.

Pilvifunktiot ovat tilattomia. Periaatteessa pilvifunktion ympäristö käynnistetään tyhjästä (cold start) jokaisella funktion kutsukerralla. Tämä on myös hidasta eli funktio vastaa ensimmäisellä kutsukerralla hitaammin, kuin heti seuraavilla. Käytännössä sama toimintaympäristö (instanssi) on elossa jonkun aikaa funktion kutsumisen jälkeen. Samaa ympäristöä voidaan käyttää seuraavalla kutsulla tai sitten luodaan uusi. Saman instanssin vastatessa uudelleen tulee vastaus huomattavasti nopeammin. Kaikki mitä voi myöhemmin uudelleen käyttää kannattaa pitää instanssin muistissa tallessa globaaleina muuttujina. Lue Tips & Tricks.

Kokeile mallia

from cachetools import cached, TTLCache
from cachetools.keys import hashkey

def main(request):
    n = request.args.get("n", 1)
    if n:
      return prime(n)
    else:
      return prime(2)

cache = TTLCache(maxsize=100, ttl=6000)

@cached(cache, key=hashkey)
def prime(n):
    if int(n) <= 1:
      return "[]"
    # hidas alkulukulaskenta-algoritmi
    # https://medium.com/@GalarnykMichael/prime-numbers-using-python-824ff4b3ea19
    primes = []
    for possiblePrime in range(2, int(n)):
    
        isPrime = True
        for num in range(2, possiblePrime):
            if possiblePrime % num == 0:
                isPrime = False
        if isPrime:
            primes.append(possiblePrime)
    return str(primes)

Cloud Run VS Cloud Functions: What’s the lowest cost?

Cloud functions vs App engine vs Cloud Run vs GKE

Cloud Run and Cloud Function: What do I use? And Why?

Cloud SQL

Otetaan käyttöön PostgreSQL-tietokanta Googlen pilvipalvelussa.

Tätä tietokantaa voisi periaatteessa käyttää myös users.jyu.fi:ssä olevalla sovelluksella, mutta it-palvelut on estänyt tämän.

Tietokantayhteys

Voit käsitellä tietokantaasi aivan samalla tavalla kuin sqlite3-tietokantaa. Joudut vain avaamaan tietokantayhteyden Googlen ohjeiden mukaan.

Jos et käytä postgresql-tietokantaasi, niin sammuta se ja poista kokonaan siihen liittyvä projekti ja tiedostot Googlen pilvestä.

Avoin data

Käytetään muiden tekemiä XML-dokumentteja ja WWW-sivuja tiedonlähteenä.

DOM-rajapinta on tuttu jo TIEA2120 WEb-käyttöliittymien ohjelmointi -kurssilta. Jos olet unohtanut, niin kertaa Document Object Model (DOM) ja Javascript ja DOM. Tässä pääteohjauksessa opetellaan DOM-rajapinnan käyttäminen Python-ohjelmointikielellä.

Ulkoisen XML-datan sisällyttäminen omalle sivulle

XML ja nimiavaruudet

XML-dokumenttiin voi olla sisällytetty elementtejä useasta eri nimiavaruudesta (namespace). Tämä täytyy osata huomioida dokumentin sisältöä käsiteltäessä. Käytetystä kirjastosta riippuen voi joutua käyttämään getElementsByTagNameNS-funktiota tavallisen getElementsByTagName-funktion sijaan. Esim.

mi = doc.getElementsByTagNameNS("http://www.w3.org/1998/Math/MathML", "mi")

Käyttämällä nimiavaruuden osaavaa versiota varmistaa, että ei ainakaan saa vahingossa tulokseen vääriä elementtejä. Eri nimiavaruuksissa voi olla samannimisiä elementtejä.

Joskus XML-dokumenteissa on myös CDATA-osioita, joiden parsiminen täytyy joillakin kirjastoilla tehdä poikkeavasti:

if node.firstChild.nodeName == "#cdata-section":
    print node.firstChild.data
else:
    print node.firstChild.nodeValue

ElementTree

Voit halutessasi opetella käyttämään myös ElementTree XML API-rajapintaa. ElementTree-rajapinnan käyttäminen on hieman yksinkertaisempaa kuin DOM-rajapinnan. ElementTree-rajapintaa tarvitset, jos joudut parsimaan rakenteeltaan rikkinäisiä html-dokumentteja (tagsoup...). Tällöin käytetään esimerkiksi BeautifulSoup-kirjastoa, joka toteuttaa ElementTree-rajapinnan.

Käyttäjien kommentit

Kommentoi Lisää kommentti