규턴의 개발블로그

문제정의

 

현재 라이엇api를 이용하여 유저의 20개 전적을 불러온다.

근데 로직이 이상한건지 한번 불러오는데 5초 이상이걸린다.

만약 멀티서치를 할경우 5명의 전적을 한번에 검색하는데 1분은 걸리고 503에러도 발생

 

 

사실 수집 및 원인추론

 

 

{
  "latestTwentyRecords": {
    "averageKill": "12.2",
    "lose": "10",
    "averageKda": "3.58",
    "draw": "0",
    "winRate": "50%",
    "win": "10",
    "averageAssist": "14.5",
    "averageDeath": "7.5"
  },
  "gameRecord": [
    {
      "death": "6",
      "csPerMiutes": "7.1",
      "playtime": "30분53초",
      "semiRuneImg": "https://ddragon.canisback.com/img/perk-images/Styles/7201_Precision.png",
      "primaryRune": "어둠의 수확",
      "spell2img": "http://ddragon.leagueoflegends.com/cdn/10.3.1/img/spell/SummonerFlash.png",
      "championUI": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Graves.png",
      "win": true,
      "spell2": "점멸",
      "spell1": "강타",
      "averageTier": "SILVERIII",
      "semiRune": "정밀",
      "visionWard": "3",
      "players": [
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Graves.png",
          "lolName": "규 턴",
          "championName": "Graves",
          "Position": "JUNGLE",
          "team": "Blue"
        },
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Vayne.png",
          "lolName": "lIIllIlllIIlIl",
          "championName": "Vayne",
          "Position": "BOTTOM",
          "team": "Blue"
        },
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Bard.png",
          "lolName": "와드박는도디",
          "championName": "Bard",
          "Position": "UTILITY",
          "team": "Blue"
        },
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Yasuo.png",
          "lolName": "질풍노도칼잽이",
          "championName": "Yasuo",
          "Position": "MIDDLE",
          "team": "Blue"
        },
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Kayle.png",
          "lolName": "붕어빵의계절",
          "championName": "Kayle",
          "Position": "TOP",
          "team": "Blue"
        },
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Fizz.png",
          "lolName": "미드 감전 퀸",
          "championName": "Fizz",
          "Position": "TOP",
          "team": "Red"
        },
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Sett.png",
          "lolName": "돌아온 선짱구",
          "championName": "Sett",
          "Position": "BOTTOM",
          "team": "Red"
        },
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Pantheon.png",
          "lolName": "찍찍찌직",
          "championName": "Pantheon",
          "Position": "UTILITY",
          "team": "Red"
        },
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Viego.png",
          "lolName": "500일의썸머",
          "championName": "Viego",
          "Position": "JUNGLE",
          "team": "Red"
        },
        {
          "championImg": "https://ddragon.leagueoflegends.com/cdn10.6.1/img/champion/Leblanc.png",
          "lolName": "실종됐어용",
          "championName": "Leblanc",
          "Position": "MIDDLE",
          "team": "Red"
        }
      ],

실제 내가만든 프로젝트에서 전적검색 결과의 일부를 들고와봤다.

이건 일부이고 실제로는 저런 데이터가 *20개가 나온다.

 

오래걸릴만하다...

 

실제로 저 데이터를 받기위해선 riot api를 하나만 호출하는게 아니고 여러개 호출한다(최소 5개이상)*20 약 100개 가까이 호출하는듯

 

 

 

조사방법 결정

 

단순하게 생각했을때 db에 해당파일을 저장하면된다.

 

근데 한가지 이슈가 있는게 라이엇api에서는 무조건 json 형태로 준다

 

이를 해결하기 위한 두가지 방법

1.json-> sql 쿼리 작성 -> db 적재

2.nosql(key-value)값으로 구성된 db 설계

3. db에 json 자체를 넣음

 

2번은 철회했다

그 이유는 첫번째로 이미 멤버나 채팅구현 서비스로 인해 mysql를 사용하고 있다. 그렇다고 2개의 디비를 사용하기에는 개인적으로 부담이 된다. 또한 key-value와 같은 구성의 NoSql을 사용하는것은 프로젝트 마감기한이 얼마 남지 않음.

 

1번

nifi에서 json형태를 sql문으로 바꿔주는 오픈소스 솔루션이 존재

또한 인턴에서 배운 kafka, nifi 등을 사용하면 좋을거 같다고 생각하였기에 1번을 선택

 

3번

이건 효율적인 측면에서 봤을때 좋은 측면이다.

그렇기에 kafka를 통해 우선 20개의 데이터를 넣는다.

kafka 토픽을 컨슘해도 사라지지 않는다는 특성을 사용해

하나의 컨슈머 그룹은 바로 json을 db적재

두번째는 db에 sql문으로 변경 (1번 솔루션)

 

3번이 필요한 이유: 머신러닝시에는 필요한 데이터만 필요함으로 query문을 작성해 머신러닝에 맞는 csv or json파일을 주어야 하기 때문

 

즉 1+3 번 방식으로 해결예정

 

 

 

dataflow 설계

 

스케줄러를 사용하여 사용자가 전적검색을 하기전에 미리 백엔드 단에서 db에 해당 데이터를 적재하려고 한다. 그러면 좀 빠르게 전적검색을 할 수 있다고 생각한다.

전체적인 흐름은 다음과 같다.

 

  1. op.gg 랭킹(레벨기준)에서 롤닉네임 크롤링 → 2000만명의 유저중 우리는 몇명을 기준으로 할까?
  2. mostchampion, line정보, gamerecord, userinfo 정보를 db에 저장(json) → 이를 총 관리하는 gameinfo 테이블을 이용하여 1:1 매핑설정 → 스케줄러 이용(riot api key 호출량을 고려하여 코드 작성)
  3. 2번의 상황에서 kafka를 사용하여 producer가 테이블에 맞게 topic에 보냄
  4. 2개의 컨슈머 그룹을 사용하여 하나는 바로 json데이터를 db에 적재 나머지 하나는 json데이터를 rdbms형태로 변환(nifi) 이용
  5. 이후 csv파일의 형태로 머신러닝에게 전달

 

 

이제 하나씩 구현하는것을 기록해볼까한다..

 

 

 

 

 

profile

규턴의 개발블로그

@규턴이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!