Post

전체 유저 공지 개선: Broadcast Alarm을 활용한 성능 향상

전체 공지 개선하기


Q&A 플랫폼 회원수가 계속해서 늘어남에 따라 예전에 작성해 두었던 코드들이 문제를 일으키는 경우가 종종 생겼다. 그중 회원수가 4천명도 채 되지 않았을때 만들었던 공지 알림 기능이 문제가 생겼다.

회원마다 각자의 Alarm 이 있다. 누군가 나의 글에 댓글을 달거나 나를 mention 하거나 알림을 줘야하는 상황이 오면 나의 AlarmList에 해당 정보를 쌓아 두고 Q&A 플랫폼에 들어오면 그 알림을 보여준다.

이런 기능이 들어가면 또 당연히 들어가면 좋겠는것이 관리자가 한번에 모든 사람들이 볼수 있는 Alarm 을 추가 할 수 있도록 하는 것이다! 그래서 그때는 단순하게 생각하고 모든 사람들의 Alarm List 를 돌아다니면서 모두 새로운 Alarm 을 하나씩 넣어주었다.

1
2
3
4
5
6
7
8
AlarmItem alarmItem = new AlarmItem(msg, ...);
do {
    profileList = getProfileList(page);
    for (Profile profile : profileList) {
	    Alarm profileAlarm = profile.getAlarm();
		profileAlarm.getAlarmList.add(alarmItem);
    }
} while(profileList.size() > 0)

그리고 posthandle 에서 본인의 alarmlist 를 넣어준다!

1
2
3
4
5
6
public void postHandle(HttpServletRequest request, HttpServletResponse response, 
                           Object handler, ModelAndView modelAndView) throws Exception {
        ...
        modelAndView.addObject("alarmList", userAlarm.getAlarmList());
        ...
}

사람이 얼마 되지 않았을때는 전혀 문제가 되지 않았지만 지금 그에 비해 무려 13배가 넘는 회원이 생겨버려서 이제는 공지 Alarm을 할때 시간이 너무 오래 걸렸다. 또 에러가 발생하는 경우 디버깅이 너무 힘들었다 (시간이 너무 오래 걸리니까!! )

broadcastAlarm 을 하나를 만들어 모두가 공유하자!


따라서 저렇게 전체 공지를 하는 경우에 사용할 broadcastAlarm 을 하나 만들기로 했다. 그리고 유저가 Q&A 플랫폼에 들어오면 본인의 Alarm 들과 boradcastAlarm 들을 가져오는 것이다. 그러면 단순히 추가 할때 do while 이 아닌 한번만 넣어주면 된다! 벌써 여기서 부터 엄청난 시간이 단축된다! 또 만약 에러가 발생하면 금방 찾아 낼 수 있다!

1
2
3
AlarmItem alarmItem = new AlarmItem(msg, ...);
Alarm broadcastAlarm = utils.getBroadcastAlarm();
broadcastAlarm.getAlarmList().add(alarmItem);
1
2
3
4
5
6
public void postHandle(HttpServletRequest request, HttpServletResponse response, 
                           Object handler, ModelAndView modelAndView) throws Exception {
        ...
        modelAndView.addObject("alarmList", getMergedAlarmList(userAlarm.getAlarmList(), broadcastAlarm.getAlarmList());
        ...
}

더 생각해본점


기존에 확인한 알림의 경우에는 alarmitem 에 checked 라는 필드가 있어서 checked가 false인 item 이 있으면 새로운 알림을 표시했는데 broadcastAlarm 이 생기면서 한명 한명 다 저장하기는 어렵다고 생각했다.

따라서 이제는 그 필드를 확인하지 않고 알림 dropdown 을 누른 시간을 저장하고 알림들의 추가된 시간을 저장해서 그 사람이 확인하지 않은 새로운 알림이 있는지를 표시 하도록 했다.

개선된 점


  1. 우선 속도가 굉장히 빨라 졌다!! 기존에는 추가버튼을 누르고 한참을 있어야 모든 사람이 확인 할 수 있었는데 현재는 추가버튼을 누르자 마자 사람들이 볼수 있다.
  2. 필요없는 정보들이 많이 사라졌다. 똑같은 내용이 50000개 이상 db 에 있었는데 이제는 단 1개로 충분하다!
  3. 계속해서 말하지만 알수 없는 에러가 없어졌다. 엄청난 do while을 돌다보니 에러가 나도 뭔가 다시 재현하기도 어렵고 그랬는데 이제는 그런 에러들을 마주하지 않아도 된다.
This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.