결론부터 말하자. 창고 네트워크 장애에는 두 가지 종류가 있다. RF 건과 WMS를 연결하는 회선이 끊어지면――이건 "팔이 부러진 것". WMS 서버 자체가 죽으면――이건 "심장이 멈춘 것"이다. 팔이 부러진 것은 휴대용 단말기의 오프라인 모드로 해결할 수 있다. 심장이 멈춘 것은 종이 비상 전표와 사후 정산으로 버티는 수밖에 없다. 피킹과 입고는 오프라인 컨틴전시 플랜이 필수다. 대시보드와 리포트는 도박을 해도 된다――배팅에서 지더라도 나중에 보면 그만이다. 화물은 어쨌든 나간다.

2021년, 나는 캘리포니아 온타리오에 있는 90,000평방피트 규모의 3PL 창고에서 WMS 가동을 책임지고 있었다. 현장에는 Zebra TC52 핸드헬드 30대, 성수기에는 하루 4,000건이 넘는 출고 주문, 모든 것은 RF 스캔으로 돌아갔다. 어느 오후 전산실 에어컨이 고장 나면서 코어 스위치가 과열되어 재부팅되었고, WiFi가 40분간 멈췄다. 모든 단말 화면에 "연결 실패"가 뜨는 가운데 피커들은 통로에 할 일 없이 서 있었다. 40분간 창고는 사실상 정지했다――화물이 없어서가 아니라, 무엇을 집고 어디에 두어야 할지 아무도 몰랐기 때문이다. 그날 이후, 오프라인 컨틴전시 플랜은 내가 맡는 모든 WMS 프로젝트의 인수 체크리스트에 들어간다. 컨틴전시 없이는 가동 없다.

네트워크가 끊어져도 RF 건은 계속 스캔할 수 있을까

가능하다――다만 핸드헬드 앱에 진짜 오프라인 모드가 있을 때만 그렇다. 영업 자료에 나오는 그런 식의 가짜가 아니라.

많은 WMS 벤더가 오프라인을 지원한다고 하지만, 실제로 모바일 앱이 캐싱하는 건 로그인 화면뿐이고 태스크 데이터는 단말기에 전혀 저장되지 않는다. 데모를 액면 그대로 믿지 마라. 인수 단계에서 플러그를 뽑고 테스트하라. 네트워크가 끊긴 상태에서 스캔 피킹, 스캔 입고, 재고 실사가 가능한지, 모든 스캔이 기기에 저장되는지. 가능하다면 그게 오프라인 모드다.

제대로 작동하려면 두 가지 조건이 충족되어야 한다. 시프트 시작 전에 그날의 웨이브 태스크, 로케이션 마스터 데이터, 상품 바코드 라이브러리를 각 단말기에 미리 내려보내야 한다――Zebra TC52급 안드로이드 기기라면 수만 건의 태스크 레코드는 가볍게 처리한다(정확한 한도는 벤더 문서에서 확인할 것). 네트워크가 끊기면 모든 스캔에 타임스탬프를 찍어 단말기 안에 큐잉하고, 연결이 돌아오면 순서대로 업로드한다. 두 조건 중 하나라도 빠지면 전부 쇼에 불과하다.

여기 내가 제대로 당한 함정이 있다. 온타리오에서의 일인데, 회선이 복구되자마자 30대의 단말기가 쌓아 둔 스캔을 한꺼번에 서버로 밀어 넣으면서 WMS 데이터 인터페이스가 타임아웃에 빠졌다. 레코드의 대략 절반은 아예 기록되지 않았고, 나머지 절반은 두 번씩 기록되었다. 우리는 두 가지 설정으로 이 문제를 종결시켰다. 단말기 측 업로드 스로틀링――한꺼번에 밀어 넣지 말고 간격을 둔 배치 전송. 그리고 서버 측 멱등성 체크――기기 시리얼 번호와 타임스탬프를 고유 키로 하고 중복은 도착 즉시 폐기한다. 이 두 가지가 인수 체크리스트에 없으면 그 오프라인 모드는 장식품이다.

중단 지점부터 재개(resume-from-breakpoint)는 같은 아이디어를 태스크에 적용한 것이다. 웨이브 피킹이 연결 끊김 도중 반쯤에서 죽는다. 회선이 돌아오면 웨이브 전체를 다시 다운로드하는 게 아니라 중단된 라인부터 이어가야 한다. 그러려면 태스크 진행 상황이 실시간으로 단말기에 기록되고, 업로드에 "완료된 라인 수" 마커가 포함되어야 한다. 인수 단계에서 명시적으로 테스트하라. 20번째 라인에서 네트워크를 끊고, 나머지는 오프라인으로 끝내고, 복구 후 시스템이 그 20개 라인을 제대로 인정하는지 확인한다. 인정하지 않으면 반려다.

랙 통로에서 팔레트를 스캔하는 RF 단말기

서버가 정말 죽으면, 종이로 어떻게 혼란 없이 운영할까

서버가 죽으면 오프라인 모드의 영역이 아니다――단말기에 캐시된 약간의 데이터로는 한 시프트를 버틸 수 없다. 그때 종이 비상 전표가 이어받는다. 하지만 막무가내로 하는 종이 작업은 가만히 서 있는 것보다 나쁘다. 장부가 엉망이 되면 복구 후 사흘은 엉킨 실을 푸는 데 쓰게 된다.

재해가 닥치기 전에 세 가지가 준비되어 있어야 하고, 세 가지 모두 타협이 안 된다. 미리 인쇄한 비상 피킹 전표를 수퍼바이저 사무실 캐비닛에 보관한다. 템플릿의 각 라인에는 바코드 칸을 둔다――로케이션 바코드, 상품 바코드, 수량 필드――항상 바코드와 사람이 읽을 수 있는 숫자를 함께 쓴다. 왜냐고? 사후 입력 때 사무 직원이 SKU를 손으로 치는 대신 종이를 스캔하면 되기 때문이다. 더 빠르고 실수도 훨씬 적다. 온타리오에서의 사후 샘플링에서, 완전 수기 SKU 전표는 입력 오류율이 정상 수준의 3~5배였다(이 프로젝트에서 실측, 대략). 바코드 포함 전표는 사실상 깨끗했다.

전표 번호 매기기가 두 번째다. 모든 비상 전표에는 고유 번호가 필요하다――EMRG-날짜-순번 같은 형식으로. 어느 전표를 누구에게 줬고 어느 전표가 돌아왔는지 수퍼바이저가 손으로 대장에 기록한다. 번호 없는 종이는 정산 시점에 전표가 분실되었는지 알 방법이 없고, 전표 한 장의 분실은 해결 불가능한 혼란 한 건이다.

세 번째는 사후 입력의 2인 1조 규칙이다. 네트워크 복구 후, 한 사람이 종이 데이터를 WMS에 입력하고 다른 사람이 약 10%를 샘플링 검증한다(대략치――자사의 허용 범위를 정해둘 것). 사후 입력이 끝나기 전까지 해당 로케이션은 잠긴 상태로 유지한다. 실시간 이동은 일절 금지다. 실시간 트랜잭션과 사후 입력을 섞으면 장부는 영원히 맞지 않는다.

종이 대체에서 자주 간과되는 부분이 있다. 입고다. 서버가 죽으면 ASN이 오지 않으니 들어오는 화물은 바로 스테이징 구역으로 보내고, 트레일러 번호판, 박스 수량, 화물 표시를 종이에 기록하고 사진도 찍는다. 입고 트랜잭션은 시스템이 복구될 때까지 기다린다. 그 스테이징 구역은 미리 구획해 두어야 한다――위기 한복판에 바닥 공간을 찾으러 다니지 마라.

회선이 복구되면, 무엇을 먼저 정산해야 할까

네트워크가 돌아왔다고 해서 정상 영업이 아니다. 나는 세 가지를 정해진 순서대로 처리한다. 순서가 중요하다.

타임스탬프가 먼저다. 오프라인에서 기록된 타임스탬프가 서버 시간과 일치하는지가 재고 원장의 순서를 결정한다. 단말기와 서버는 모두 NTP 소스에 동기화되어야 한다. 몇 분만 어긋나도 오프라인 기록과 온라인 기록이 잘못 엉키고, 그 결과 재고 차이가 정신을 혼미하게 만든다. 오프라인 설계를 인수할 때는 의도적으로 한 대의 단말기 시계를 10분 어긋나게 하고 네트워크를 끊은 뒤 시스템이 이를 감지하는지 지켜본다. 이를 감지 못하는 설계는 인수 탈락이다.

중복과 누락이 그다음이다. 오프라인 큐의 업로드 로그를 내보내 WMS 재고 트랜잭션 테이블과 한 줄씩 대조한다. 두 번 기록된 스캔은 없는가(멱등성 구멍)? 사라진 스캔은 없는가(업로드 타임아웃)? 피킹과 입고부터 확인한다――빈도가 높은 움직임이기 때문이다. 입고와 재고 실사는 차례를 기다리면 된다.

마지막은 종이 마감이다. 비상 전표를 한 장씩 소진한다. 발행된 전표, 회수된 전표, 입력된 전표――세 숫자가 일치해야 끝이다. 한 장이라도 모자라면 수퍼바이저의 수기 대장을 따라 내려가며 추적한다. 온타리오의 그 40분 장애는 정산에 반나절이 꼬박 걸렸다(프로젝트에서 실측). 40분 다운에 4시간의 정산――이 비율은 미리 경영진에게 브리핑해 두어라. 그러지 않으면 WiFi 막대기가 돌아오는 순간 모든 게 괜찮아졌다고 착각한다.

그리고 정산 보고서에 서명이 들어갈 때까지는 "복구 완료"라고 보고하지 마라. 내 규칙은 이렇다. 그 서명이 나오기 전까지 창고의 상태는 대외적으로 "제한 운영"으로 유지한다.

이번 주에 할 수 있는 세 가지

  1. 플러그를 뽑는 테스트를 해보라. 피크가 아닌 시간대를 골라 피킹 존의 AP 한 대를 끈다――단말기를 비행기 모드로 전환하는 것만으로도 된다――앱이 웨이브를 오프라인으로 끝까지 처리하고 재연결 후 데이터가 온전한지 확인한다. 20분이면 자사 WMS 오프라인 모드가 진짜인지 알 수 있다.
  2. 비상 피킹 전표 템플릿을 50장 인쇄하라. 위의 바코드+숫자 형식으로 만들어 수퍼바이저 사무실에 잠가 둔다. 다음 서버 장애 때는 적어도 종이는 있다.
  3. 모든 단말기와 서버의 NTP를 동기화하라. 각 핸드헬드에 로그인해 시계를 서버와 비교하고 1분 이상 어긋난 것은 바로잡는다. 지금까지 가장 저렴한 컨틴전시 투자다.

영어판 번역본입니다. 내용이 다를 경우 영어판을 우선합니다.