동의 창이 겹치지 않게 네이티브 호출을 한 줄로 세웠다
광고 동의 갱신, 동의 수집, 개인정보 옵션은 서로 다른 버튼에서 시작될 수 있다. 취소할 수 없는 네이티브 호출을 하나씩만 실행하도록 조정했다.
태그
#동시성 · 14개
광고 동의 갱신, 동의 수집, 개인정보 옵션은 서로 다른 버튼에서 시작될 수 있다. 취소할 수 없는 네이티브 호출을 하나씩만 실행하도록 조정했다.
백그라운드 위젯 요청마다 새 토큰을 만들면 기기가 가진 값이 금방 낡았다. 유효한 토큰은 재사용하고 교체 판단은 위젯 행 잠금 안에서 했다.
동시에 들어오는 투표를 같은 카운터에 더하자 잠금 경합이 커졌다. 투표 사건을 먼저 남기고 읽을 때 대기분까지 합산하는 구조로 바꿨다.
앱을 오래 켜 둔 뒤 화면을 다시 열면 여러 API가 동시에 401을 받았다. 각 요청이 토큰을 따로 갱신하면서 세션이 꼬였고, 갱신 작업 하나를 같이 기다리게 바꿨다.
병원 이름으로 미니홈 주소를 만들었더니 같은 이름과 동시 생성 요청에서 충돌이 났다. 고유 제약을 믿고 충돌 원인에 따라 재조회하거나 새 주소를 만들었다.
다이어리 좋아요 행과 화면의 숫자를 따로 바꾸면서 둘이 어긋났다. 사용자별 고유 제약과 트랜잭션을 묶고, 경쟁 요청은 최신 숫자를 다시 읽게 했다.
기기 하나를 계정 A와 B가 거의 동시에 등록하자 UNIQUE 충돌이 500으로 튀었다. 예전 소유 행을 해제하고 충돌 시 트랜잭션을 다시 시도했다.
로그아웃하면서 위젯을 비웠는데 늦게 끝난 이전 새로고침이 다시 써버렸다. 계정 세대 번호와 직렬 queue로 오래된 native write를 막았다.
한 관리자는 게시물을 유지하고 다른 관리자는 삭제하는 요청을 거의 동시에 보냈다. 대상별 DB 잠금 안에서 상태를 다시 읽고 처리와 기록을 한 번에 묶었다.
빈 시간을 확인한 뒤 저장하면 끝인 줄 알았다. 거의 동시에 온 두 요청이 똑같은 빈칸을 읽으면서 중복 예약이 생겼고, DB에서 순서를 세우게 했다.
여러 알림을 차례로 켜는 반복문이 앞에서 바꾼 값을 계속 덮어썼다. 저장소의 최신 값을 잠그고 변경 결과를 계속 반영받도록 고쳤다.
앱 시작과 화면 복귀가 광고 준비를 동시에 부르면서 동의창이 겹쳤다. 진행 중인 Promise를 함께 기다리고, 판단할 수 없으면 개인화를 끄게 정리했다.
여러 화면이 만료된 토큰으로 한꺼번에 요청하면서 갱신도 동시에 시작됐다. 첫 갱신 작업 하나를 나머지 요청이 함께 기다리게 바꿨다.
userId가 NULL이면 일반 UNIQUE가 중복을 막지 못한다. 비회원 투표를 붙이다 발견해 부분 인덱스 두 개로 나눴다.