baekjoon   2년 전

안녕하세요. 오랜만에 글 남깁니다.

지난 몇 주간 조금씩 조금씩 업데이트 했고, 내용 모아서 함께 적습니다.

1. 방화벽 업데이트

BOJ의 방화벽 관련 업데이트를 했습니다. 이 업데이트는 2022-02-23, 2022-03-02 두 번 진행했습니다.

2022-02-23 업데이트에서 solved.ac의 접근을 실수로 봇으로 판단해 업데이트가 되지 않는 문제가 있었습니다. 업데이트하고 1시간 만에 다시 해결했고, 이때 정보도 모두 정상적으로 들어간 것 확인했습니다.

두 업데이트 모두 비정상적이라 판단되는 접근을 막는데 중점을 두었습니다. 업데이트 전에 봇으로 추정되는 트래픽이 전체 트래픽의 약 60-70% 정도를 차지했었습니다.

이 업데이트로 인해 BOJ 유저가 만든 일부 익스텐션과 스크립트가 동작하지 않을 수도 있습니다.

2. 영어 업데이트

사이트에 영어를 추가하는 작업은 꽤 오래 전부터 하고 싶었습니다. 사이트가 프레임워크를 사용하지 않고 사실상 만들어서 사용하는 형태이고, 애초에 만들때 i18n을 생각하지 않고 만들어서 이를 지원하기가 매우 어려웠습니다. 다행히 2년 정도 전에 해결했고, 대회 관련 기능만 영어로 지원하고 있었습니다. 이때는 대회 전용 계정에서 대회 운영진이 원하는 경우만 영어로 메뉴를 바꾸고 있었습니다. 현재는 사이트 하단에서 추가할 수 있습니다.

i18n은 gettext를 사용하고 있는데, 이와 관련된 파일을 자동으로 만들어서 i18n을 지원하기 편한 스크립트를 만들어봤습니다. 테스트로 학교/회사 랭킹의 대학교, 고등학교, 회사 이름 일부를 영어로 보여지게 만들었습니다. 대학교는 거의 다 영어로 보여주지만, 회사와 고등학교는 일부만 테스트로 해보았습니다. 사이트 언어를 영어로 바꾸고 학교/회사 랭킹에 들어가면 이를 확인할 수 있습니다.

3. 채점 서버 업데이트

새벽 시간에 채점을 하지 않고 대기하는 채점 서버가 많습니다. 채점 작업을 일정 횟수 이상 하지 않은 채점 서버는 잠시 재채점을 수행하고 있게 업데이트 했습니다. 모든 채점 서버가 재채점을 하고 있으면, 채점 현황이 밀리거나 채점 서버가 죽은듯한 인상을 줄 수 있어, 약 30% 정도만 재채점을 잠시 수행하고 있게 업데이트 했습니다. 지난 며칠간 테스트를 해보았는데, 제출이 많은 오후와 밤시간에는 잠시 재채점을 할 기회도 없을 정도로 제출이 많았으며, 새벽 시간에는 재채점을 빠르게 마무리하는 것을 확인했습니다.

4. BOJ Stack 데이터 업로드와 삭제

2월은 개발 중인 것을 잠시 접어두고 트래픽을 줄여보는데 집중했습니다. 트래픽 요금을 절약하면 재채점 서버를 더 켜서 재채점을 조금 더 빠르게 할 수 있습니다. 위의 1번 업데이트도 이와 관련된 업데이트입니다.

BOJ Stack에서 문제를 만들 때 데이터를 업로드할 수 있는데, 데이터를 처리하는 스크립트가 자주 실패해서 트래픽 요금이 조금 많이 나왔었습니다.

예전에 데이터 처리는 AWS Lambda를 이용하는데, 데이터 처리 단계에서 하는 일을 간단하게 중요한 것만 적어보며 업로드한 데이터를 다운받고, \r\n을 모두 \n으로 바꾸고, 모든 줄의 뒤에 \n을 추가한 다음 채점하기 위한 곳으로 데이터를 올리는 작업을 합니다.

여기서 데이터를 다운 받아야 하는데, 이때 Lambda의 용량 제한 512MB에 걸리는 경우가 있습니다. https://docs.aws.amazon.com/la...

오래 전에 찾아본 것이라 부정확한 정보일 수도 있지만, 예전에 이를 만들 때 찾아보니 Lambda의 실행 1번 당 용량 제한이 아니었습니다. Lambda의 실행 1번 당 인스턴스가 켜지는 것이 아니고, 인스턴스를 재활용해서 실행을 여러 번 한다고 합니다. 여기서 용량 제한은 인스턴스가 사용하는 동안 용량 제한이었습니다.

데이터 용량이 1000번 처럼 작으면 문제가 없지만, 용량이 크면 데이터를 다운받다가 Lambda의 실행이 종료되는 경우가 꽤 많이 있었습니다.

당시에 이를 해결하기 위해 Lambda를 약 50개 만들었고, 최대한 균등하게 데이터 처리 요청을 분배해서 이 제한을 회피해보았었습니다.

이 방법은 꽤 괜찮았지만, 점점 BOJ Stack을 이용해서 올리는 데이터가 많아지고, 대회도 많아지면서 용량 제한에 걸리는 경우가 많아졌었습니다.

이런 이유 때문에 BOJ Stack을 통해서 데이터를 업로드하면 "처리 대기"에 한 동안 멈춰있다가 갑자기 처리를 시작하는 현상이 있었습니다.

Lambda를 사용한 이유는 데이터 업로드는 자주 일어나지 않으니 필요할 때만 사용하는게 좋다는 생각이었는데, 지금보니 좋지 않은 생각이었습니다.

생각해보니 BOJ는 Lambda처럼 매번 켜있고, 계속해서 큐에서 작업을 빼오는 서버가 있었습니다. 바로 채점 서버입니다. 결국 올린 데이터는 채점 서버를 이용해야하고, 채점 서버의 비용은 비싸지 않으니 이를 사용하는 것이 훨씬 이득이라는 사실을 알았습니다.

이제 데이터 처리는 2번 큐와 채점 서버를 이용합니다.

기존 데이터 전체 삭제는 하나씩 지웠으나, 이제는 한 번에 지워서 빠르게 지울 수 있습니다.

5. Queue 상태

Queue에 현재 몇 개의 제출이 있는지는 도움말의 채점 서버와 큐 상태에서 보여주고 있지만 https://help.acmicpc.net/statu...

현재 내 제출이 몇 번째인지는 보여주지 않고 있습니다. BOJ는 채점 현황이 있지만, BOJ Stack은 그런 것이 없어서 그냥 기다려야하는 단점이 있습니다. 이를 해결하기 위한 방법을 생각해보고 있습니다.

6. 다가오는 업데이트

업데이트는 게시판, 그룹 순으로 진행될 예정입니다. 게시판은 작년부터 계속 준비하고 있었는데, 아직도 뭔가 마음에 들지 않아서 계속 수정하고 수정하고 수정하고 있습니다. 생각해보니 너무 많은 것을 한 번에 하려고 해서 자꾸 잘 안되는 것 같았습니다. 게시판을 하면서 알림도 함께 업데이트 해야 하고, 

게시판의 경우 기존 계획은 오타/오역/요청과 나머지 게시판을 분리하려고 했었습니다. 오타/오역/요청은 "요청 게시판" 으로 먼저 분리하고, 이 코드를 활용해서 게시판을 업데이트 하는 것이 기존 계획이었습니다.

요청 게시판은 데이터 추가, 수정, 문제 수정 등 여러가지 요청이 들어가야 하는데, 너무 많은 내용을 한 번에 구현하려고 하니 자꾸 뭐가 잘 안되었습니다. 일단 가장 쉬운 "데이터 추가"만 먼저 해보고 나머지를 하나씩 추가해보려고 합니다. 이 요청 게시판이 밀리고 있는 게시판 일처리를 효과적으로 해결하길 기대합니다.

요청 게시판은 BOJ Stack이 조금 더 어울리는 위치라 생각해 여기에 넣으려고 합니다.

7. Open Contest가 종료된 후 문제 공개

대회 제출은 solved.ac에 정보를 보내지 않으니 대회 제출은 스트릭이나 문제 해결에 반영이 되지 않았었습니다. 2021년 11월에 solved.ac의 대회 문제가 공개될 때 대회 제출에 대한 정보를 solved.ac에 보내는 업데이트를 했으나 https://www.acmicpc.net/board/... 정보를 보내는데 시간이 조금 오래걸렸습니다. 많은 분들이 정보가 전달 완료되기를 기다리기보다는 재제출을 통해서 문제 해결 기록을 solved.ac에 보내고 난이도 기여를 하고 있는 사실은 알고 있지만, 그냥 정보를 빠르게 전달하면 재제출이 없을 것 같습니다.

다음 오픈 대회가 끝난 이후에는 정보를 빠르게 전달해보려고 합니다.

여기에 적지 않은 다른 업데이트도 조금씩 있는데 크게 중요하지는 않아서 생략합니다.

다음에는 요청 게시판 들고 다시 오겠습니다.

댓글을 작성하려면 로그인해야 합니다.