03. August 2020
Die ultimative Subscription und Notification Lösung für Drupal
von Jürgen Haas

Aktuelle Situation

Fast alle Websites haben eine Anforderung gemeinsam: benachrichtigt zu werden, wenn etwas Bestimmtes passiert. Ob das nun ein neuer Blog-Post, ein neuer Kommentar, eine geänderte Version eines Nodes, eine Ausnahme in den Protokollen oder ein gelöschtes Benutzerkonto ist, entweder der Website-Administrator oder die Website-Besucher möchten über einige oder alle dieser Dinge informiert werden.

Während diese Anforderung ziemlich verbreitet ist, hat jeder Einzelne sehr unterschiedliche Ansichten darüber, wie er benachrichtigt werden möchte. Ohne in eine Diskussion über die Effektivität von E-Mails einzusteigen, scheint es genug zu sein, einfach über all die anderen verfügbaren Kanäle wie Slack, Mobile Push, Ticketsysteme oder sogar SMS nachzudenken.

Der Aufbau von Websites mit Drupal lässt einen sich fragen, warum der Lösungsstack für diese Anforderungen so fragmentiert ist, wie er es seit über einem Jahrzehnt ist. Allein für Drupal 8 und 9 findet man über 100 Module für den Suchbegriff "notify". Mindestens 40 davon sollten als ernstzunehmende Lösungen betrachtet werden, da sie über stabile Releases und Security-Advisory-Abdeckung verfügen. Aber jedes von ihnen adressiert immer nur einen einzigen Aspekt, d.h. nur Nodes oder nur Kommentare oder Workflow-States oder Exceptions oder was auch immer. Und dann bieten die meisten von ihnen nur E-Mail-Benachrichtigungen für jeden der Ereignistypen, für die sie gebaut wurden.

Unsere Lösung

Da dies für ein professionelles Web-Applikationsframework wie Drupal nicht angemessen ist, war es an der Zeit, sich hinzusetzen und diesen Bereich in einer generischen, skalierbaren, konfigurierbaren und wartbaren Art und Weise zu adressieren, so dass die Community darauf aufbauen kann und für aktuelle und zukünftige Anforderungen gerüstet ist - denn die Abonnement- und Benachrichtigungsanforderungen stehen unter ständigem Druck, sich anzupassen und zu verbessern, da sich auch die Welt um uns herum ständig verändert.

Das Team von bitegra solutions in Deutschland hat fast 2 Jahre in Problemanalyse, Lösungsdesign, Softwarearchitektur und Entwicklung investiert, um die ultimative Lösung für Drupal zur Verfügung zu stellen. Wir haben uns entschieden, alle verfügbaren Komponenten auf drupal.org zu veröffentlichen und die Community an den Vorteilen, aber auch an der zukünftigen Wartung und Entwicklung bestehender und zusätzlicher Features und Benachrichtigungskanäle kostenlos teilhaben zu lassen.

Wir packen unseren Koffer und nehmen mit ...

Dies ist Teil 1 einer Blog-Post-Serie, die die Idee und Umsetzung vorstellt und wie Sie diese selbst in Drupal-Projekten jeder Größe einsetzen können:

  • Teil 1 (Sie sind hier): Einführung und Systemarchitektur
  • Teil 2: Erste Schritte mit Abonnements und Benachrichtigungen
  • Teil 3: Wie man neue Benachrichtigungskanäle hinzufügt
  • Teil 4: Weitere Ereignisse für die Benachrichtigung abdecken
  • Teil 5: Anpassen der Benachrichtigungsausgabe

Systemarchitektur

Fangen wir mit einer Liste von Anforderungen an:

  • Inhalte, d.h. Entitäten:
    • Erstellen, aktualisieren, löschen und pushen/unpublizieren
      • Jeder Entitätstyp und jedes Bundle
      • Jedes Bundle mit individuellen und detaillierten Einstellungen
      • Konfiguration: Verfolgen aller Änderungen an der Konfiguration der Site
    • Logger: alle Log-Einträge oberhalb eines konfigurierten Schwellenwerts verfolgen
    • Externe Ereignisse: erlauben Sie anderen Diensten im Unternehmensnetzwerk, die gleiche Zielgruppe zu benachrichtigen
    • Erlauben Sie Entwicklern, neue Plugins zum Erstellen von Benachrichtigungen bereitzustellen
  • Seien Sie flexibel bei den Empfängern
    • Authentifizierte Benutzer sollten in der Lage sein, jedes verfügbare Ereignis, das auf der Site konfiguriert und zum Abonnieren verfügbar gemacht wurde, zu abonnieren/abzubestellen
    • Die Konfiguration der Site sollte eine Vorauswahl der Empfänger für jeden verfügbaren Ereignistyp ermöglichen
    • Inhaltsredakteure mit entsprechender Berechtigung sollten in der Lage sein, Benachrichtigungsvorgaben pro Entity-Aktion (Erstellen, Aktualisieren, Löschen, Veröffentlichen, Entöffentlichen) zu überschreiben
    • Entwicklern die Möglichkeit geben, benutzerdefinierte Regeln für die Empfängerauswahl anzuwenden
    • Mehrere Benachrichtigungskanäle unterstützen
    • Erlauben Sie Site-Buildern, eine beliebige Anzahl verschiedener Benachrichtigungskanäle auf einmal zu aktivieren
  • Erlauben Sie Benutzern, ihre eigenen Präferenzen für die Kanalpriorität zu definieren
    • Sicherstellen, dass jeder Benutzer nur einmal für jedes Ereignis benachrichtigt wird
    • Sicherstellen und Verfolgen der Zustellung von Benachrichtigungen
    • Gute Standardwerte für die Darstellung von Benachrichtigungen pro Kanal bereitstellen
    • Erlauben Sie Site-Buildern, die Benachrichtigungsausgabe zu modifizieren
    • Erlauben Sie Entwicklern, neue Kanäle hinzuzufügen

Beim Sammeln und Strukturieren der Anforderungen wurde deutlich, dass es 3 isolierte Phasen gibt, die separat behandelt werden müssen:

  1. Ereignis-Erfassung
  2. Auswahl des Empfängers und Erstellung der Benachrichtigung
  3. Zustellung der Benachrichtigung

Ja, Phase 2 beinhaltet zwei Schritte: Für jedes Ereignis müssen alle relevanten Empfänger ermittelt werden, und für jeden von ihnen wird eine Benachrichtigungsentität erstellt, um die Benachrichtigung für jeden Empfänger individuell weiter zu bearbeiten.

Bild
danse

Dies führte zu einer weiteren wichtigen Entscheidung im Lösungsdesign: Die Erfassung von Ereignissen und die Auswahl von Empfängern für Benachrichtigungen ist ein wichtiger Baustein, die Zustellung dieser Benachrichtigungen an die Benutzer über eine Reihe von Kanälen ein weiterer. Beide Bausteine können unabhängig voneinander arbeiten und daher haben wir dies in 2 separate Module aufgeteilt:

DANSE: Notification Framework

Das DANSE-Modul (DANSE: Drupal - Audit - Notification - Subscription - Event) adressiert die ersten beiden Phasen: Ereigniserfassung und Empfängerauswahl. Beide Phasen sind mit eigenen Plugin-Managern implementiert und können daher leicht um zusätzliche Anforderungen erweitert werden.

DANSE unterstützt von Haus aus Event Capturing für Content Entities, Konfiguration, Logging und Webhooks (externe Events). Jeder dieser Ereignistypen ist in separaten Submodulen implementiert, so dass Site-Bauherren nur die tatsächlich benötigten aktivieren können.

Der Empfängerauswahl-Plugin-Manager erlaubt die Implementierung einer eigenen Geschäftslogik, bringt aber bereits 2 Plugins mit sich: "Alle Admin-Benutzer" und "Alle aktiven Benutzer". Für das obige Plugin zur Erfassung von Content-Entity-Ereignissen können Site-Builder auch auf einer Pro-Bundle-Basis konfigurieren, welche Benutzerrollen unterstützte Ereignistypen abonnieren dürfen - verfügbare Abonnements können als eigenständiges Empfängerauswahl-Plugin erkannt werden.

DANSE kommt mit 3 Entitätstypen, um seine Aufgaben zu erfüllen:

  • Ereignisse (danse_event): jedes bemerkenswerte Ereignis wird mit seinem Erstellungszeitstempel und weiteren Details je nach Ereignistyp gespeichert
  • Benachrichtigung (danse_notification): für jeden Empfänger eines Ereignisses wird eine einzelne Benachrichtigung gespeichert
  • Aktion (danse_notification_action): um die Aktivität rund um diese Benachrichtigung zu verfolgen, einschließlich einer API zum Speichern von Zustellversuchen und des Empfangsflags

Als Ergebnis ermöglicht Ihnen dieses Modul, die Aktivität auf Ihrer Website zu überprüfen, indem Sie alle diese Entitäten für Ereignisse, Benachrichtigungen und Aktionen überprüfen, so dass Sie leicht feststellen können, was wann und warum passiert ist. Natürlich speichert es auch, wer wie und wann benachrichtigt wurde. Daher kommt auch der Name des Moduls, falls Sie sich das fragen: Audit.

Ein zusätzlicher Vorteil ist das Benachrichtigungs-Widget, das mit DANSE geliefert wird. Auch ohne die Benachrichtigungen an die Empfänger auszuliefern, ist es von großem Wert, den Benutzern mitzuteilen, was auf der Website neu ist und sich geändert hat. Mit den gespeicherten Benachrichtigungen können Sie das ganz einfach tun. DANSE kommt mit einer Ansicht für ungesehene Benachrichtigungen und Sie können diese Ansicht als Block auf der Seite für authentifizierte Benutzer platzieren.

In diesem Sinne kann DANSE alleine für jede bestehende Drupal 8 und Drupal 9 Seite verwendet werden.

Push Framework

Um auch Benachrichtigungen an ihre Empfänger zu versenden, bietet sich das Modul Push Framework an. Es hakt sich in die von DANSE zur Verfügung gestellte API ein, kann aber auch zusammen mit jeder anderen Informationsquelle, die zugestellt werden soll, verwendet werden. Um dies zu ermöglichen, verfügt das Push-Framework über einen Quellen-Plugin-Manager und DANSE ist nur das erste Modul, das ein entsprechendes Plugin implementiert hat. Aber natürlich können auch andere Quellen einfach bereitgestellt werden, wie z.B. ein Newsletter-Modul.

Das Push-Framework-Modul kümmert sich um die gesamte Logik des Sammelns der Quellinhalte, die zur Auslieferung anstehen, um die Bestimmung des geeigneten Kanals für die Auslieferung, die von den verfügbaren Kanälen und den Benutzerpräferenzen abhängt, und dann um die Auslieferung der Benachrichtigung und die Rückmeldung an die Quelle über den Auslieferungserfolg. Wenn die Zustellung fehlschlägt, kann jeder Kanal eine beliebige Anzahl von Wiederholungsversuchen unterstützen und mit einem anderen Kanal fortfahren, wenn alle Wiederholungsversuche fehlgeschlagen sind.

Die Ausgabekanäle werden über den Kanal-Plugin-Manager zur Verfügung gestellt, mit dem sich sehr einfach zusätzliche Kanäle entwickeln lassen. Derzeit unterstützte (oder geplante) Kanäle sind:

  • E-Mail
  • OneSignal
  • Alerta
  • Slack (geplant)
  • Mattermost (geplant)
  • Twilio (geplant)

Diagramm der Gesamtlösung

Beide oben genannten Module machen intensiven Gebrauch von Warteschlangen, d.h. die gesamte Schwerstarbeit wird asynchron ausgeführt. Das trägt dazu bei, dass sowohl die Erfassung von Ereignissen und die Auswahl von Empfängern als auch die Zustellung zuverlässig erfolgen - ohne Auswirkungen auf die Performance der Webseiten.

Bild
danse

Sowohl DANSE als auch das Push Framework wurden sorgfältig entwickelt, um eine grundsolide Lösung für alle Drupal-Sites jeder Größe zu bieten. Es kommt mit einem gemeinsamen Feature-Set für (a) Ereignistypen, die Benachrichtigungen erzeugen, und (b) Benachrichtigungskanäle. Aber wir sind uns bewusst, dass viele Sites ihre eigene Geschäftslogik für den größten Teil dieses Lösungsraums haben - sogar unser eigenes erstes Kundenprojekt, bei dem wir dies einsetzten, hatte eine solche spezifische Anforderung - die immer noch durch die Entwicklung von benutzerdefinierten Plugins oder öffentlichen Modulen erfüllt werden kann, wenn das zusätzliche Feature von allgemeinem Interesse wäre.

In den folgenden Teilen dieser Blog-Post-Serie erfahren Sie alles darüber, was für die Nutzung dieser Module erforderlich ist und wie Sie sie für Ihre eigenen Anforderungen erweitern können.

Update 11.08.2020: Aufgrund eines Problems mit dem alten Modulnamen haben wir den Namen geändert und diesen Blog-Beitrag entsprechend aktualisiert.