Hyppää pääsisältöön

Tech

Tehokas välimuistin hallinta on yksi Yle Areenan toimivuuden kulmakivistä

 Iivo Niskanen karjuu ilosta.
Kuva: EPA-EFE/All Over Press

Tätä artikkelia varten haastateltiin Yle Areenan parissa toimivia kehittäjiä Lauri Siltasta (Yle) ja Mikko Jokista (Kodan). Tekstin kirjoitti Kodanin palvelumuotoilija Ville Yli-Knuutila.

Maailman tahti kiihtyy, ja samaa vauhtia kasvaa Yle Areenan audio- ja videosisältöjen julkaisumäärä. Areenaan tuotetaan tällä hetkellä enemmän sisältöä kuin koskaan aikaisemmin.

Myös Areenan suosio on kasvussa. Oli kyse sitten Iivo Niskasen kultahiihdosta, jalkapallon EM-kisoista tai Ukrainan sodasta, niin lisätietoa kaipaavat ihmiset suuntaavat yhä useammin Areenaan. Areenaa käytetään viikottain usealla miljoonalla yksittäisellä laitteella, ja luku kasvaa tasaisesti.

Jatkuva sisällön määrän kasvu asettaa Areenan kehittäjille haasteita, sillä myös käyttäjien odotukset kasvavat jatkuvasti. Areenan odotetaan toimivan nopeasti ja luotettavasti, ja joka päivä paremmin kuin eilen. Areenan on löydettävä ja tarjottava käyttäjän hakema sisältö 300-400 000 aktiivisen ohjelman arkistosta vain muutamassa millisekunnissa.

Yhtälö ei ole helppo, mutta se on ratkaistavissa.

Tehokasta välimuistin hallintaa

Yksi Areenan tehokkuuden kannalta tärkeimpiä elementtejä on Areenan hakukuormaa tasaava välimuisti. Yksinkertaistetusti: Areenan välimuistiin tallennetaan todennäköisiä ja viimeaikaisia sisältöhakuja, ja kun eri päätelaitteet ja sovellukset hakevat tiettyä sisältöä, on sen palauttaminen nopeampaa jos hakuparametrit ovat tallennettuna välimuistiin. Tällöin haku skannaa vain välimuistin sisällön, ei koko Areenan sisältöä. Hakuja tapahtuu Areenassa niin paljon, että hakujen nopeuden kannalta on hyvin merkittävää haetaanko sisältö välimuistista vai palvelimelta.

Eräs Areenan tärkeimmistä välimuistiratkaisuista on toteutettu AWS:n Cloudfront -palvelun varaan. Juuri Cloudfrontin päälle kehitetyt ratkaisut tekevät sen eteen töitä, että Areenan hakuajat eivät venähdä liian pitkiksi.

Cloudfrontin tukena on Areenan pitkäaikaisten kehittäjien Mikko Jokisen (Kodan) ja Lauri Siltasen (Yle) räätälöimä välimuistiratkaisu, joka mukailee ns. stale-while-revalidate -metodia. Cloudfront ei natiivisti tue ko. metodia, joten se oli kehitettävä itse, käyttäen Clojure-kehityskieltä ja Redis-tietorakennevarastoa. Tällä ratkaisulla on saatu aikaan hienojakoinen välimuistitoteutus, joka osaa käyttää välimuistia kokonaisten listaushakujen lisäksi myös yksittäisille objekteille. Metodi nopeuttaa ja organisoi välimuistin toimintaa ja antaa kehittäjille mahdollisuuden kontrolloida ja optimoida välimuistin toimintaa tarkasti.

Metodia käyttäessä välimuisti toimii näin:

  • Välimuistiin tallennetulla sisällöllä on maksimiaika, jonka umpeuduttua sisältö muuttuu vanhentuneeksi (stale)

  • Kun tällaista vanhentunutta sisältöä haetaan, kysyjälle palautetaan vanhentunut sisältö, mutta taustalla sisältö päivitetään samanaikaisesti uuteen (while-revalidate)

  • Seuraava kysyjä saa uutta sisältöä

Stale-while-revalidate -metodin käyttäminen tuo ennen kaikkea joustavuutta siihen, miten välimuistin kuormaa hallitaan ja kuinka usein ja miten sinne tallennetaan uutta sisältöä.

Optimoidut API-toteutukset

Toinen tapa hallita Areenan hakukuormaa ovat Areenan monet hakurajapinnat, jotka ovat optimoitu toteuttamaan vain niille määrättyjä tehtäviä. Tällaisia hakurajapintoja ovat esimerkiksi Schedules-API, joka huolehtii Areenan suorien lähetysten hakemisesta, ja ainoastaan sarjoja koskeviin hakupyyntöihin vastaava Episodes-API.

Ratkaisuun päädyttiin, koska kehittäjien kokemus oli osoittanut, että yhden kaikilla mahdollisilla tavoilla toimivan rajapinnan käyttäminen johtaa vääjäämättömästi kompromisseihin jossain vaiheessa kehityssykliä. Tästä syntyi ajatus rakentaa yksi sisällön hakijoille näkyvä hakurajapinta, jonka taustalla toimii kuitenkin useita pienempiin paloihin pilkottuja hakurajapintoja.

Eri rajapinnat on myös rakennettu eri teknologioilla, jotta niitä voidaan optimoida vastaamaan aina haluttuun käyttötapaukseen. Pääohjelmointikielenä toimii Clojure, jonka lisäksi käytössä ovat esimerkiksi stukturoidun datan säilyttämiseen ja hakemiseen käytettävä PostgreSQL sekä vähemmän hierarkioihin ja relaatioihin perustuva OpenSearch, joka mukautuu paremmin vaihteleviin hakupyyntöihin.

Työ jatkuu

Edellä esitellyt ratkaisut toimivat tällä hetkellä hyvin, mutta työ jatkuu. Areenaan tuotetaan lisää sisältöä koko ajan, eivätkä maailman tapahtumat näytä ainakaan hidastumisen merkkejä. Areenan kehitystyö on jatkuvaa tasapainottelua sisällön määrän, toimivuuden ja tehokkuuden välillä.

Tärkeintä Areenan kehitystyössä on, että verovaroin ylläpidettävä palvelu toimii optimaalisesti ja luotettavasti kaikissa olosuhteissa. Sisältöjen ja käytön lisääntyessä jatkuvasti, on palvelun kannalta elintärkeää että sen skaalautuvuus on kunnossa.