RRZE-Webteam / FAU-Studium

Studiengangsdatenbank der FAU als Plugin
GNU General Public License v2.0
0 stars 0 forks source link

API: Verbesserungen an der Umsetzung #143

Closed xwolfde closed 1 month ago

xwolfde commented 2 months ago

Die Performance leidet insbesondere dadurch, dass bei jedem Cache-Reset alle >250 Studiengänge neu geladen werden, anstelle nur jene, bei denen sich was geändert hat oder auch nur jene wenigen, die eine Studiengangswebsite braucht.

Hintergrundbetrachtungen:

Zudem gibt es nun eine redundante API unter /wp-json/wp/v2/ , die zusätzlich abgerufen wird,

So haben wir bspw. folgende Zugriffe von einer Instanze auf die zentrale Website:

cms2 meinstudium.fau.de 10.27.20.3 - - [29/Jul/2024:01:01:37 +0200] "GET /wp-json/wp/v2/degree-program?page=1&per_page=100&&_fields=degree_program HTTP/1.1" 200 2956718 "-" "WordPress/6.6.1; https://www.theologie.fau.de"
cms2 meinstudium.fau.de 10.27.20.3 - - [29/Jul/2024:01:01:39 +0200] "GET /wp-json/wp/v2/degree-program?page=2&per_page=100&&_fields=degree_program HTTP/1.1" 200 2945652 "-" "WordPress/6.6.1; https://www.theologie.fau.de"
cms2 meinstudium.fau.de 10.27.20.3 - - [29/Jul/2024:01:01:40 +0200] "GET /wp-json/wp/v2/degree-program?page=3&per_page=100&&_fields=degree_program HTTP/1.1" 200 483804 "-" "WordPress/6.6.1; https://www.theologie.fau.de"
cms2 meinstudium.fau.de 10.27.20.2 - - [29/Jul/2024:01:01:41 +0200] "GET /wp-json/fau/v1/degree-program?page=1&per_page=100&&lang=de HTTP/1.1" 200 3206262 "-" "WordPress/6.6.1; https://www.theologie.fau.de"
cms2 meinstudium.fau.de 10.27.20.2 - - [29/Jul/2024:01:01:42 +0200] "GET /wp-json/fau/v1/degree-program?page=2&per_page=100&&lang=de HTTP/1.1" 200 3194521 "-" "WordPress/6.6.1; https://www.theologie.fau.de"
cms2 meinstudium.fau.de 10.27.20.3 - - [29/Jul/2024:01:01:44 +0200] "GET /wp-json/fau/v1/degree-program?page=3&per_page=100&&lang=de HTTP/1.1" 200 510172 "-" "WordPress/6.6.1; https://www.theologie.fau.de"

Bei der API hat man nur zwei Optionen: Entweder läd man eine Menge an STudiengängen über /wp-json/fau/v1/degree-program oder einen Einzelstudiengang über /wp-json/fau/v1/degree-program/$id , wobei $id dann die WordPress-ID des Post Types ist. Man erhält bei den JSON-Daten die man da erhält weder bei dem Sammelzugriff noch bei den Einzelzugriff ein Datum des EIntrags - weder Erstellungsdatum noch Modificationdatum. Oder auch keine Checksum. Bei den Sammelzugriff erhält man zudem alle Daten und nicht nur einen Teil.

Es ist eigentlich offensichtlich, dass so die Performance nicht gut sein kann.

Workaround-Diskussion

  1. Workaround: EIn Workaround ohne Änderungen am Plugin-Code wäre das Auslesen der /sItemap.xmlund dort das Filtern auf die Post-Types Studiengang:

Hier erhält man dann Einträge wie:

<url>
        <loc>https://meinstudium.fau.de/studiengang/artificial-intelligence-bsc/</loc>
        <lastmod>2024-07-29T06:33:06+00:00</lastmod>
</url>

Zwar kriegen wir somit eine Modification-TIme, aber es fehlt hier wieder die ID, mit der man /wp-json/fau/v1/degree-program/$id aufrufen könnte.

Gleichwohl kann man zunächst so vorgehen:

  1. Auslesen aller Studiengänge über GET /wp-json/fau/v1/degree-program?page=1&per_page=100& ... mit den 3 Seiten. Da das lastmod der Studiengänge leider nicht übermittelt wird in den JSON, wird diese dann für alle Studiengänge bei diesem Abruf auf die Zeit des Abrufs gesetzt.
  2. Damit erhalten wir auch die URL - diese findet sich im JSON im Attribut "link".
  3. Später beim Ablauf eines zu setzenden Timeouts, wird nicht etwa wieder alles geholt, sondern die sitemap ausgelesen und darin nach dem Eintrag mit der URL in <url> <loc> gesucht.
  4. Wenn der EIntrag vorhanden ist, wird geprüft, ob die lastmod neuer ist, als die vorherige. Nur in diesem Fall wird dann via /wp-json/fau/v1/degree-program/$id ein neuer Abruf der Detaildaten des Studiengangs gemacht.

Problem dieses Ansatzes: Neue Studiengänge werden so nicht mehr festgestellt. Somit muss man Punkt 1 doch irgendwie regelmässig, triggern. Jedoch könnte man Punkt 1 ggf. einmal am Tag machen, während man die 3+4 mehrmals am Tag machen könnte, ohne dass es dann Performanceprobleme gibt.

  1. Workaround: Ein anderer Workaround könnte es sein, wenn die Standard-WordPress-JSON-API uns die Daten aus der sitemap.xml, aber zusätzlich die Ids geben könnte. Konkret bräuchten wir einen API-Call der uns nur folgende Daten aller Studengänge zurückliefert: Id, lastmod, creation time, slug, url

Schlussfolgerung:

Um den Abruf der Studiengänge effektiv zu verbessern, ist eine Verbesserung der API und desen Ausgaben notwendig (Umsetzung Workaround 2):