Redis의 HSET은 Hash 자료구조로 데이터를 저장하고 조회할수있는 명령어 셋이다.
이 명령어를 push전송 기능을 만들때, 사용을 해야하는 케이스가 생겼다.
HSET push_data txId "push토큰"
ex)
HSET push_data "1" "asdsadsadasd1"
HSET push_data "2" "as123da44sd2"
HSET push_data "3" "fresds2fdadsd3"
간단히 이야기를 하면,
푸시를 발송하는 기능을 만들어야하는데, 예약발송 기능을 구현해야했다.
예약발송을 여러방법으로 구현할수있겠지만,
우리는 Redis의 ZSET와 HSET을 사용하여 예약발송 기능을 구현하였다.
ZSET를 통해, 예약발송을 해야하는 시간을 SCORE로 사용하여 소팅된 리스트를 관리하고 꺼내 사용할수있게 하였고,
VALUE로 해당 발송을 위한 정보를 찾을수있게 TXID값(유니크한 UUID)을 저장하게 했다.
그리고 HSET을 통해, TXID로 실제 토큰정보를 가져올수있게 설계를 하였다.
사실 ZSET만 가지고도 기능을 구현할수있었고, 처음에는 그렇게 구현을 하였지만,
이후에 요건인 예약발송한 건에 대해 취소할수있는 기능을 구현해야했다.
이경우에는 ZSET만 가지고는 정확히 해당건에 대해서 간단히 취소를 할수있는 구조가 아니었기때문에, 구조를 조금 변경하였다.
여기서 이제 큰 이슈가 발생하였다!!
ZSET을 통해 특정 시간(SCORE)안에 해당하는 TXID들을 꺼내서, HSET에서 PUSH정보를 벌크로 꺼내야하는데,
HSET은 Redis 클러스터 노드에서 슬롯에 포함되는 하나의 노드에 저장되고 조회할수있기에,
HSET의 조회/저장의 부담이 하나의 노드로 몰리게 된다.
이게 다른 서비스에서는 큰문제가 되지않겠지만, 푸시 서비스에서는 대량의 메세지 전송을 위해,
대량의 토큰데이터를 레디스 하나의 노드의 HSET에서 읽어야하는 경우가 발생할수있기 때문에 이부분을 좀더 깊게 고민을 했다.
고민의 포인트는,
HSET을 레디스 클러스터 갯수와 동일한 갯수로 만들고, 각각이 노드에 하나씩만 정확히 생성되도록 하는 방법을 생각하는것이였다.
상당히 까다로운 조건이여서, 고민이 많았다.
하지만, 방법을 찾았지 !!! (후후... 이런 방법을 찾아낼때가 정말 희열을 느끼는것같다. 너무나 개발이 잼있다.)
방법은 아래와 같다.
레디스의 슬롯의 크기를 정해져있다. 상수값이라는 말이다.
최대 슬롯수 = 16384개
우선 예를 통해서 설명을 하겠다. 복잡해 복잡해..
전제조건)
1) 레디스의 최대 슬롯의 크기 = 16384개
2) 현재 운영하는 레디스 클러스터수 = 3대
목표)
HSET을 3개를 만들고, 각각의 레디스 노드에 하나씩 생성되도록 함.
이유)
HSET을 통한 저장/조회의 네트워크/CPU등의 레디스 노드의 부담을 여러 노드가 부담하여, 서비스의 성능/안정성을 높이기 위함.
방법)
1) 레디스의 최대 슬롯의 크기 / 레디스 클러스터수 결과를 통해 슬롯의 범위를 구한다.
2) 레디스 클러스터 index기준 1번 슬롯범위의 중간값을 저장하는 map을 하나 만든다.
- ex)
{
"0" : 2730, //0 ~ 5461의 중간값
"1" : 8191, //5461 ~ 10922의 중간값
"2" : 13652, //10922 ~ 16384의 중간값
}
3) txId를 0, 1, 2 (클러스터갯수만큼)가 분산되서 나올수있게 소트 알고리즘을 만든다.
4) txId의 소트값으로 위 2번의 키를 통해, 들어가야하는 슬롯값을 구한다.
5) HSET을 생성할때 TAG를 통해, 해당 슬롯값을 명시하여 HSET을 만들게 하여, 해당 슬롯값이 포함되는 노드에 생성되게 유도한다.
- ex)
HSET "push_data:{슬롯값}:payload" "testTxId" "1234"
- * 정확히는 슬롯값을 직접명시하는건 아니고, 해당슬롯값이 나오도록 REDIS에서 사용하는 소트공식으로 통해 슬롯해시값을 구해서 넣는것.
이렇게 하면, 레디스 노드별로 원하는 갯수의 HSET을 원하는 노드에 생성하고, 저장/조회하도록 하여,
노드의 부하 분산을 할수있는 구조로 레디스 HSET을 사용할수있다.
이런 창의적인 방법/아이디어를 챗지피티가 알려줄수있을까??
또 한번 AI 개발설계의 무용론에 대한 생각이 나네.. ㅋㅋ
개발 설계/이슈 해결을 위해 방법을 찾을때 만큼은... AI사용을 좀 자제하도록 하자..
'MY아이디어' 카테고리의 다른 글
| [개발아이디어] 대기열을 구현해보자. (0) | 2026.07.25 |
|---|---|
| [아이디어] 삼성,엘지 가전 제어, 어떻게 할까? (0) | 2026.07.09 |
| [아이디어] 16년된 게임개발 아이디어... (0) | 2026.05.11 |
| [아이디어] 스크래핑 내재화에 도전하다 (5) | 2026.05.05 |
| [아이디어] 테슬라 데이터 수집 - 테슬라가 빌런이다. (4) | 2026.04.25 |
