carlos eduardo benevides bezerra cmp167 cmp167 – programação com objetos distribuídos b p2pse...

21
1 Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B Trabalho Final: Implementação do suporte a múltiplos servidores na biblioteca P2PSE P2PSE CMP167 – Programação com Objetos Distribuídos B CMP167 – Programação com Objetos Distribuídos B Implementação do suporte a múltiplos servidores na biblioteca P2PSE P2PSE Carlos Eduardo Benevides Bezerra Orientador: Cláudio Fernando Resin Geyer Universidade Federal do Rio Grande do Sul Instituto de Informática Grupo de Processamento Paralelo e Distribuído

Upload: nina-alencastre-mangueira

Post on 07-Apr-2016

226 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 2: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 3: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 4: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 5: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 6: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 7: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 8: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 9: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 10: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 11: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 12: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 13: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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)

Page 14: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 15: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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

Page 16: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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);

Page 17: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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);

Page 18: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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);

Page 19: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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);

Page 20: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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);

Page 21: Carlos Eduardo Benevides Bezerra CMP167 CMP167 – Programação com objetos distribuídos B P2PSE Trabalho Final: Implementação do suporte a múltiplos servidores

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/