在过去的几年里,我们在聊天通知的可靠性方面投入了大量时间,Alex。
你什么时候放弃聊天了?@jordan-violet,你还在遇到 OP 中的问题吗?
在过去的几年里,我们在聊天通知的可靠性方面投入了大量时间,Alex。
你什么时候放弃聊天了?@jordan-violet,你还在遇到 OP 中的问题吗?
感谢你的努力,Sam。对我个人而言,通知大部分时间都有效,但会随机失效,需要刷新 Discourse 页面才能使其恢复正常——但过去它们根本无效,或者时断时续,而且肯定有在 discourse 升级时被完全关闭的习惯。
我们本周停止使用聊天功能了,尽管我们从 2023 年初就开始使用了。Google Chat 中的通知对整个团队都有效,包括那些我们经常遇到问题或从未成功使其工作的人。
您好 @lindsey,我们遇到了同样的问题。您这边关于状态和潜在修复有什么更新吗?
嗨,Micha,
您能尝试提供一份更详细的报告,说明您未收到通知的具体情况吗?有很多情况(iOS、Android、PWA、Discourse Hub、桌面 Safari、Chrome、Firefox,哪种类型的通知:公共频道?私信?帖子?全部?收到通知时您是否正在浏览?……)
我开始研究这段代码,但我觉得一个大问题在于“期望”方面
我将一大类问题视为已知问题,我们可以进行改进。
push notification time window(推送通知时间窗口)。这导致:@提及,我恰好在 60 秒内访问了应用程序。没有 @提及。老实说,@lindsey / @j.jaffeux / @pmusaraj,我觉得“大声疾呼”可能会消除人们遇到的绝大多数问题以及多年来我们看到的关于聊天通知的抱怨。
update_message.rb 中有一些奇怪的东西在事务内发布消息。(在多线程环境中,这可能会丢失)基本上,默认情况下,消除许多“哎呀,我们不应该通知您的逻辑”。
在 Discourse 升级时完全关闭,对于自托管用户来说,肯定可能是由于与推送网关的连接问题。也许某些服务器上的升级需要几天时间,也许在某些情况下有 24 小时的内网。
相关代码(通过 Gemini 3 pro)
在 24 小时内 3 次失败后终止订阅的逻辑位于 handle_generic_error 方法中。
检查用户是否在线(“去抖动”)并跳过推送通知的逻辑集中在此处。这依赖于 SiteSetting.push_notification_time_window_mins。
UpdateMessage 服务将 publish 步骤包装在数据库事务中。这可能会导致竞态条件,即通知作业在事务提交之前尝试读取消息。
代码在处理公共频道的提及内容时明确过滤 following: true,从而阻止未关注该频道用户的通知。
此处定义了按频道去重通知(折叠它们)的标签生成逻辑:
这实际上是我们过去几年中已经做过很多的事情,我移除了很多“智能”代码,这些代码总是难以理解且容易引起质疑。但是的,仍然存在各种代码路径。
强制性的臭名昭著的 Slack 通知流程图:

这就是我上面要求提供更多细节的原因,情况太多了……
我非常希望看到“大声模式”成为一个系统范围的预设。
“抱歉,我现在才看到这条消息——推送通知又没起作用。我想要回我的 Slack/Whatsapp/Signal/XYZ”
这是我们在企业社交内网采用 Discourse 所面临的最大问题。