부하 분배를 서버가 맡으면, 서버는 '한가해 보이는' 워커에게 작업을 밀어 넣게 됩니다. 문제는 서버가 판단 근거로 삼는 값이 워커가 주기적으로 보고한 과거 부하라는 점입니다. 매칭이 오래 걸리는 우편물 하나에 붙들려 있는 동안에도 작업이 계속 쌓이고, 그렇게 쌓인 작업은 타임아웃 리젝트가 됩니다.
그래서 방향을 뒤집었습니다. 워커가 여유가 생겼을 때만 요청합니다. 'credit' 만큼만 흘려보내고, 처리가 끝나면 credit 이 보충됩니다. 서버는 부하를 추측할 필요가 없고, 큐가 비면 그냥 안 보냅니다. 큐 상태를 물어보는 RPC 도 필요 없습니다.
부수 효과가 하나 더 있습니다. 인식기를 몇 대 붙이든 서버 설정을 고칠 일이 없습니다. 밀어넣는 구조였다면 워커 종류가 늘 때마다 '가장 한가한 것 고르기' 로직을 하나씩 더 붙여야 했을 것입니다.