매우 긴 게시글(약 10만 자)을 편집하고 저장할 때 백엔드 타임아웃 문제가 발생했습니다. 저장 작업 중 서버가 응답하지 않아 502/504 에러가 발생합니다. 프론트엔드 콘솔에는 다음과 같은 에러 스택이 표시됩니다:
ajax-error.js:36:15
l ajax-error.js:36
u ajax-error.js:75
d ajax-error.js:84
Ember 41
update rest.js:72
update rest.js:72
save rest.js:115
editPost composer.js:1147
Ember 6
몇 가지 비교 테스트를 수행해 보니 병목 현상은 이전 버전과 새 버전 간의 diff 계산에 있는 것으로 보입니다.
긴 게시글 A를 긴 게시글 B로 직접 편집하여 저장하면 일관되게 502/504 타임아웃이 발생합니다.
먼저 긴 게시글을 지우고 짧은 플레이스홀더(예: 5자)를 저장한 뒤, 새로운 전체 내용 B를 붙여넣고 저장하면 빠르게 완료됩니다.
현재 Diff 엔진은 매우 긴 텍스트와 높은 변경 비율이 결합된 극단적인 경우에서 어려움을 겪는 것 같습니다. 성능 폴백 메커니즘을 추가할 수 있을까요? 예를 들어, 텍스트가 매우 길고 수정 비율이 높은 경우, 상세한 라인별 diff를 수행하는 대신 시스템이 이를 “완전 재작성”으로 처리하도록 할 수 있습니다.
팀에서 큰 게시글의 Diff 처리를 최적화하거나, 이러한 시나리오에 대한 그레시울 디그레이드(점진적 성능 저하) 또는 보호 장치를 도입할 계획이 있습니까? 다른 아이디어로는 저장을 먼저 성공시키고, 이후 diff를 비동기적으로 계산하는 방식이 있습니다.
한편, 서버 측 Unicorn 로그는 타임아웃이 발생한 정확한 시점을 기록하여, 워커가 마크다운 diff를 처리하는 동안 종료되었음을 확인했습니다:
Unicorn worker received USR2 signal indicating it is about to timeout, dumping backtrace for main thread
config/unicorn.conf.rb:204:in `backtrace'
config/unicorn.conf.rb:204:in `block (2 levels) in reload'
/var/www/discourse/lib/discourse_diff.rb:172:in `[]'
/var/www/discourse/lib/discourse_diff.rb:172:in `tokenize_markdown'
/var/www/discourse/lib/discourse_diff.rb:115:in `side_by_side_markdown'
/var/www/discourse/app/serializers/post_revision_serializer.rb:128:in `body_changes'
...