JavaFree.org | RubyOnBr.org

Variáveis de aplicação no RoR

Acompanhar Variáveis de aplicação no RoR 26 posts, 9 participantes

Páginas: 1 2

Avatar Urubatan 165 posts

Existe algum tipo de variáveis de aplicação no RoR?
Tipo, uma variável que se eu alterar em uma requisição, a próxima requisição, mesmo sendo para outra instância do fcgi veja esta alteração …
Ou a única forma é utilizar o banco de dados para isto mesmo?

 
Avatar Shairon Toledo 1428 posts

Já tentou ENV

 
Avatar Urubatan 165 posts

vou testar :D
mas acho que não vai rolar, pelo que testei isto altera o environment só de um processo :D

 
252944301_5b97e49932_t herval 275 posts

voce pode utilizar variaveis no ENV e $variaveis
@@variaveis_de_classe tambem ‘resistem entre requisicoes’, mas quando vc esta em modo development, ele reloada a classe a cada request, e o valor vai pro saco

 
Avatar Mereghost 1476 posts

Curiosidade tola: O que tu está tentando fazer, Urubatan?

 
202667 Henrique C. Alves 53 posts

“Tipo, uma variável que se eu alterar em uma requisição, a próxima requisição, mesmo sendo para outra instância do fcgi veja esta alteração …”

Ele quer comunicação inter-processo. Talvez trabalhando com socket à nível de Ruby, mas aí depende do que você tem em mente…

 
Avatar Shairon Toledo 1428 posts

ENV é carregada uma vez por cada interpretador.

 
Avatar Urubatan 165 posts

nada de importante na verdade, estou fazendo um exemplo de chat só …
e para armazenar os usuários online eu não queria usar o banco de dados, mas acabei fazendo isto.
em java por exemplo seria possível fazer
request.getServletContext().setAttribute(“nome”,valor) – que isto estaria disponível para toda a aplicação (é um escopo superior a session, a session esta disponível para todos os requests do mesmo usuário, o application esta disponível para todos os requests de todos os usuários)

No Rails isto é mais dificil de implementar por que são necessários vários processos para atender a aplicação, em java é um processo só e diversas threads :D

Mas acabei usando activerecord mesmo, um model de nome OnlineUser com atributos username, session_id, online e last_seen …
só tenho que garantir que vou limpar o banco para evitar que quando eu subir novamente a aplicação usuários que ja desapareceram do sistema faz tempo ainda apareçam como online
no caso do application como os dados ficariam em memória isto não seria problema …

 
Avatar Mereghost 1476 posts

Urubatan:

Nesse link[QuarkRuby] tem um trecho falando de como achar os usuários online pelas sessões mantidas no banco de dados.

Talvez isso te ajude (e o artigo todo, apesar de longo é ótimo).

 
Avatar Urubatan 165 posts

o que ele faz é utilizar a session em banco de dados, da quase na mesma do que com o active record como eu implementei :D
O exemplo de chat ta pronto ja, ja colei o código todo no blog, falta melhorar um pouco o texto, até amanha deve estar online o exemplo ja, ai vocês me dizem o que acharam :D

 
252944301_5b97e49932_t herval 275 posts

Urubatan, o ENV[] do rails é o equivalente ao ServletContext do JEE

 
Avatar Urubatan 165 posts

Herval, devo ter feito alguma coisa errada então, por que o que eu coloquei no ENV em um processo do fastcgi não estava acessivel a partir de outro processo do fastcgi.
vou testar novamente :D
valeus

 
A013c064de659bbff814eb1f4410446b?s=80 Clovis 783 posts

Eu acho que voce esta experienciando o que foi dito mais acima.. em modo: develoment, em cada requisicao todas as variaveis são zeradas.

tenta mudar pra production…

 
Avatar Akita On Rails 298 posts

Cuidado, o que vocês disseram é verdade: cada processo Ruby atende uma única requisição de cada vez. Um processo Java pode atender diversas requisições simultâneas porque internamente ele suporta multi-threading e o container servlet é, por definição, thread-safe.

Logo, manter objetos globais no nível do classloader local é possível. Em Ruby isso não é possível porque em produção rodamos vários processos em paralelo na mesma máquina, logo uma variável que muda num processo é invisível para o outro.

Isso não é uma desvantagem: ao guardar informações localmente como “variáveis globais” você acabou de limitar severamente a escalabilidade do seu aplicativo. Amanhã sua audiência cresce, você resolve colocar mais funcionalidades, etc e precisa de mais processamento. Bom, vamos colocar outra máquina: mas agora você não pode mais porque seu aplicativo é dependente do único processo onde ele roda.

É preferível serializar esses dados ou num banco de dados ou num file system. File system pode ainda dar problema de concorrência (duas requisições querendo gravar no mesmo arquivo ao mesmo tempo), mas ainda é menos ruim do que gravar em memória.

Lembrem-se: shared-nothing architecture. É assim que se escala na Internet.

 
Avatar Urubatan 165 posts

Akita, concordo que quando menos variáveis compartilhadas mais escalavel a aplicação, mas todas as soluções de cluster java compartilham também os escopos de sessão e aplicação entre os nõs do cluster (claro que utiliza banda de rede para isto, mas isto raramente é um gargalo, a não ser quando alguns programadores meia boca que eu ja conheci, resolveram que podiam armazenar conteúdo de um PDF inteiro na sessão multiplicando por milhares de usuários ferrou a escalabilidade e o trafego de rede entre os servidores do cluster que tinham que sincronizar esta tralha toda :D

Mas concordo que é possível utilizar bancos de dados para isto, e foi o que eu fiz no exemplo de chat que eu estava fazendo.
se alguem quiser dar uma olhada:

http://www.urubatan.com.br/um-exemplo-de-chat-com-ruby-on-rails-e-juggernaut-utilizando-ajax-push/

 
Ds054 Grinvon 130 posts

Ura,

Veja esse exemplo prático de como usar o ENV. Eu no caso o utilizo para “debug”:

 
Avatar Shairon Toledo 1428 posts

Isso me fez lembrar "desse post aqui ‘Chat em Ruby???’ ":http://forum.rubyonbr.org/forums/1/topics/1075

Só um off: Vocês sabiam que dá pra apontar uma thread, um fork ou IO no Rails via variáveis $globais ?!?

Como diria Ronie “Sempre há mais de uma maneira de esfolar o gato :)”

 
Avatar Urubatan 165 posts

Grinvon,
acho que você não entendeu, eu sei que se eu configurar algo no enviroment antes de iniciar a aplicação, todas as instancias terão acesso, mas no meu caso são dados dinâmicos
eu teria que alterar o env (ENV[“usuarios”] = [“usuario1”,…]) em uma instancia do fastcgi e todas as outras precisariam ver isto.
e é isto que não funciona
ou seja, ENV não é semelhante a ServletContext como foi dito, é só uma forma de ler variáveis de ambiente …

 
Ds054 Grinvon 130 posts

Você quer uma variável global a nível de contexto ou a nível de aplicação? Você quer trabalhar com variáveis globais?

 
Avatar Urubatan 165 posts

sim eu quero traalhar com variáveis globais a níbel de aplicação, uma variável global na verdade, a lista de usuários online do chat.
mas como não achei uma forma de fazer isto, estou usando o BD para isto mesmo.

 
Avatar Akita On Rails 298 posts

Essa é a forma correta mesmo, qualquer informação que precise ser compartilhada para múltiplos usuários SEMPRE deve ir em banco. Não existem variáveis globais entre multiplos processos de Ruby (e nem de nenhuma outra linguagem dinamica que dependa de múltiplos processos) e nem deveria haver mesmo porque o comportamento pode se tornar errático e imprevisível.

 
Avatar AndréBittencourt 36 posts

tenho o meu projecto com development, como faço para alterá-lo para production de um modo fácil e rápido???

 
Avatar AndréBittencourt 36 posts

ninguém sabe? =/

 
Avatar Shairon Toledo 1428 posts
script/server -e production 

ou dentro da aplicação

 
Avatar Mereghost 1476 posts

Ou muda a variável RAILS_ENV para production no seu environment.rb

Próxima página

Páginas: 1 2