carlos eduardo benevides bezerra cmp167 cmp167 – programação com objetos distribuídos b p2pse...
TRANSCRIPT
1Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
CMP167 – Programação com Objetos Distribuídos BCMP167 – Programação com Objetos Distribuídos B
Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Carlos Eduardo Benevides BezerraOrientador: Cláudio Fernando Resin GeyerUniversidade Federal do Rio Grande do SulInstituto de InformáticaGrupo de Processamento Paralelo e Distribuído
2Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
SumárioSumário
• Jogos massivamente multijogador (MMOG)
• Soluções tradicionais para suporte a MMOG (servidor super-dimensionado)– Vantagens e desvantagens
• Soluções descentralizadas– P2P
• A P2PSEP2PSE
• O suporte a multi-servidor
• Arquitetura implementada
• O código (API) + começar pelo código que dá as funcionalidades básicas da api+ explicar o que foi adicionado
3Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Jogos massivamente multijogadorJogos massivamente multijogador
• Massively multiplayer online games (MMOG)– Rede de comunicação utilizada em geral é a Internet– Suporte a grande número de jogadores simultaneamente– Mesmo espaço virtual– Suporte a estado persistente
• Exemplo: World of WarcraftWorld of Warcraft– Mundo virtual de “fantasia medieval”, no estilo RPG (maioria dos
produtos comerciais atualmente)– Mais de 5 milhões de assinantes– Dezenas, até centenas de milhares de jogadores online
simultaneamente
4Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Soluções tradicionais para suporte a MMOGSoluções tradicionais para suporte a MMOG
• Utilização de um grande servidor super-dimensionado– Costuma ser caro
• Hardware para tal servidor é de alto custo• Link de comunicação com dezenas de GBps
• Arquitetura cliente/servidor– Clientes enviam comandos, que são processados pelo servidor– Servidores enviam atualizações de estado para os clientes– Simulação executada no servidor, que impede trapaça
• Exemplo:– Clusters de servidores de World of WarcraftWorld of Warcraft
• Cada cluster é um realm independente• Cluster distribuídos geograficamente• Cada cluster suporta dezenas de milhares jogadores simultâneos
5Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Vantagens e desvantagens da arquitetura cliente/servidorVantagens e desvantagens da arquitetura cliente/servidor
• Vantagens– Fabricante mantém controle de acesso ao jogo– Tem grande resistência a trapaça– Não há grandes exigências do cliente
• Baixo processamento de simulação• Comunicação restrita com o servidor
– Simplicidade de implementação
• Desvantagens– Todo o custo de processamento e comunicação recai
sobre o servidor– Risco de haver recursos insuficiente ou excessivos
para o servidor– Inviável para empresas de menor porte
6Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Soluções descentralizadasSoluções descentralizadas
• Motivação– Desonerar o servidor– Distribuir carga de processamento e comunicação
com os clientes– Ideal: tornar o jogo independente de servidores
• Problemas– Servidor não mais verificando a simulação do jogo– Risco de trapaça por parte dos clientes– Manutenção de um estado consistente de forma
distribuída
7Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Arquitetura alternativa a cliente/servidor: peer-to-peer (P2P)Arquitetura alternativa a cliente/servidor: peer-to-peer (P2P)
• Arquitetura cliente/servidor• Simulação no servidor
• Arquitetura P2P• Simulação nos clientes
8Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
O projeto P2PSEO projeto P2PSE
• Exploração do modelo de instâncias– Guild Wars– Divisão do mundo virtual em dois ambientes:
• Social• De ação
• Solução híbrida– Ambiente social: cliente/servidor– Ambiente de ação: P2P
• Combina algumas vantagens dos dois modelos– Cliente/servidor:
• Controle de acesso ao jogo• Entidade central para gerenciar detecção de trapaça
– P2P:• Redução do custo de processamento do servidor• Redução do custo de comunicação do servidor
9Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Modelo do P2PSEModelo do P2PSE
10Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Arquitetura do P2PSEArquitetura do P2PSE
11Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Implementação do multi-servidorImplementação do multi-servidor
• Tornar o jogo mais escalável
• Divisão do mundo em vários espaços sociais independentes– Semelhante aos realms de World of WarcraftWorld of Warcraft
• Nova entidade: meta-servidor– Servidores são clientes do meta-servidor– Gerencia persistência
• De estado dos jogadores• De contas de usuário, autenticando• Da lista de servidores permitidos, autenticando
– Gerencia a adição de servidores ao jogo– Mantém uma lista dos servidores ativos– Redireciona clientes a servidores ativos
12Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Arquitetura do multi-servidorArquitetura do multi-servidor
13Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Características do modelo (1/2)Características do modelo (1/2)
• Arquitetura de três níveis:– Cliente, servidor, multi-servidor
• Cliente só precisa saber o endereço do meta-servidor– Meta-servidor retorna lista de servidores ativos
• Cliente deve efetuar login após conectar-se a um servidor
• Servidor encaminha pedidos de login para o meta-servidor, que confere os dados e retorna uma resposta
• Cada cliente só pode se conectar a um servidor por vez (conta de usuário é travada no meta-servidor)
14Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Características do modelo (2/2)Características do modelo (2/2)
• Cada servidor tem um espaço social independente– Espaços sociais disjuntos
• Clientes conectados em servidores diferentes não podem jogar um contra o outro
• Meta-servidor armazena o estado persistente de todos os jogadores
• Cada servidor, ao ser criado, precisa se conectar ao meta-servidor e se autenticar– Meta-servidor pode rejeitar servidores que tentem conectar-se a
ele
15Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Implementação (1/?)Implementação (1/?)
• Utilizada linguagem orientada a objetos C++– Criados mais de 30 métodos para a API e uma nova
classe (metaserver), além da extensão de diversos métodos pré-existentes:
• total de mais de 1700 LOC, fora a aplicação de teste
• Utilização das libs HawkNL e zig, que são utilizadas por padrão pela P2PSE
• Cliente, servidor e meta-servidor modelados como objetos:– P2pseClient– P2pseServer– P2pseMetaServer
16Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Implementação – P2pseClient (2/?)Implementação – P2pseClient (2/?)
• Métodos da classe P2pseClient:– bool connectToMetaServer(string metaServerAddressString, bool retrial = false);– bool askMetaServerForServers();– bool DisconnectFromMetaServer();– void loginOnServer (string userName, string password);– void SendStateToServer (buffer_c* stateData);– void LogoutFromServer ();
• Funções de callback de P2pseClient:– virtual void connectedToMetaServerOK (void);– virtual void connectedToMetaServerFAIL (void);– virtual void DisconnectedFromMetaServerOK (void);– virtual void receivedListOfServers (std::list<string*> server_list);– virtual void LoggedInOK (void);– virtual void LoggedInFAIL (unsigned short msgType);– virtual void SendStateOK (void);– virtual void SendStateFAIL (void);– virtual void LoggedOutOK (void);
17Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Implementação – P2pseServer (3/?)Implementação – P2pseServer (3/?)
• Métodos da classe P2pseServer:– bool connectToMetaServer
(string metaServerAddressString, bool retrial = false);– bool DisconnectFromMetaServer ();– bool SendAuthInfo
(string myAddressString, unsigned long key);– void ForwardUserAuthReq
(int p2pseClientId, buffer_c* userAuthReq);– void ForwardUserLogoutReq (int p2pseClientId);– void ForwardUserAuthOK
(string userName, int p2pseClientNum); – void ForwardUserAuthFAIL
(int p2pseClientNum, unsigned short msgType);– void ForwardUserData
(int p2pseClientId, buffer_c* userData);– void ForwardUserDataOK
(int p2pseClientId, string userName);– void ForwardUserDataFAIL (int p2pseClientId);– void ForwardUserLogoutOK
(int p2pseClientId, string userName);– void SendLogoutToAllUsers (void);
18Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Implementação – P2pseServer (4/?)Implementação – P2pseServer (4/?)
• Funções de callback de P2pseServer:– virtual void connectedToMetaServerOK (void);– virtual void connectedToMetaServerFAIL (void);– virtual void DisconnectedFromMetaServerOK (void);– virtual void AuthorizedByMetaServerOK (void);– virtual void AuthorizedByMetaServerFAIL (void);– virtual void ReceivedUserLoginReq
(int p2pseClientId, buffer_c* loginMsg);– virtual void ReceivedUserLogoutReq (int p2pseClientId);– virtual void ReceivedUserData
(int p2pseClientId, buffer_c* dataMsg);– virtual void UserDataConfirmedByMeta
(string userName, int p2pseClientId);– virtual void UserAuthorizedByMetaServerOK
(string userName, int p2pseClientNum);– virtual void UserAuthorizedByMetaServerFAIL
(string userName, int p2pseClientNum, unsigned short msgType);– virtual void UserLoggedOutOK (int p2pseClientId, string userName);
19Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Implementação – P2pseMetaServer (5/?)Implementação – P2pseMetaServer (5/?)
• Métodos da classe P2pseMetaServer:– void AddServer (string& serverAddressString, unsigned long key);– void AddServer (const char* serverAddressString, unsigned long key);– void AddUser (string& userName, string userPassword);– void AddUser (const char* userName, string userPassword);– void ProcessNonBlocking (void);– void AllowServer( int source, string serverAddress);– void DenyServer (int source);– void AllowClient (string userName, int p2pseserver, int
p2pseclient);– void DenyClient
(string userName, int p2pseserver, int p2pseclient, unsigned short msg_type);
– void AckUserData(int p2pseserver, int p2pseClientId, string userName);
– void AckDisconnection (int source);– void LogUserOut
(int p2pseserver, int p2pseClientId, string userName);
20Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
Implementação – P2pseServer (6/?)Implementação – P2pseServer (6/?)
• Funções de callback de P2pseMetaServer:– virtual bool ReceivedServerAuthReq
(int client, string server_addr, unsigned long key);
– virtual bool ReceivedStdUserAuthReq(int client, int p2pse_client, string userName, string userPwd);
– virtual void ReceivedUserStateData(int client, int p2pseClientId, string userName, buffer_c* userData);
– virtual void ReceivedUserLogoutReq(int client, int p2pseClientId, string userName);
– virtual void ServerDied (int server);
– virtual void HandleMessage (buffer_c* message, int client);
21Carlos Eduardo Benevides Bezerra CMP167CMP167 – Programação com objetos distribuídos B
Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSEP2PSE
ReferênciasReferências
• CECIN, Fábio; GEYER, Cláudio. Projeto P2PSE - Middleware de suporte a jogos maciçamente multijogador (MMOGs). WSPPD, 2006.
• CECIN, Fábio; GEYER, Cláudio. P2PSE project: partially decentralized simulation for instanced MMOGs. WSPPD, 2006.
• HawkNL (Hawk Network Library) – disponível em: http://www.hawksoft.com/hawknl/
• ZIG Game Engine – disponível em: http://zige.sourceforge.net/