配置指南:开启入站与出站在线状态)
后端即时通讯【免费下载链接】dendriteDendrite is a second-generation Matrix homeserver written in Go!项目地址https://gitcode.com/gh_mirrors/de/dendrite点击查看免费下载Dendrite基于 Go 编写的第二代 Matrix 家庭服务器内置了对 Presence在线状态的支持本地用户可以将自己的在线/离线状态推送给其他用户也可以自动接收远端用户的状态更新并在支持该功能的客户端中展示。本文以 docs/administration/3_presence.md 为骨架结合 dendrite-sample.yaml 与syncapi、federationapi、clientapi等模块的源码实现完整讲解 Presence 的入站/出站两个方向、配置方法、性能影响、底层消息流转链路与验证方式帮助管理员在部署 Dendrite 时做出正确的取舍并完成实战配置。Presence 是什么为什么默认关闭Presence 是 Matrix 协议中描述用户当前在线状态的能力。在 Dendrite 中它允许本地用户把online在线、offline离线、unavailable不可用等状态发送给其他用户本地用户自动接收远端服务器用户的在线状态支持 Presence 的客户端如 Element Web在界面上展示这些状态。从源码看Dendrite 在 syncapi/types/presence.go 中定义了四种枚举值type Presence uint8 const ( PresenceUnknown Presence iota // unknown PresenceUnavailable // unavailable PresenceOnline // online PresenceOffline // offline )并通过PresenceFromString将客户端传入的字符串映射为枚举同时附带CurrentlyActive()最近 5 分钟内有活动即视为当前活跃与LastActiveAgo()返回距上次活动的时间毫秒数两个辅助方法。尽管功能很实用官方文档明确提示开启 Presence 会负面影响服务器性能——它会消耗更多 CPU 时间并且会显著增加服务器在联邦federation上的闲聊度chattiness即频繁的 EDU 交互。因此Dendrite 默认将其关闭。入站与出站两个独立的开关Dendrite 将 Presence 拆分为两个互相独立的方向管理员可以只开启其中一个方向配置项作用入站inboundenable_inbound处理远端用户发来的 Presence 更新并分发给本地用户出站outboundenable_outbound生成本地用户的 Presence 通知并通过联邦分发给远端服务器这种双向分离设计非常实用。例如只想接收其他服务器的在线状态、又不想暴露本服务器用户的状态 → 只开启enable_inbound只想广播本服务器用户的状态、不关心接收远端状态 → 只开启enable_outbound两者都不开启默认值→ Presence 功能完全关闭Dendrite 既不处理远端状态也不对外发布本地状态。配置方法Presence 由配置文件global段下的presence块控制。以 dendrite-sample.yaml 为基准完整配置如下global: # ...其他全局配置... presence: enable_inbound: false enable_outbound: false其中presence块在代码中对应 setup/config/config_global.go 中的PresenceOptions结构体// PresenceOptions defines possible configurations for presence events. type PresenceOptions struct { // Whether inbound presence events are allowed EnableInbound bool yaml:enable_inbound // Whether outbound presence events are allowed EnableOutbound bool yaml:enable_outbound }该结构体被挂在全局配置的Presence字段见 setup/config/config_global.goYAML 标签与文档中的配置键一一对应。需要开启某个方向时将对应布尔值改为true即可例如global: presence: enable_inbound: true enable_outbound: true提示官方文档给出的默认示例为两者均false即默认不启用。若你的部署希望完整启用 Presence入站出站请按上面示例同时开启两个开关。辅助手段用 generate-config 生成配置文件如果你需要快速生成一份可编辑的完整配置可以使用dendrite项目自带的配置生成命令。仓库中 cmd/generate-config/main.go 实现了该工具它会生成包含presence块在内的完整示例配置。实际生成的配置中 Presence 默认处于关闭状态你可以随后按需修改。出站方向的底层实现本地状态如何发往远端开启enable_outbound后Dendrite 的 Presence 出站链路大致如下客户端上报本地用户通过客户端 API 调用PUT /_matrix/client/v3/presence/{userId}/status由 clientapi/routing/presence.go 中的SetPresence处理。源码首先校验cfg.Matrix.Presence.EnableOutbound——如果出站未开启该接口直接返回 200 空响应静默忽略请求开启后则校验请求者身份解析 presence 字符串并调用 producer 发布消息。JetStream 消息发布SetPresence调用producer.SendPresence见 federationapi/producers/syncapi.go将userID、presence、status_msg、last_active_ts写入 NATS JetStream 的 Presence 主题jetstream.OutputPresenceEvent。syncapi 消费与持久化syncapi 侧的PresenceConsumer见 syncapi/consumers/presence.go订阅该主题调用UpdatePresence将状态写入数据库并通过stream.Advance与notifier.OnNewPresence推送给正在同步的本地客户端。值得注意的是其Start()方法中的逻辑见 syncapi/consumers/presence.go会检查配置若入站和出站均未开启则只保留请求-响应订阅不启动完整消费循环——这正是关闭 Presence 可显著降低 CPU 与消息负载的代码级体现。federationapi 转发给远端federationapi 侧的OutputPresenceConsumer见 federationapi/consumers/presence.go在Start()中首先判断outboundPresenceEnabled即cfg.Matrix.Presence.EnableOutbound若未开启直接return nil不消费任何 Presence 消息。开启后onMessage会校验用户 ID 属于本服务器isLocalServerName通过 roomserver 查询该用户所有已加入的房间QueryRoomsForUser通过 federation 存储查询所有与这些房间共享的远端主机GetJoinedHostsForRooms组装m.presence类型的 EDU通过queues.SendEDU发送给这些远端服务器。也就是说本用户的在线状态只会广播给与你在同一房间内的远端服务器不会无差别地发给整个联邦这也是控制闲聊度的一种机制。新加入房间时的补发当本地用户新加入一个房间时federationapi/consumers/roomserver.go 会检测到新增的 joined hosts且EnableOutbound开启、事件为m.room.member且 membership 为join主动调用sendPresence把本房间内已知的本地用户状态补发给新加入的服务器确保对方在加入瞬间即可获取本服务器用户的在线状态。入站方向的底层实现远端状态如何到达本地用户开启enable_inbound后Dendrite 会处理从联邦收到的 Presence EDU联邦接收远端服务器通过PUT /_matrix/federation/v1/send/{txnId}推送事务transaction其中包含m.presence类型的 EDU。federationapi 的路由处理在 federationapi/routing/send.go 中创建事务处理对象时会传入cfg.Matrix.Presence.EnableInbound作为参数用于控制是否处理其中的 Presence 内容。写入 JetStream处理后的 Presence 内容被发布到 JetStream 的 Presence 主题等待 syncapi 消费。syncapi 消费与本地分发syncapi 的PresenceConsumer.onMessage见 syncapi/consumers/presence.go读取消息头中的userID、presence、last_active_ts、status_msg调用EmitPresence更新数据库并通知本地订阅者。这里有个细节from_sync标记为 true 的消息即本地用户通过 sync 触发产生的更新会被直接跳过避免重复处理。同步给本地客户端本地客户端通过/sync拉取状态时syncapi 的PresenceStreamProvider见 syncapi/streams/stream_presence.go会执行IncrementalSync查询增量区间内的 Presence 记录只把与请求用户共享房间IsSharedUser的远端用户状态写入 sync 响应同时带有sync.Map缓存对于已发送过且无变化的在线状态会跳过减少不必要的重复推送对状态发生变化的用户含新加入房间的成员则即时补充。性能影响分析为什么官方建议谨慎开启综合源码可以总结出 Presence 对性能的具体影响路径CPU 开销每一条 Presence 更新都要经过 clientapi 发布 → JetStream 持久化 → syncapi 消费 → 数据库写入 → 通知推送的完整链路syncapi 还要在每次增量同步中查询并过滤共享房间用户的 Presence联邦流量chattiness开启出站后用户的每次状态变化都会以 EDU 形式发送给共享房间的所有远端服务器开启入站后本地服务器要接收并处理来自所有远端服务器的 Presence EDU。EDU 在 federationapi/storage/shared/storage_edus.go 中按类型设定了过期时间m.presence的过期时间为 10 分钟用于限制堆积量静默关闭机制如前述两个方向都关闭时syncapi 的 Presence 消费循环与 federationapi 的 Presence 转发消费者都不会启动Dendrite 相当于完全绕开了这条链路这就是默认关闭能省钱的原因。因此官方文档的结论是如果服务器资源有限或联邦规模较大建议保持默认关闭只有当你确实需要在线状态展示时再按需开启对应的方向。验证配置是否生效开启 Presence 后可以通过以下方式验证检查配置加载确认global.presence块位于配置文件的global段下、缩进正确且布尔值为true使用客户端上报状态在支持 Presence 的客户端如 Element中修改在线状态观察同房间其他用户含远端用户是否能看到更新查看日志syncapi 的PresenceConsumer在收到 Presence 消息时输出 Trace 级日志syncAPI received presence event: ...见 syncapi/consumers/presence.gofederationapi 在出站转发时输出sending presence EDU to %d servers见 federationapi/consumers/presence.go可将日志级别调至trace观察链路是否运转直接调用 API本地用户可通过PUT /_matrix/client/v3/presence/{userId}/status上报状态、通过GET /_matrix/client/v3/presence/{userId}/status查询某用户状态查询实现见 clientapi/routing/presence.go其通过 NATS 请求-响应机制向 syncapi 查询持久化的 Presence 记录。小结Dendrite 的 Presence 功能通过global.presence下的enable_inbound与enable_outbound两个独立开关控制默认全部关闭以规避性能损耗与联邦流量开销。管理员可以按需单向开启只接收远端状态enable_inbound: true、只广播本地状态enable_outbound: true或全开。其底层由 clientapi 接收上报、JetStream 传输、syncapi 持久化与同步分发、federationapi 通过m.presenceEDU 跨服务器转发构成且出站广播范围严格限定在共享房间的远端服务器内。结合本文的配置示例与源码链路你可以为你的 Dendrite 部署精准地配置 Presence并在必要时通过日志与 API 验证其运行状态。赞分享后端即时通讯【免费下载链接】dendriteDendrite is a second-generation Matrix homeserver written in Go!项目地址https://gitcode.com/gh_mirrors/de/dendrite点击查看免费下载相关推荐Woodpecker 状态徽章接入指南在仓库 README 与网站中嵌入流水线状态 SVGWoodpecker 状态徽章接入指南在仓库 README 与网站中嵌入流水线状态 SVG Woodpecker CI 内置了仓库状态徽章Status BaCI/CDDevOpsRocket.Chat在线状态用户在线状态管理与显示Rocket.Chat在线状态用户在线状态管理与显示 在团队协作和实时通讯中准确了解用户的在线状态Presence是提升沟通效率的关键。Rocket.C即时通讯后端前端BasicTS构建公平可扩展的时间序列预测基准与工具包BasicTS构建公平可扩展的时间序列预测基准与工具包 在当今数据驱动的时代时间序列预测已成为金融、交通、能源等众多领域的关键技术。BasicTS作为一个公人工智能机器学习深度学习数据分析上一篇如何10分钟跑通实时聊天应用MessengerFirebase与Mapbox环境配置分步教程下一篇React Chart.js完全指南如何在React应用中快速集成6种图表组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考