Serviço de Informação

underconstruction.gif (252 bytes)

AISC 1999-2000 (Desenvolvimento)


Objectivos

Esta entidade pretende disponibilizar ao sistema em geral (outras entidades), uma forma simples, transparente e minimamente coerente de gerir a informação pública do sistema. Há quem chame a este tipo de entidades, Facilitators.

As entidades do sistema são responsáveis pela publicação e coerência da sua informação pública, excepto no que se refere à sua localização. Ou seja, assim que as entidades aderem ao serviço de informação, a sua localização é armazenada e disponibilizada a quem o desejar. Assim que a entidade deixar o sistema, a sua localização e demais informação entretanto publicada é apagada do serviço, e portanto não será mais disponibilizada a outras entidades.

No sentido de organizar o próprio serviço de informação, bem como sugerir regras de gestão da informação por parte da entidade aderente, o serviço de informação é dividido por domínios de informação. O conceito de domínio é genérico e versátil, mas pretende ser o agrupamento de informação dum determinado tipo. Por exemplo, poder-se-ía pensar em informação referente a bancos, ao comércio de computadores ou comérico de carros, etc., sendo portanto necessário a implementação de rotinas de armazenamento e manipulação da informação consoante o domínio.

O serviço de informação é composto por dois tipos de entidades, os servidores e os clientes. Cada servidor de domínio tem conhecimento da existência e localização de todos os outros. Este conhecimento é dinâmico e é adquirido através dum processo de contacto ou conexão semelhante à conexão do cliente.

Índice


Informação

A informação é armazenada internamente no seguinte formato:

{Name_Node, Pid, Information}

	Name_Node={atom(),node()}	% do cliente
	Pid=pid()			% do cliente
	Information=[Category]
	Category={atom(),[Activity]}
	Activity={atom,[atom()]}

Um exemplo:

{
   {client1,node1@@host1},<xx.yy.zz>,
   [
      {business,
         [
            {sell,[computadores,informatica]},
            {repair,[computadores]}
         ]
      },
      {personal,
         [ {sport,[squash,football]} ]
      }
   ]
}

Índice


Conversações

Índice


Interface

Índice

Servidor

Para se lançar um servidor Infsys há que ter em consideração os seguintes pontos:

Ou seja, cada servidor Infsys deve especificar:

infsys:start([Args]) -> ok | {error,Reason}
	Args=Name | Domain
	Name={name, atom()}				% default=infsys
	Domain={domain,[Domain_options]}
	Domain_options= Domain_name | Domain_timeout | Client_timeout
			Brodcast_port | Broadcast_contact |
			Domain_static_connections |
			Domain_dynamic_connections
	Domain_name={domain_name,atom()}		% default=infsys
	Domain_timeout={domain_timeout,integer()}	% default=5000ms
	Client_timeout={client_timeout,integer()}	% default=10000ms
	Broadcast_port={broadcast_port,Port_num}
	Port_num=integer() % 1024 < Port_num < 65535	% default=15000
	Broadcast_contact={broadcast_contact,accept|reject}	% default=accept
	Domain_static_connections={static_connections,Static_connections_options}
	Static_connections_options=none|[Name_Node]	%default=none
	Domain_dynamic_connections={dynamic_connections,yes|no}	%default=yes
	Name_Node={Name,Node}
	Name=atom()
	Node=node()
	Reason=atom()
infsys:start() -> ok | {error, Reason}
	Reason=atom()

Nota: Pressupõe-se que todos os parâmetros necessários estão definidos no dicionário ou são usados os valores por defeito.

Conexão

As entidades que desejem aderir ao serviço têm dois métodos possíveis:

infsys_client:connect([Domain_args]) -> Name_Node | {error,Reason}
	Domain_args=Domain_name | Domain_timeout | Domain_server
	Domain_name={domain_name,atom()}	% default=infsys
	Timeout={domain_timeout,integer()}	% default=10000ms
	Domain_server=Name_Node
	Name_Node={Name,Node}
	Name=atom()
	Node=node()
	Reason=atom()
infsys_client:connect() -> Name_Node | {error,Reason}

Nota: Pressupõe-se que todos os parâmetros necessários estão definidos no dicionário ou são usados os valores por defeito.

infsys_client:contact([Domain_args]) -> Name_Node | {error,Reason}
	Domain_args=Domain_name | Domain_broadcast_port |
		    Domain_timeout
	Domain_name={domain_name,atom()}	% default=infsys
	Domain_broadcast_port={domain_broadcast_port,Port_num}
	Port_num=integer()		% 1024 < Port_num < 65535  default=15000
	Timeout={domain_timeout,integer()}	% default=10000ms
	Name_Node={Name,Node}
	Name=atom()
	Node=node()
	Reason=atom()
infsys_client:contact() -> Name_Node | {error,Reason}

Nota: Pressupõe-se que todos os parâmetros necessários estão definidos no dicionário ou são usados os valores por defeito.

Nota 1: Os valores de domain_name, domain_server, domain_broadcast_port e domain_timeout, podem também ser previamente colocados do dicionário do processo.
Nota 2: A ordem de preferência de utilização dos valores será:

  1. Parâmetros da função;
  2. Se não existir parâmetro na função, usa-se o valor do parâmetro no dicionário;
  3. Se não existir o parâmetro no dicionário, usa-se o valor por defeito.

Nota 3: Os valores especificados/utilizados substituirão os valores anteriormente existentes no dicionário.

tras.gif (887 bytes)

Desconexão

Quando se deseja desconectar de um servidor de informação. Toda a informação referente à entidade que se desconecta é apagada do serviço e como tal não é mais disponibilizada.

infsys_client:disconnect(Domain_server) -> ok | {error,Reason}
	Domain_server=Name_Node
	Name_Node={Name,Node}
	Name=atom()
	Node=node()
	Reason=atom()
infsys_client:disconnect() -> ok | {error,Reason}

Nota: Pressupõe-se que todos os parâmetros necessários estão definidos no dicionário ou são usados os valores por defeito.

tras.gif (887 bytes)

Publicar

Esta função adiciona à informação do cliente, a informação especificada em What. A informação adicionada é automaticamente disponibilizada para o domínio.

infsys_client:publish(What) -> ok | {error,Reason}
	What={Category,Activity,Items}
	Category=atom()	% ex.: business, study, hobby, personal
	Activity=atom() % ex.: business:sell|buy|repair|bank, hobby:sport, personal:watch_tv
	Items=[atom()] | atom()	% ex.: sell:computer, repair:computer, bank:credit
	Reason=atom()

tras.gif (887 bytes)

Perguntar

Estas funções servem para questionar o sistema de informação. O servidor a quem o cliente está conectado, é responsável por procurar a informação no domínio e disponibilizar ao cliente sem que este intervenha.

O servidor a contactar deverá estar previamente definido na entrada do dicionário infsys. Ou seja, a função put(infsys, Name_Node) deverá em devido tempo ser executada, sendo Name_Node o valor retornado por contact ou connect. Assim sendo, o cliente poderá fazer a gestão interna de domínios com quem "funciona".

infsys_client:whereis(Who) -> [Location] | {error,Reason}
	Who=atom() | [atom()]
	Location={Who,Node}
	Node=node() | undefined
	Reason=atom()

Nota: Parte-se do princípio que Who apenas existe numa localização e que apenas um servidor de domínio lhe está conectado. Assim, depois de receber a localização de Who diferente de undefined não pergunta aos restantes servidores.

infsys_client:whodoes(What) -> {What,[Name_Node]} | {error,Reason}
	What= (ver infsys_client:publish/1)
	Name_Node={Name,Node}
	Name=atom()
	Node=node()
	Reason=atom()

Nota: Como podem existir várias entidades a realizar a mesma actividade, e que podem estar conectadas a diferentes servidores de informação, então a pergunta tem de ser realizada a todas as entidades, e apenas o conjunto de informação recebido é correcto e completo. Assim, a pergunta é feita a todos os servidores do domínio.

infsys_client:'query'(What,Type) -> {What,[Name_Node]} | {error,Reason}
	What= (ver infsys_client:publish/1)
	Type= all | first
	Name_Node={Name,Node}
	Name=atom()
	Node=node()
	Domain=atom()
	Reason=atom()

Nota 1: Esta função é disponibilizada para que a conversação seja utilizada para qualquer tipo de informação e pergunta. Na realidade whereis e whodoes utilizam a função 'query'. Não deve ser utilizada directamente.
Nota 2: Em comparação com as funções anteriores, esta tem mais um parâmetro. Este parâmetro serve para especificar se o serviço de informação deve pesquisar todos (all) os outros servidores existentes no domínio e juntar toda a informação, ou se deve pesquisar apenas (first) até encontrar um que devolva o resultado diferente de {What,undefined}.

tras.gif (887 bytes)

Apagar

Esta função apaga à informação do cliente, a informação especificada em What.

infsys_client:delete(What) -> ok | {error,Reason}
	What= (ver infsys_client:publish/1)
	Reason=atom()

tras.gif (887 bytes)Índice


Última actualização: 02-05-2005

AISC 1999-2000 (Desenvolvimento)