다음 ./launcher rebuild app 명령에 사용될 완전히 새로운 컨테이너 이미지를 출시했습니다. 항상 그렇듯, Discourse 공식 표준 설치 지침을 따랐다면 제공한 구성을 변경할 필요가 없습니다. 그럼에도 불구하고, 일부 설치 환경에 도움이 될 새로운 기능들이 추가되었습니다.
Redis 6
Discourse의 캐시, Sidekiq, MessageBus, 분산 잠금(Distributed Locks), 레이트 리밋(Rate Limits) 등 다양한 곳에서 Redis를 대규모로 사용하고 있습니다. 전반적으로 우리에게 매우 안정적이고 견고한 선택이었습니다.
그러나 특정 워크로드에서는 Redis가 병목 현상의 원인이 될 수 있었습니다. Redis의 단일 스레드 특성상, 그리고 LUA 스크립트 때문에 여러 인스턴스를 사용할 수 없었던 점까지 겹쳐서, 이 병목 현상을 우회하기가 매우 어려웠습니다.
다행히도 Redis 6에서는 I/O 작업을 위한 스레드 풀 지원이 추가되었고, 테스트 결과 Redis로 인해 병목 현상이 발생하던 Discourse 클러스터에서 매우 잘 작동하는 것으로 확인되었습니다.
따라서 많은 CPU 코어를 가진 머신을 사용하고 있으며, 메트릭스에서 Redis가 부하를 처리하는 데 어려움을 겪는 것으로 나타나고 있다면, 이제 app.yml의 params 섹션을 통해 쓰기 작업에 스레드를 사용하는 옵션을 활성화할 수 있습니다:
params:
redis_io_threads: "4" # 1이면 비활성화, n>1이면 IO 쓰기에 n-1개의 추가 스레드 사용
더 작은 이미지
프로젝트 초기 단계에서 비기술적인 사용자들이 Discourse를 쉽게 실행할 수 있도록 하고, 필요한 모든 의존성, 버전 관리, 업그레이드 등을 처리하기 위해 크기가 큰 컨테이너 이미지를 출시하는 것을 선택했습니다.
그럼에도 불구하고, 최근 압축된 이미지 크기가 1GB를 넘어섰고, 이는 다소 과도한 수준이었습니다.
따라서 이미지의 끊임없이 증가하는 크기를 완화하기 위해, 이미지 내부의 Discourse 소스 코드를 소스 코드의 완전한 복사본에서 최신 버전의 코드만 포함하는 "얕은 클론(shallow clone)"으로 변경했습니다.
이 변경으로 인해 압축된 이미지 크기가 25% 작아졌으며, 이는 필요한 서버 공간을 줄이고 새로운 이미지가 출시될 때 재빌드 속도를 높이는 데 기여합니다. 또한 시간이 지남에 따른 이미지 크기 증가를 제어하는 데에도 도움이 될 것입니다.
tests-passed/beta/stable 환경에서 재빌드와 웹 업데이트를 모두 테스트하여 표준 경로가 깨지지 않는 것을 확인했습니다. 하지만 app.yml의 훅에서 더 이례적인 git 작업을 수행하는 사용자들은 사용자 지정 설정을 조정해야 할 수 있습니다.