Fehler bei Chat-Benachrichtigungen, die nicht angezeigt werden

Ich habe angefangen, mir diesen Code anzusehen, aber ich denke, ein großes Problem liegt bei den „Erwartungen“.

  • Geht es um Push-Benachrichtigungen? (Wenn ja, verwenden Sie PWA oder die Discourse Hub App?)
  • Wenn Leute sagen, sie „werden nicht benachrichtigt“, meinen sie dann „werden nicht über Erwähnungen in einer Push-Benachrichtigung benachrichtigt“?
  • Ist die Erwartung, über eine @Erwähnung per Push-Benachrichtigung benachrichtigt zu werden, wenn man bereits online ist?

Es gibt eine große Familie von Problemen, die ich als bekannte Probleme betrachten würde, die wir verbessern können.

  1. In der PWA, wenn wir 3 Mal innerhalb von 24 Stunden versuchen zu pushen und scheitern (aufgrund der Verbindung zum Nachrichtendistributor oder aus anderen Gründen), beenden wir Abonnements und benachrichtigen den Benutzer über nichts.
  2. In Hub sind Push-Benachrichtigungen nur für Discourse-gehostete Kunden verfügbar.
  3. Es gibt einige Sequenzierungsprobleme, bei denen eine Benachrichtigung bei der Bearbeitung einer Chat-Nachricht verloren gehen kann, da wir eine Push-Benachrichtigung innerhalb einer Transaktion auslösen.
  4. Wir haben einen „Debounce“ von 1 Minute, der konfigurierbar, aber verwirrend ist. Ich wurde gerade erwähnt, habe aber keine PN erhalten. push notification time window. Dies führte dazu: @Erwähnung, ich besuche die App innerhalb von 60 Sekunden. Keine @Erwähnung.
  5. Wenn Sie einen Benutzer in einem Kanal erwähnen, dem er nicht folgt, erhält er die Erwähnung nicht. (By Design)

Ehrlich gesagt, @lindsey / @j.jaffeux / @pmusaraj, ich habe das Gefühl, dass „laut werden“ wahrscheinlich die überwiegende Mehrheit der Probleme und Beschwerden beseitigen würde, die wir im Laufe der Jahre bezüglich Chat-Benachrichtigungen gesehen haben.

  • Push-Benachrichtigungen für @Erwähnungen immer sofort senden (Site-Standard), Sites, die eine Verzögerung wünschen, können dies konfigurieren.
  • Push-Benachrichtigungen für @Erwähnungen immer von ALLEN Kanälen senden, nur Kanäle ausschließen, die Benutzer explizit stummgeschaltet haben (oder für die sie keine Berechtigung haben), dies entspricht dem Verhalten im Forum.
  • Es gibt etwas Seltsames in update_message.rb, das eine Nachricht innerhalb einer Transaktion veröffentlicht. (In Multi-Thread-Umgebungen kann dies verloren gehen)
  • Wenn wir ein Abonnement in einer PWA beendet haben, zeigen Sie ein Banner in der PWA an, das besagt: Push-Benachrichtigungen sind nicht konfiguriert, möchten Sie sie konfigurieren? Vielleicht erst nach 1 Woche / 2 Wochen beenden, anstatt nach 1 Tag.
  • Push-Tags werden pro Kanal dedupliziert, hostname-chat-mention-general … dies ist für Erwähnungen nicht ideal, da wir pro Kanal zusammenfassen, was verwirrend sein kann, wenn 4 verschiedene Personen Sie zu verschiedenen Zeiten im Kanal erwähnt haben.
  • Push-Benachrichtigungen immer senden, auch wenn der Benutzer online ist (Standard) – Benutzern erlauben, dieses Verhalten bei Bedarf zu überschreiben.
  • Ein Sahnehäubchen auf all dem wäre die Unterstützung erstklassiger Push-Benachrichtigungen auf allen Websites für Benutzer, die eine Discourse ID konfiguriert haben (über Discourse ID) – Dies würde Hub ein konsistentes Gefühl über alles hinweg verleihen.

Im Grunde genommen die ganze „Ups, wir hätten Sie nicht benachrichtigen sollen“-Logik standardmäßig entfernen.


Bei einem Discourse-Upgrade komplett deaktiviert, für Self-Hosters kann dies definitiv auf Verbindungsprobleme mit dem Push-Gateway zurückzuführen sein. Vielleicht dauern Upgrades auf einigen Servern Tage, vielleicht ist es aus irgendeinem Grund 24 Stunden lang ein Intranet.


Relevanter Code (via Gemini 3 pro)

PWA-Abonnements werden beendet

Die Logik, die Abonnements nach 3 Fehlern innerhalb von 24 Stunden beendet, befindet sich in der Methode handle_generic_error.

Push-Benachrichtigungs-Debounce / Online-Prüfung

Die Logik, die prüft, ob ein Benutzer online ist („Debounce“) und die Push-Benachrichtigung überspringt, befindet sich zentral hier. Dies hängt von SiteSetting.push_notification_time_window_mins ab.

Chat: Transaktionssequenzierungsprobleme

Der Dienst UpdateMessage fasst den publish-Schritt in einer Datenbanktransaktion zusammen. Dies kann zu Race Conditions führen, bei denen der Benachrichtigungsjob versucht, die Nachricht zu lesen, bevor die Transaktion committet wird.

Chat: Erwähnungen in nicht gefolgten Kanälen

Der Code filtert explizit nach following: true, wenn Erwähnungen für öffentliche Kanäle verarbeitet werden, wodurch verhindert wird, dass Benutzer, die dem Kanal nicht folgen, Benachrichtigungen erhalten.

Chat: Push-Benachrichtigungs-Tags

Die Tag-Generierungslogik, die Benachrichtigungen pro Kanal dedupliziert (zusammenfasst), ist hier definiert:

4 „Gefällt mir“