Tuesday, January 25, 2005
.NET Remoting, notas gerais
Existem dois tipos de objectos no mundo do Remoting, os objectos moveis e os objectos remotos.
Objectos Remotos
Na plataforma .NET entende-se por comunicação remota, comunicação entre appDomains.
Objectos Moveis
Estrutura geral de uma aplicação em .NET Remoting
Existem 3 componentes distintos:
Implementação do cliente
Os objectos remotos estão separados em duas categorias:
Server Activated Objects - SAO's
Existem dois tipos de objectos SAO, Singleton e SingleCall.
Se o objecto for criado como Singleton, no máximo,apenas existe uma instância desse objecto, que atende os pedidos de todos os clientes num cenário de concorrencia (é necessário tomar os cuidados correspondentes).
Estes objectos são stateful, ou seja existe manutenção do estado do objecto entre chamadas.
Nota: os objectos Singleton, são particularmente úteis quando se pretende partilhar um recurso entre vários clientes.
No modo SingleCall, é criado um objecto por chamada, que é destruido no final desta, não existindo assim manutenção de estado.
Uma razão para utilização deste tipo de objectos é a sua escalabilidade, que é consequencia destes objectos não necessitarem de manter estado, podendo assim estar espalhados por um conjunto de maquinas.
Publicação de objectos remotos
Por vezes é necessário que uma instância de um objecto já criada, esteja disponível remotamente. Para que isso seja possível é necessário publicar esse objecto da seguinte forma.
Client Activated Objects - CAO's
ainda tenho que estudar estes melhor :)
Tempo de vida dos objectos
Os objectos remotos na plataforma .NET são criados com um tempo de vida (TTL) (por omissão é 5m), que é incrementado por cada chamada efectuada ao objecto (por omissão é 2m).
Quando o TTL termina a plataforma procura por objectos sponsor associados ao objecto remoto. Se não existirem sponsors associados ao objecto, ou o sponsor decidir que o TTL não é para ser renovado, o objecto remoto é marcado para ser garbage collected.
Algum cliente que ainda possua uma referência para o objecto e efectue uma chamada, recebe uma excepção.
Nota: Só têm o campo TTL objectos Singleton ou objectos CAO.
Nota2: Tenho que estudar melhor os sponsors.
Tipos de Evocação
Existem três tipos de evocação:
Neste tipo de chamadas o cliente fica bloqueado até o servidor ter terminado a tarefa. Alguma excepção ocorrida do lado do servidor é lançada na linha de onde o método foi chamado.
Chamadas assincronas
São efectuadas em duas fases:
Chamadas assincronas one way
São iguais às chamadas assincronas, mas não permitem receber o retorno dos métodos.
Existem dois tipos de objectos no mundo do Remoting, os objectos moveis e os objectos remotos.
Objectos Remotos
- são objectos cujos métodos são executados num appDomain diferente daquele onde foi iniciada a chamada,
- permanecem sempre no servidor, sendo apenas passadas referencias para ele.
Na plataforma .NET entende-se por comunicação remota, comunicação entre appDomains.
Objectos Moveis
- são objectos seriáveis,
- são passados por cópia, sendo que as operações efectuadas sobre ele ocorrem sempre no appDomain do chamador,
- não existe troca de mensagens com o appDomain de onde o objecto é originário,
- é um objecto completamento distinto do original.
Estrutura geral de uma aplicação em .NET Remoting
Existem 3 componentes distintos:
- Servidor, onde residem os objectos remotos.
- Cliente, quem efectua os pedidos.
- um assembly conhecido quer pelo cliente quer pelo servidor, que contém as interfaces dos objectos remotos, bem como a implementação dos objectos moveis que são trocados entre o cliente e o servidor.
- definir a interface remota,
- definir quais os objectos a serem passados entre cliente e servidor.
- implementar a interface remota,
- derivar de MarshalByRefObject,
- criar um canal,
HttpChannel chnl = new HttpChannel(1234);
- registar o canal,
ChannelServices.RegisterChannel(chnl);
- registar a classe do objecto como WellKnownService,
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(RemoteObject),
"RemoteObject.soap",
WellKnownObjectMode.Singleton);
Implementação do cliente
- criar e registar um canal,
HttpChannel channel = new HttpChannel();
ChannelServices.RegisterChannel(channel); - criar um proxy para o objecto remoto,
ICustomerManager mgr = (IRemoteObject) Activator.GetObject(
typeof(IRemoteObject),
"http://localhost:1234/RemoteObject.soap");
Os objectos remotos estão separados em duas categorias:
- Server Activated Objects (SAO)
- Client Activated Objects (CAO)
Existem dois tipos de objectos SAO, Singleton e SingleCall.
Se o objecto for criado como Singleton, no máximo,apenas existe uma instância desse objecto, que atende os pedidos de todos os clientes num cenário de concorrencia (é necessário tomar os cuidados correspondentes).
Estes objectos são stateful, ou seja existe manutenção do estado do objecto entre chamadas.
Nota: os objectos Singleton, são particularmente úteis quando se pretende partilhar um recurso entre vários clientes.
No modo SingleCall, é criado um objecto por chamada, que é destruido no final desta, não existindo assim manutenção de estado.
Uma razão para utilização deste tipo de objectos é a sua escalabilidade, que é consequencia destes objectos não necessitarem de manter estado, podendo assim estar espalhados por um conjunto de maquinas.
Publicação de objectos remotos
Por vezes é necessário que uma instância de um objecto já criada, esteja disponível remotamente. Para que isso seja possível é necessário publicar esse objecto da seguinte forma.
YourObject obj = new YourObject(Objectos publicados comportam-se como objectos Singleton.);
RemotingServices.Marshal(obj,"YourUrl.soap");
Client Activated Objects - CAO's
ainda tenho que estudar estes melhor :)
Tempo de vida dos objectos
Os objectos remotos na plataforma .NET são criados com um tempo de vida (TTL) (por omissão é 5m), que é incrementado por cada chamada efectuada ao objecto (por omissão é 2m).
Quando o TTL termina a plataforma procura por objectos sponsor associados ao objecto remoto. Se não existirem sponsors associados ao objecto, ou o sponsor decidir que o TTL não é para ser renovado, o objecto remoto é marcado para ser garbage collected.
Algum cliente que ainda possua uma referência para o objecto e efectue uma chamada, recebe uma excepção.
Nota: Só têm o campo TTL objectos Singleton ou objectos CAO.
Nota2: Tenho que estudar melhor os sponsors.
Tipos de Evocação
Existem três tipos de evocação:
- sincrona,
- assincrona,
- assincrona One Way.
Neste tipo de chamadas o cliente fica bloqueado até o servidor ter terminado a tarefa. Alguma excepção ocorrida do lado do servidor é lançada na linha de onde o método foi chamado.
Chamadas assincronas
São efectuadas em duas fases:
- o cliente efectua a chamada, não ficando bloqueado à espera do resultado,
- se o cliente quiser receber o valor de retorno do método chamado, tem que chamar outro método, este já bloqueante.
Chamadas assincronas one way
São iguais às chamadas assincronas, mas não permitem receber o retorno dos métodos.
Thursday, January 06, 2005
Notas sobre o tipo de objectos existentes em .NET Remoting
SAO - Server Activated Objects
CAO - Client Activated Objects
Notas adicionais:
Pesquisando nos acetatos de FSD sobre remoting, encontrei lá uma tabela que achei interessante transcrever para aqui, pois mostra as diferenças entre os diferentes tipos de objectos.
| SAO Singleton | SAO Single Call | CAO |
Manutenção de estado | Sim | Não | Sim |
Tempo de vida do objecto | Controlado pelo lease manager | Duração da chamada ao método | Controlado pelo lease manager |
Construtor
| Apenas sem parametros | Apenas sem parametros | Qualquer tipo de construtor |
SAO - Server Activated Objects
CAO - Client Activated Objects
Notas adicionais:
Para utilizar objectos CAO é necessário que o assembly com a implementação do objecto esteja do lado do cliente, em vez de conhecer apenas a interface como acontece nos objectos SAO, no entanto, esta limitação não é problematica no meu caso pois cada cliente, funciona ao mesmo tempo como servidor.
É possivel utilizar um soapsud (???) em vez do assembly. Tenho que investigar melhor se é vantajoso.
É necessário investigar como funciona o lease manager e quais são as suas opções de configuração.
É possivel utilizar um soapsud (???) em vez do assembly. Tenho que investigar melhor se é vantajoso.
É necessário investigar como funciona o lease manager e quais são as suas opções de configuração.
Notas para a implentação do protótipo do serviço de IM
Existem dois componentes:
- Um web service, onde a aplicação cliente efectua o login, e que tem conhecimento de quem está online e qual a sua localização.
- Um objecto remoto que está localizado na maquina do cliente, que funciona como caixa de mensagens.
A opção nesta altura é utilizar ligações directas entre os clientes, utilizando .net remoting com client activated objects (CAO).
Esta opção tem consequência serem utilizadas n ligações para conversar com n clientes diferentes, o que me parece razoavél pois não estão a ser gastos recursos de mais nenhum servidor.
Nota: ainda estou na duvida entre a utilização de objectos remotos CAO, ou server activated objects(SAO) em modo Singlecall. Pelo que percebi a diferença está na capacidade de manter estado e no tempo de vida do objecto.
Esta opção tem consequência serem utilizadas n ligações para conversar com n clientes diferentes, o que me parece razoavél pois não estão a ser gastos recursos de mais nenhum servidor.
Nota: ainda estou na duvida entre a utilização de objectos remotos CAO, ou server activated objects(SAO) em modo Singlecall. Pelo que percebi a diferença está na capacidade de manter estado e no tempo de vida do objecto.
Wednesday, January 05, 2005
Este site é interessante, porque tem todas aquelas coisas que perco horas à procura no msdn.
Já agora o que procurava era como obter o endereço ip da maquina de uma forma programatica. Como curiosidade:
//obter o nome da maquina
string host = Dns.GetHostName();
//obter os endereços atribuidos à maquina
IPHostEntry local = Dns.GetHostByName(host);
//atenção que podem existir mais do que 1
string enderecoIP = local.AddressList[0].ToString();
Já agora o que procurava era como obter o endereço ip da maquina de uma forma programatica. Como curiosidade:
//obter o nome da maquina
string host = Dns.GetHostName();
//obter os endereços atribuidos à maquina
IPHostEntry local = Dns.GetHostByName(host);
//atenção que podem existir mais do que 1
string enderecoIP = local.AddressList[0].ToString();