NEW코딩일지 · 11.05코퍼스 메인에 주장 연구실을 세웠다: 사유고2 주장 29만 개를 자동 등록하고 스파크 두 대가 반증 조건까지 검토한다
← 개발로그
·3분

Hermes 개발로그 · 3화

봇이 7개로 늘자 한 작업을 워커 여럿이 동시에 잡았다: 큐 잠금, 위키, 칸반을 붙였다

내가 준 자료로 그림을 그리는 봇 한 쌍을 더 만들고 원고·슬라이드·뉴스 셔틀까지 붙이자 봇이 일곱 개가 됐다. 한 작업을 여러 워커가 동시에 잡았고, 재시작한 봇은 둘로 불어났다. 그래서 위키와 상황판을 만들었다.

▸ Hermes#queue#race-condition#process#dashboard

5월 21일 밤에 물었다. 지금 이미지를 만드는 텔레그램 봇이 모두 몇 개냐고. 답은 둘이었다. 앤디봇과 스토브 이미지봇. 둘 다 밖에서 들어온 정보로 그림을 그리는 봇이다. 내가 직접 준 자료로 그림을 그려 주는 봇은 없었다.

쌍둥이 제작선

그래서 한 쌍을 더 만들었다. 설정은 앤디봇과 라틸리언스봇을 그대로 따른다. 앤디봇이 밖에서 가져온 정보로 1차 이미지를 만들고 라틸리언스봇이 그걸 최종 카드로 바꾸듯, ac-image가 내가 준 정보로 1차 이미지를 만들고 부르바키가 최종 카드로 바꾼다. 자동 수집용 한 쌍과 내 요청용 한 쌍이 나란히 섰다.

그 주에 블로그 원고 봇, 원고를 슬라이드로 바꾸는 봇, AC POST의 기사 링크를 나르는 뉴스 셔틀이 붙었다. 봇이 일곱 개가 되자 누가 무슨 일을 하는지 목록부터 다시 만들어야 했다. 입력은 달라도 워커와 프롬프트를 같이 쓰는 봇이 있고, 완전히 따로 도는 봇이 있었는데 그 경계가 흐려져 있었다.

한 작업을 여러 워커가 잡았다

5월 24일, 앤디봇이 오늘은 그림을 하나도 안 만들었다는 이야기가 나왔다. 찾아보니 안 만든 게 아니었다. 공용 이미지 워커가 여러 개 떠 있었고, 낮 12시 작업 하나를 같은 초에 예닐곱 개가 동시에 잡았다. 그중 몇이 이미지를 완성해 ’완료’를 적었는데, 늦게 끝난 다른 워커가 ’600초 시간 초과’나 ’실패’를 그 위에 덮어썼다. 큐에서는 실패로 보이고, 뒤따르는 카드뉴스는 여러 번 생겼다. 안 만든 것처럼 보이는 것, 중복으로 만든 것, 실패로 남은 것이 원인 하나에서 한꺼번에 나왔다.

큐 파일에 잠금을 걸고, 작업을 잡은 워커만 그 작업의 상태를 쓸 수 있게 했다. 워커는 하나만 다시 띄우고, 중복으로 대기하던 작업은 취소했다.

재시작한 봇이 둘이 됐다

이틀 뒤에는 반대 방향의 문제가 났다. 봇 관리 도구로 폴링 봇 세 개를 재시작했는데, 재시작 명령이 봇을 감싼 screen 세션만 닫고 그 안의 Node 프로세스는 죽이지 못했다. 부모를 잃은 옛 프로세스가 그대로 남아, 봇마다 옛 버전과 새 버전이 동시에 텔레그램 메시지를 기다렸다. 텔레그램은 “다른 getUpdates 요청 때문에 끊겼다”는 오류를 계속 냈다. 1화에서 적어 둔 규칙, 한 봇의 메시지를 받는 쪽은 하나여야 한다는 규칙이 이번엔 관리 도구 쪽에서 깨졌다.

프로세스 수를 줄이는 것만으로는 부족했다. 재시작한 뒤 자식 프로세스까지 정말 사라졌는지, 작업 상태를 쓸 수 있는 주체가 누구인지를 따로 확인해야 했다.

위키, 상황판, 칸반

그 무렵 다른 문제도 커졌다. 새 채팅을 열 때마다 AI가 시스템 전체를 모르는 채로 시작했다. 봇이 많아지니 지금 어떤 작업이 돌고 어디서 막혔는지 눈으로 따라가기도 어려웠다.

봇 일곱 개부터 옵시디언 위키로 정리하게 했다. 그리고 상황판을 요구했다. 봇마다 상태등이 있고, 오늘 한 일과 워크플로우가 보이고, 작업이 접수, 대기, 작업중, 오류, 완료 다섯 칸을 지나가는 칸반이다. 앞 봇이 끝나면 다음 봇이 이어받는 팀 작업도 이 칸반 위에 그렸다. 봇을 다루는 제어 도구에는 허용 목록, 로그 조회, 제한된 재시작, 감사 기록을 요구했다. 새로 일을 시키는 엔진이 아니라, 흩어진 실행을 한곳에서 읽고 정해진 범위 안에서만 손대는 층이다.

배운 것

봇 하나를 더하는 일은 입력 하나를 더하는 일이 아니었다. 어떤 워커가 그 작업을 가지는지, 결과를 누가 이어받는지, 재시작하면 무엇이 남는지까지 같이 등록해야 했다. 그걸 빼먹을 때마다 성공과 실패가 동시에 남았다.

Hermes 개발로그 · 전 4화

  1. 1화텔레그램 봇 3개를 맥 스튜디오로 옮겼다: 한 봇의 메시지는 한 곳에서만 받는다
  2. 2화정각 크론을 '오늘 한 번' 약속으로 바꿨다: 새벽 브리핑이 사흘 연속 오지 않은 뒤
  3. 3화봇이 7개로 늘자 한 작업을 워커 여럿이 동시에 잡았다: 큐 잠금, 위키, 칸반을 붙였다
  4. 4화옛 런타임 2벌을 지우지 않고 은퇴시켰다: 큐 이력 2,101건은 보관 폴더로