我在我的 Discourse 实例(2026.10.0-latest)上观察到 Pitchfork worker 反复出现超时问题。
在分析生产日志后,13 条超时警告中有 12 条与 ActivityPub inbox 请求相关,特别是在进行 HTTP 签名验证时的远程 actor 解析过程中。
相关的回溯信息如下:
Pitchfork worker is about to timeout,
dumping backtrace for main thread
excon/socket.rb:368:in 'IO.select'
excon/socket.rb:79:in 'Excon::Socket#readline'
excon.rb:255:in 'Excon.get'
discourse_activity_pub/request.rb:70:in 'Request#perform'
discourse_activity_pub/request.rb:34:in 'Request#get_json_ld'
discourse_activity_pub/json_ld.rb:71:in 'JsonLd.request_object'
discourse_activity_pub/a_p/object.rb:251:in 'AP::Object.resolve'
signature_verification.rb:254:in 'actor_from_key_id'
signature_verification.rb:61:in 'signed_request_actor'
inboxes_controller.rb:31:in 'process_json'
inboxes_controller.rb:10:in 'create'
看起来远程 actor 解析是在 inbox 处理期间同步执行的,当远程服务器响应缓慢时,这可能会阻塞 Pitchfork worker。
此外,我启用了 activity_pub_verbose_logging 大约 24 小时,并注意到多次尝试解析已删除的 Mastodon actor,这些请求返回了 HTTP 410 Gone,导致大量处理 Delete activity 失败的警告。
示例:
[Discourse Activity Pub] GET request to
https://mastodon.social/ap/users/115676297044305006
failed: {"error":"Gone"}
[Discourse Activity Pub] Failed to resolve actor
[Discourse Activity Pub] Failed to process Delete activity:
Unable to create actor
我尚未确认这些失败的 Delete activity 是否与 worker 超时直接相关。
在 inbox 签名验证期间同步进行远程 actor 解析是否是预期行为?能否改进超时处理或缓存机制,以防止阻塞 web worker?
如有需要,我很乐意提供额外的脱敏日志。