================================================================================ * 길드 시스템 ================================================================================ - 프로토콜 * Protocol.Guild : 길드 데이터에 대한 프로토콜 데이터 객체 * PlayerCache : 플레이어 캐시 데이터 - 서버 * Server.Guild : 서버에서 사용할 길드 데이터. Protocol.Guild의 내용을 포함하며, 서버에서 다룰 때 편의를 위한 API나 추가적인 멤버 변수들을 포함한다. * - RDB (MySQL) * `eod_community`.`table_guild` : 길드 자체에 대한 정보를 가지고 있는다. * `eod_community`.`table_guild_membership` : 길드 멤버 가입에 대한 정보들을 가지고 있는다. * `eod_community`.`table_guild_join_request` : 길드 가입 신청 정보들을 가지고 있는다. -> 이건 Redis로 빼도 될 듯... * `eod_community`.`table_guild_skill` : 길드 스킬에 대한 정보들을 가지고 있는다. - In Memory DB (Redis) * PlayerCache : 플레이어의 현재 정보를 캐시한다. (json으로 캐시) key = guildId : ulong, value = PlayerCache to JSON : string * Protocol.Guild : 길드의 정보를 캐시할 때는, 이 객체를 기준으로 하여 캐시한다. (json으로 캐시) key = guildId, value = Protocol.Guild to JSON * GuildExperience : 각 플레이어들이 길드의 경험치를 올릴 때 사용하는 객체. 길드 경험치는 길드원들의 GuildExperience 객체들에 모인 경험치를 반영하여 계산한다. key = guildId : ulong, hashKey = memeberPlayerId : ulong, value = gainExperience : long * 그 외 길드 관련 누적 포인트들 : 여러 길드 멤버들이 각자 모아서 길드에 쌓는 수치인 경우, GuildExperience의 방식과 동일하게 구현한다. - 데이터 가져오기 * 서버는 주기적으로 Redis의 길드 데이터와 MySQL의 길드 데이터를 동기화한다. : 기준은 항상 MySQL 우선이다. * 서버에서 길드 정보를 가져올 때는, 우선 Redis에서 관련 정보를 찾는다. * Redis의 데이터들은 없는 경우, MySQL에서 찾는다. : 그래도 없으면 진짜 없는 것임 - 데이터 갱신 * 데이터 갱신 순서는 항상 MySQL -> Redis -> 서버의 순서이다. * Redis가 연결이 되지 않는 경우에는 Redis 갱신은 넘어갈 수 있어야 한다. : 다만, MySQL에 대한 갱신은 절대로 넘어가지 못한다. * 길드에 있어 중요한 데이터들, 즉, 길드 이름 / 휘장 / 설명 변경, 길드원 변경 사항들은 MySQL과 Redis를 동시에 갱신한다. : 이들은 자주 갱신하는 데이터가 아니며, 갱신 여부가 날아가면 안 되는 중요한 정보들이므로 MySQL에도 즉각적으로 갱신이 들어가야 한다. * 포집하는 데이터들(길드 경험치 + 길드 경험치에 의한 레벨 정보, 가입 신청 목록, 길드원 각자 모아주는 길드 관련 포인트들)은 Redis에서 길드 정보의 캐시와는 별도로 캐시 정보를 유지해야 한다. - 그 외 * RDB에서 지나치게 잦은 접근을 막기 위해 비정규화하여 유지하던 데이터(`eod_.game`.`table_player`의 가입 길드 정보들)들은 전부 제거한다. (잘하면 가입한 길드의 ID 하나만 유지할 수도 있고...)