Search
moon
sun

최소한으로 울리는 알림 만들기: 비정상 병원 알림

URL
생성 일시
2026/10/07 15:06
최종 편집 일시
2026/10/07 15:06
태그
비브로스
파일과 미디어
유저 문의 전에 접수 중단을 알아차릴 수 있도록 슬랙 알림을 만들었습니다. 기존 판정 흐름을 활용하고 발송 대상과 시점, 중복과 복구 기준을 정해 대응이 필요한 상황만 알리도록 설계한 과정을 소개합니다. || 병원은 진료 중인데 똑닥 앱에서는 접수가 되지 않습니다. 병원 PC와 연결이 끊어졌지만 누구도 상황을 인지하지 못합니다. 유저가 고객센터에 문의한 뒤에야 대응이 시작되기도 합니다. 접수가 비정상적으로 멈춘 상황을 먼저 발견하고 대응할 수 있도록 비정상 병원을 감지하는 알림을 만들었습니다. 접수가 닫혀 있는 병원을 찾는 것만으로는 충분하지 않았습니다. 휴게시간이나 휴진처럼 정상적으로 접수를 중단한 병원은 제외해야 했고, 여러 서버가 같은 병원을 동시에 감지하더라도 알림은 한 번만 발송되어야 했습니다. 무엇을 비정상으로 볼지, 언제 알림을 보낼지, 중복을 어떻게 막을지, 필요한 순간에만 알림이 울리도록 기준을 정한 과정을 공유합니다. 비정상 병원 판정 구조 (MongoDB, Kafka) 판정 기준 1차 판정에서 접수에 필요한 설정이 갖춰졌는지 확인하고 이를 통과한 병원에 한해 2차 판정이 실시간 접수 가능 여부를 봅니다. 단계확인하는 내용실행 시점1차접수 설정이 갖춰져 있는가 — 활성 진료실, 접수 설정하루 한 번 전체 확인 + 변경 감지2차지금 접수를 받을 수 있는가 — 접수 가능한 진료실, 에이전트 연결N분 주기 배치 + 변경 감지 2차 판정은 결과만 남기지 않습니다. 접수 가능한 진료실의 유무와 에이전트 연결 상태가 근거로 따로 기록되어 점심시간이나 휴진으로 접수를 닫은 병원과 에이전트가 끊긴 병원을 나눠 볼 수 있습니다. 이번 알림은 끊김만 다루므로 두 가지 근거 중 연결 상태를 봅니다. 에이전트와 일정 시간 통신이 없으면 상태가 "끊김"으로 바뀌고, 통신이 다시 이어지면 "연결됨"으로 돌아옵니다. 판정 요청 경로 배치는 스케줄에 따라, 변경 감지는 데이터 변경 이벤트가 생길 때마다 판정 요청을 발행합니다. 휴게시간 시작과 접수 종료는 시간이 지나면 저절로 바뀌는 상태라 DB에 변경이 일어나지 않습니다. 그래서 주기 배치가 1차 통과 병원들을 대상으로 N분마다 다시 판정을 요청합니다. 요청은 모두 하나의 Kafka 토픽에 모이고, 컨슈머가 출처 값으로 구분해 판정한 뒤 결과를 Redis 목록 갱신이나 검색 색인 같은 후처리로 넘깁니다. 출처시점대상Kafka key일 배치매일 새벽DB에서 집계한 접수 사용 병원 전체없음주기 배치N분마다Redis에 저장된 1차 통과 병원을 여러 곳씩 묶어 요청없음변경 감지데이터가 바뀔 때MongoDB Change Stream(CDC)으로 변경을 감지한 병원 1곳병원 ID 요청 출처마다 메시지 key가 다른데, Kafka는 이 key로 파티션을 정합니다. 변경 감지는 병원 ID가 key라 같은 병원의 요청이 한 파티션에 차례로 쌓입니다. 주기 배치는 여러 병원을 한 메시지에 묶어 key가 없으므로, 회차마다 다른 파티션과 컨슈머로 흩어질 수 있고 순서도 보장되지 않습니다. 다만 메시지에는 다시 판정할 병원 목록만 담기고 컨슈머가 처리 시점에 DB에서 최신 상태를 읽으므로, 순서가 바뀌어도 판정 결과는 같습니다. 알림 발송 설계 (Redis, Slack) 알림 구조 초기 설계는 알림을 판정 흐름과 분리해 별도 크론에 맡기는 방식이었습니다. 짧은 주기로 Redis에 쌓인 1차·2차 판정 결과를 조합해 접수가 안 되는 병원을 추리는 크론과 매일 밤 복구되지 않은 건을 일괄 정리하는 크론입니다. 그러나 팀 내 설계 리뷰에서 새 크론 대신 이미 돌고 있는 판정 흐름을 재활용하자는 의견이 나왔습니다. 판정 컨슈머가 계산한 병원 상태를 크론이 Redis에서 다시 조합하면 같은 계산을 두 번 하는 셈입니다. 판단 기준도 양쪽에 생겨 한쪽만 고치면 운영 화면과 알림이 어긋날 수 있습니다. 크론이 제때 돌았는지, 실패하지 않았는지 지켜봐야 해서 감시 대상도 늘어납니다. 판정 요청 일 배치하루 한 번 주기 배치N분마다 변경 감지CDC, 변경 즉시 Kafka