ActivityPub 수신함 요청으로 인한 Pitchfork 워커 타임아웃

Discourse 인스턴스(2026.10.0-latest)에서 반복적인 Pitchfork 워커 타임아웃이 발생하고 있습니다.

프로덕션 로그를 분석한 결과, 타임아웃 경고 13건 중 12건이 ActivityPub 인박스 요청과 관련되어 있었으며, 특히 HTTP 서명 검증 시 원격 액터(actor) 해석(remote actor resolution) 과정에서 발생하는 문제였습니다.

관련된 백트레이스:

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'

원격 액터 해석이 인박스 처리 중에 동기적으로 실행되는 것으로 보이며, 원격 서버의 응답이 느릴 경우 Pitchfork 워커가 차단(blocking)될 수 있는 잠재적 문제가 있습니다.

또한 약 24시간 동안 activity_pub_verbose_logging을 활성화했는데, 삭제된 Mastodon 액터를 해석하려는 시도가 반복적으로 이루어지고 HTTP 410 Gone 응답을 반환하여, Delete 활동 처리 실패 경고가 다수 발생하는 것을 확인했습니다.

예시:

[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 활동 처리 실패가 워커 타임아웃과 직접적인 관련이 있는지 여부는 아직 확인하지 못했습니다.

인박스 서명 검증过程中的 원격 액터 해석이 동기식으로 수행되는 것이 의도된 동작인가요? 웹 워커 차단을 방지하기 위해 타임아웃 처리나 캐싱 방식을 개선할 수 있을까요?

필요하다면 추가적인 익명화(sanitized)된 로그를 제공할 수 있습니다.