팥소를 사칭하는 스타!!usic의 다중 게임 기능인'여러분 실황 녹음'의 일치 실현

6385 단어 RubyRedis
Happy Elements Advent Calendar 2020 23일째 되는 글입니다.

다 같이 콘서트.



팥소를 사칭하는 스타!!음악에서 올해 11월에'여러분의 실황 녹음'의.β버전이 출시되었습니다.'다함께 콘서트'는 랜덤 프로듀서와 어울려 함께 콘서트를 할 수 있는 기능으로 평소와 다른 아이돌 그룹과 의상을 즐길 수 있다.
이 보도는 다중 게임의 설치의 한 예로 이'모두들 실황 녹음'의 프로듀서들의 일치하는 구조를 소개한다.

기본 매칭 메커니즘


"모두 함께 콘서트"의 일치 논리는 응용 서버 내의 처리에서 완성됩니다.팥소를 사칭하는 스타!!음악 서버가 여러 인스턴스에서 실행되므로 일치하는 데이터는 Redis에 저장되어 모든 사용자가 액세스할 수 있습니다.
참조: Happy Elements Advent Calendar 2020 17일째'AWS의 서비스 로기 3번째 승부 2020 in Happy Elements'
안녕하세요.음악에서 멀티플레이어 게임의 방 단위는 로비라고 불린다.일치하는 인원수에 따라 이 구멍의 데이터를 Redis Streams에 넣습니다.
참조: 이중 흐름 정보
Redis Streams는 거의 대기열로 간주되며 xadd 에 데이터를 추가하고 xreadxreadgroup 에서 시작 요소를 검색합니다.사용자 그룹을 사용해서 잘 이루어질 수 있다고 생각했기 때문에 단순한list가 아니라 Redis Streams에서 이루어졌지만 현황은 단순한 대기열로만 사용되기 때문에list도 가능하다고 생각합니다.
일치하고 싶은 유저의 요구가 있으면 로비 안의 인원수(1~4명)로 나누어진 4개의 흐름으로 채워진 4명의 로비 흐름부터 순서대로xread 로비를 얻는다.이것은 가장 깊은 구멍부터 순서대로 일치하며, 어떤 흐름에도 구멍이 없으면 새로운 구멍을 만듭니다.
일치하는 조건에 따라 각각 제작 흐름, 현황 규격은 4(인수)×2(2D 게임 또는 3D 게임)×2 (조직의 종합값에 따른 2가지 일치 유형) 16개의 흐름으로 구성된다.
5명이 함께 매칭을 마쳤을 때 로비의 데이터를 열쇠로 Redis에 저장하고 이후 게임에서 참조와 조작을 할 수 있다.

예제 코드


설명용 코드니까 적당히 바꿔주세요.
예를 들어, Redis에 Json이 저장한 형식으로 쓰여 있습니다.
MAX_ROOM_USERS_COUNT = 5

consumer_group_name = "hoge"
user_id = 1
play_2d_mode = false
redis = Redis.new

def get_stream_key(count, play_2d_mode, matching_type)
    "stream_key_#{count}_#{play_2d_mode}_#{matching_type}"
end

def xadd(hall, play_2d_mode, matching_type)
    redis.xadd(get_stream_key(hall.user_ids.size, play_2d_mode, matching_type), {hall: hall.to_json}, id: "*")
end


(MAX_ROOM_USERS_COUNT - 1).downto(1) do |n|
    picked_hall_ids = []
    while do
        data = redis.xreadgroup(consumer_group_name, user_id, get_stream_key(n, play_2d_mode, matching_type), '>', count: 1, noack: true)
        break if data.empty?

        hall_data = data[get_stream_key(n, play_2d_mode, matching_type)][0][1]["hall"]
        hall = Hall.new(JSON.parse(hall_data))

        # 一度取得したhallをxaddしているので一巡したら同じhallが取得される
        break if picked_hall_ids.include?(hall.id)

        picked_hall_ids << hall.id
        if hall.add_user(user_id)
            if hall.user_ids.size >= MAX_ROOM_USERS_COUNT
                redis.set(hall.id, hall.to_json)
            else
                xadd(hall, play_2d_mode, matching_type)
            end
            return hall
        end
    end
end

hall = Hall.new
hall.add_user(user_id)
xadd(hall, play_2d_mode, matching_type)
return hall

일치 중 추가 처리


유저를 분배하면 되지만 매칭에 두 개의 처리가 추가되었습니다.

종료 유저의 삭제 처리


하나는 퇴장한 유저를 삭제하는 처리입니다.로비의 데이터를 대기열에 넣었기 때문에 퇴장할 경우 그 타이밍에 로비의 데이터를 터치할 수 없습니다.
따라서 사용자 데이터에 현재 거실에 있는 ID를 저장하고 종료 요청이 있으면 nil로 설정합니다.그리고 다른 사람이 그 로비에 일치하는 시기에 로비에 있어야 하는 유저의 로비 ID를 참조하여 로비에 있는지 확인합니다.홀 ID가 nil 또는 다른 홀 ID를 삭제한 유저는 삭제된 인원수에 따라 흐름에 추가됩니다.
이처럼 일치 처리에 있어 종료 후 지연이 발생하지만 게임 화면에서는 게임 클라이언트 간의 양방향 통신을 통해 종료가 검출되기 때문에 다른 유저가 종료하는 시기에 화면이 업데이트된다.
대부분의 경우 종료하기 전에 매칭을 빨리 끝내기 때문에 종료 버튼을 눌러도 매칭이 완료되어 종료할 수 없는 패턴이 많이 나타납니다.따라서 현재 퇴출은 사람이 적은 시기와 어떤 이유로 일치하지 않는 경우 조작할 수 없도록 포지셔닝된 구제조치로 입실 몇 초 만에 퇴출될 수 있다.

중복 비활성 방지


또 하나는 홀 안의 아이돌이 반복되는 것을 방지하는 것이다.
'다함께 콘서트'에서는 각 유저가 아이돌을 선정해 매칭하기 때문에 매칭만 하면 같은 아이돌이 여러 개 있는 홀이 나온다.따라서 xread의 홀 안에 같은 아이돌이 없으면 일치하고 중복이 있으면 이 홀은 바로 다음 홀xadd로 흐른다.여러 번 반복을 통해 가능한 한 중복을 방지하지만 매칭 시간이 많이 걸리지 않도록 홀을 찾지 않으면 단원으로 편성된 다음 아이돌을 뽑아 매칭을 성립시킬 수 있다.

총결산


현재는 복잡한 일치 논리가 없고 거의 모든 패턴이 대기열에서 추출되기 때문에 평균 1초 이하 5명의 일치가 완성된다.
여기까지는 글로 설명했으니까 그림으로 정리해 보자.Redis Streams 섹션을 대기열로 처리할 수 있다면 무엇이든 가능합니다.

개인 홀



'다함께 콘서트'는 최근 개인 홀을 공개할 예정이다.개인 홀에서 ID 공유를 통해 지인들과 어울려 놀 수 있는 기능이다.우선 이쪽의 설치를 소개하고 싶습니다.개발 중인 정보이기 때문에 규격 등이 변경될 수 있다.

전용 구멍 일치


개인 로비에서는 로비 ID 이외에도 공유용 ID가 발행되어 이 공유용 ID를 기반으로 하는 키로 Redis에 저장된다.로비에 들어간 사용자는 이 공유용 ID에 따라 요청을 보내고 Redis에서 꺼내서 방에 들어가 처리하며 다시 같은 키로 Redis에 설정합니다.
개인 로비에서 센터의 유저를 로비 마스터로 처리하면 로비 마스터는 로비 멤버를 확정하고 콘서트를 시작할 수 있다.이 확인 요청을 받으면 전용 구멍의 Redis 키에서 꺼내서 일반적인 것과 동일한 형식으로 Redis에 저장합니다.그 다음은 일반적인 일치에서 실황 녹음을 하는 것과 같은 절차다.

개인 홀에서 반복해서 틀어요.


개인 로비의 실황 녹음에 대해 같은 유저들 사이에서 실황 녹음을 반복할 수 있도록 실황 녹음을 한 후 다시 같은 로비의 일치하는 화면으로 옮긴다.반복해서 놀 때는 공유용 ID를 직접 사용할 수 있다.
이것은 실황 녹음 후 개인 로비에서 Redis로 저장된 데이터를 다시 얻을 수 있다는 것을 통해 이루어진 것이다.하지만 디자인상 내부 값의 로비 ID를 사용하면 불편하기 때문에 로비 주인이 유저를 확정할 때 로비 ID만 새로 발매한다.이렇게 하면 같은 공유용 아이디로 여러 번 놀 수 있지만 내부는 콘서트마다 다른 로비로 처리할 수 있다.
이런 설치이기 때문에 로비 멤버가 확정된 후 방에 들어온 유저가 있어도 이 유저는 다음 콘서트의 로비 ID에 분배된 데이터를 얻는다.따라서 현재의 실황 녹음에 영향을 주지 않고 기다리면 다른 유저들도 돌아와서 다음부터 참여할 수 있다.(※ 시간이 지나면 차단될 수 있음)

총결산


특별히 복잡하지는 않지만 개인 로비에 대한 일치 절차도 그림으로 정리된다.

총체적 총결산


이 기사는 당신의 스타를 사칭합니다!!음악의'여러분 실황 녹음'의 일치된 실현을 소개했다.일치 논리에 관해서는 이 설치가 완벽하지는 않을 수도 있지만, 설치 시간과 일치 속도는 발표된 후의 느낌상 그렇게 나쁘지 않을 수도 있다.

구성원을 모집하다


Happy Elements 주식회사 카카리아스타지오에서
[열광적으로 사랑받는 콘텐츠]를 함께 만들 멤버를 모집하고 있습니다!
만약 당신이 우리 회사에 흥미가 있다면, 반드시 한 번 가십시오
아래의 채용 사이트를 보십시오.
웹 페이지 정보

좋은 웹페이지 즐겨찾기