Inhaltsverzeichnis |
Ich arbeite gerade an meinem dritten Projekt, das auf WordPress MU (WPMU), der Multi User-Variante der Blog-Software “WordPress”, aufsetzt (hat was mit Lokales.at zu tun – das Projekt, nicht WPMU), und zum zweiten Mal versuche ich, eine zentrale Startseite aufzubauen, die Inhalte aus den verschiedenen Blogs, hauptsächlich in Form einer Auflistung der neuesten Artikel und Blogs nach bestimmten Kategorien, anzeigt.
Das ist schwierig. WordPress MU ist vom Aufbau her eine reine Hosting-Plattform, geschaffen für WordPress.com, der Geld-Druck-Maschine der WordPress-Macher. Eine Interaktion zwischen den Blogs ist nicht vorgesehen, eine zentrale Auflistung ausgewählter bzw. neuer Blogs oder Artikel ebenfalls nicht. (Die angezeigten meistgelesenen Blog Posts auf der WordPress.com-Startseite werden auf Basis des WordPress.com Stats-Plugins ausgelesen. Ein Workaround, das ich natürlich nicht zur Verfügung habe.)
Technischer Hintergrund
Um ohne großen Aufwand zu skalieren, erstellt WordPress MU für jeden einzelnen Blog im System komplett eigene Tabellen für Artikel, Kategorien, Links, etc. Damit muss man sich bei 100.000 aktiven Blogs keine Gedanken machen, die Datenbankabfragen so zu optimieren, dass aus der 100-Millionen-Artikel-Tabelle (WordPress speichert jede Revision, 1000 Artikel-Datensätze pro Blog sind also nicht unrealistisch) noch immer einigermaßen geschwind die Artikel abgefragt werden.
Das einzige (und viel simplere) Skalierungsproblem, das gelöst werden muss, ist die Aufteilung der Tabellen auf verschiedene MySQL-Schemas. (Ein Schema beinhaltet mehrere Tabellen, die Tabellen die Daten. Ab einigen tausend Tabellen in einem einzelnen Schema wird MySQL allerdings wieder langsam, weshalb eben mehrere Schemen erstellt werden, die auf verschiedene Server verteilt werden.) Der Code für diese Verteilung der Tabellen auf MySQL-Schemas wurde übrigens, wie die meisten WordPress.com-spezifischen Features, nicht als Open Source veröffentlicht.
Jetzt ist es aber nicht ernsthaft möglich, aus mehreren Tabellen die neuesten Artikel auszulesen. Workarounds, wie die Sammlung aller Artikel in einer zentralen Artikel-Datenbank, beheben dagegen nicht das ursprüngliche Skalierungsproblem.
Meine Mini-Lösungen
Ich habe für meine eigenen Zwecke einige Mini-Lösungen entwickelt, die diese Probleme ausmerzen, gleichzeitig aber auch so gut wie möglich skalieren sollen.
Ich hab bisher keine der Plug-ins veröffentlicht, werde das aber bei Interesse gerne tun.
Global Blog Options
Global Blog Options ist im Prinzip eine Kopie der “normalen”, Blog-spezifischen Optionen, die von WordPress verwendet werden, um die Einstellungen zu speichern. Die Blog-Optionen werden in einer für jeden Blog eigenen Tabelle gespeichert, es ist daher nicht möglich, zum Beispiel alle Blogs mit einem bestimmten Design anzuzeigen.
Global Blog Options ermöglicht, Optionen in eine zentrale Tabelle zu speichern, eine Global Blog Option besteht aus der Blog-ID, dem Schlüssel und dem Wert. Basierend auf Schlüssel und Wert können dann Blogs abgefragt werden.
Blogs bei Lokales.at werden beispielsweise einem Bezirk zugeordnet, der Schlüssel ist “region”, der Wert zum Beispiel “linz”. Auf einer Linz-Übersichtsseite können dann sehr einfach alle Blogs ausgelesen werden, die als Schlüssel “region” und als Wert “linz” gespeichert haben.
Dieses Plug-in wird wahrscheinlich auch seinen Weg in Lauter.fm finden, wo wir vorhandene Profil-Daten zusätzlich zentral speichern, um die Blogs besser visualisieren zu können.
Global Blog Posts
Global Blog Posts ist ebenfalls eine zentrale Tabelle, in der die IDs und das Veröffentlichungs-Datum aller Blog Posts gespeichert werden. Die Verwaltung dieser Tabelle wird automatisch im Hintergrund vorgenommen.
In Verbindung mit den Global Blog Options kann ich jetzt beispielsweise alle neuen Blog-Artikel aus der Region “Linz” anzeigen.