Concrete Logo
Hamburger button

Implementando um sistema de fila assíncrona e mensagens com sidekiq e pusher em uma aplicação Rails

  • Blog
  • 15 de Fevereiro de 2013
Share

Todo desenvolvedor em algum momento já se deparou com a necessidade de ter processos assíncronos em determinada situação no desenvolvimento de uma aplicação. Isso ocorre quando é necessário executar mais de uma tarefa ao mesmo tempo, sem travar a interface do usuário e o servidor web.

Analise o seguinte cenário: Você precisa buscar posts, hashtags e usuários do Twitter com uma palavra chave e mostrar os dados em tempo real no browser sem que a página sofra um refresh. A aplicação precisa suportar receber várias buscas, uma seguida da outra e apresentar os resultados constantemente na tela.

Nesse caso, cada busca por uma palavra chave gera três requisições para a API do Twitter, uma para os posts, outra para as hashtags e outra para os usuários. Levando em consideração que o usuário poderá fazer buscas constantes sem precisar esperar o resultado da busca anterior ser apresentado para procurar por outra palavra chave, não podemos travar a interface com requests do browser. A solução é enviar cada busca (processo) para uma fila assíncrona (ou seja, onde um processo não depende do outro) que serão executados por um worker em segundo-plano (background jobs).

Hoje há diversas bibliotecas que permitem implementar conceito de fila em uma aplicação ruby. As mais utilizadas são Resque, Sidekiq e Delay_job. Redis é um banco de dados que persiste dados no formato key/value(como o Dynamo), com uma interface de rede embutida que usa protocolo TCP para conversar com o cliente. Assim como o Resque, o Sidekiq também usa Redis para gerenciar a fila de processos.

Já falamos anteriormente no blog sobre Redis e Resque, então fica a dica de leitura.

Com uma rápida introdução ao Sidekiq e ao Pusher será possível entender como os dois irão trabalhar juntos para solucionar o problema das buscas continuas e assíncronas.

Sidekiq é um eficiente processador de mensagens para ruby e será utilizado para disparar as buscas da aplicação (jobs) para uma fila e processá-las (perform). Depois que um job é disparado para uma fila e processado, é necessário enviá-lo de volta para o cliente (nesse caso, o navegador) que de alguma forma precisa estar esperando a resposta para renderizar e apresentar os dados ao usuário. Essa ação de espera do browser é feita utilizando Web Socket. Web Socket é uma tecnologia que permite a comunicação bidirecional por canais full-duplex sobre um único soquete TCP. Foi projetado para ser executado em browser e servidores web que suportem HTML5, mas também pode ser usado por qualquer cliente ou servidor de aplicativos.

Veja mais sobre Web Sockets com Erlang e com Node.js e Socket.io.

Pusher é uma API que adiciona funcionalidade escalável em tempo real para aplicações web e mobile. Pusher utiliza canais (channels) e eventos (events) para fazer a comunicação entre o servidor e o cliente. Será o responsável por receber os resultados que o Sidekiq processou e enviá-los para o browser em forma de mensagem através de um event em um channel. O browser estará conectado ao Pusher através do Web Socket e inscrito nesse channel (subscribe channel) esperando um determinado evento responder para renderizar os dados na tela.

Sem mais conceitos, let’s work!

Vou partir do princípio que você já possui o Redis instalado em seu ambiente. Se você não possuir, acesse o link https://redis.io/download e leia as instruções de instalação.

Crie uma aplicação rails sem banco de dados:

Não esqueça de remover o index.html da pasta public e comece adicionando a gem do Twitter ao Gemfile: Gemfile

Em seguida execute o. A API do Twitter v1.1 que é a mais recente no momento da publicação desse post, necessita de autorização OAuth para liberar o acesso, então será necessário ter um app registrado no Twitter, crie um em https://dev.twitter.com/apps. O Twitter pede url’s do aplicativo que irá consumir a API, utilize https://127.0.0.1 apenas como teste. Crie um arquivo twitter.rb em config/initializers e insira as configurações OAuth do app que você acabou de criar: config/initializers/twitter.rb

Agora que os dados necessários para acessar a API do Twitter estão configurados, crie um novo controller TwitterController em app/controllers/ com um método index e adicione uma rota de root no config/routes.rb:

app/controllers/twitter_controller.rb
config/routes.rb

É necessário criar uma pasta twitter em app/views/ com a view index.html.erb.

Para customizar as páginas será utilizado o Twitter Bootstrap, porém não irei abordar a instalação e utilização, pois foge ao escopo desse post, para mais informações veja a gem twitter-bootstrap-rails e a documentação.

Vou criar uma interface bem simples, apenas para ilustrar o nosso exemplo, com um formulário de busca e as divs para mostrar os resultados.

app/views/twitter/index.html.erb

Preste atenção no :remote => true que está sendo passado no form, ele é responsável por avisar o método search que o request está vindo de outra página e que será renderizado em outra view.

Agora crie um método no twitter_controller.rb chamado search que será o responsável por disparar os jobs para a fila do Sidekiq processá-los.

app/controllers/twitter_controller.rb

Crie uma rota no config/routes.rb para o método search:

config/routes.rb

* As rotas poderiam ser criadas com um resource, mas para simplificar vamos manter o root direcionando para o index e o search usando o get.

Com o método index e search criados, adicione a gem do Sidekiq e do Pusher no seu Gemfile:

Rode o bundle install e em seguida crie um arquivo pusher.rb em config/initializers/ para configurar o Pusher.

Para utilizá-lo você vai precisar criar uma conta, o plano básico é free. Acesse o link https://pusher.com/ para criar. Depois de criar a conta você irá receber um api_id, um hash key e um secret, que são os dados que você precisa para acessar a API do Pusher.

Insira os dados no arquivo pusher.rb(config/initializers/pusher.rb) :

Essa é a configuração necessária para inicializar o Pusher com os dados da API que você criou.

Para manter o ambiente organizado, crie uma pasta workers em app/ e dentro dela criei um arquivo twitter_worker.rb:

Em twitter_worker.rb crie uma class TwitterWorker e inclua na biblioteca do Sidekiq. Depois defina um método chamado perform passando dois parâmetros, o q (string da busca) e o search_type (tipo da busca, posts, hashtags, users).

app/workers/twitter_worker.rb

O método perform é o responsável por processar o job (acessar a API do Twitter e obter os dados da busca) e posteriormente enviar o resultado para o Pusher.

Agora prepare o método search do twitter_controller, para receber a string com a palavra chave digitada pelo usuário e chamar o worker para enviar o job (busca) para a fila.

app/controllers/twitter_controller.rb

Repare que você chama o worker três vezes, uma para cada tipo de busca. São três chamadas que serão enviadas para a fila e processadas no worker pelo Sidekiq.

Agora volte ao twitter_worker.rb para fazer a busca com a API do Twitter:

app/workers/twitter_worker.rb

Basicamente o código acima, aciona a API do Twitter com o método Twitter.search e Twitter.user_search passando o q (que contém a string que o usuário buscou) e passando um count (que é o número de posts que você irá mostrar). Mapeia o objeto JSON que o twitter retorna e monta um novo JSON apenas com os dados que você necessita.

Para finalizar o trabalho do worker, você precisa chamar o Pusher e enviar um evento para um determinado canal onde browser possa receber os dados.

Adicione a linha abaixo no final do método perform, ela será responsável por registrar um channel no Pusher com o nome de twitter-results, criar um evento com o tipo da busca (search_type) que foi realizada (posts, hashtags ou users), passando os resultados (result) e a string de busca (q) utilizada na busca.

Com o trabalho do worker pronto, você precisa preparar a view para receber os resultados. Criei um arquivo search.js.erb em app/views/twitter e deixe em branco, pois como é feita uma chamada em ajax para o método search, precisamos de um template js.erb para responder ao form com a tag :remote => true.

Insira a biblioteca javascript do Pusher e crie a chamada em ajax usando o jQuery para acionar o método search. Abra o arquivo app/views/layouts/application.html.erb e insira o seguinte:

Vamos analisar um pouco esse código e entender o que ele está fazendo:

Essa linha abre a conexão com a API do Pusher.

E aqui você assina (subscribe) o channel que criamos na classe TwitterWorker, pois é onde os eventos com cada resultado da busca serão registrados.

Na action submit do form, você dispara um evento que atribui o valor que o usuário digitou no campo de busca a uma variavel q, limpa o o campo de busca, faz uma chamada em ajax para o método search passando o q com a string da busca e no final dispara um return false para que o form não solicite um request.

Recapitulando, quando o usuário clica no submit do form, uma action é disparada e chama através do ajax o método search passando o parametro q que contém a palavra chave que o usuário digitou. O método search chama o worker que processa os jobs e envia os resultados para o Pusher através de um evento em um canal.

Por último e não menos importante, é necessário capturar os eventos que você disparou, pois são eles que irão receber os dados quando o worker enviar para o Pusher.

Analisando o código acima, sem falar sobre a forma como os dados são apresentados com o jQuery e sim dos eventos, a linha abaixo é a responsável por capturar um evento conhecido que foi disparado pelo worker.

Após capturar um evento, você precisa tratar os dados para renderizar na tela, parseando o JSON que o Pusher enviou percorrendo item a item do data.result:

Você pode trabalhar com eles da forma que achar melhor, aqui eles estão sendo distribuídos em uma ul.

Para rodar a aplicação, você precisa iniciar o Redis Server, o Sidekiq e por fim o Server Rails da aplicação.

Abra uma nova aba no console e inicie o Redis Server:

Em outra aba inicie o Sidekiq:

E por fim, inicie o Server Rails da aplicação:

Se você não alterou a porta padrão do server rails, a aplicação deve estar disponível em https://localhost:3000.

O código completo desse exemplo está disponível em: https://github.com/elvisnm/search-twitter-public.

Nesse exemplo utilizamos canais abertos, o Pusher vai bem além disso e fornece canais privados. Faça o teste, abra dois navegadores lado a lado e faça uma busca em um deles e verá o resultado aparecer em ambas as instâncias do browser. Isso ocorre porque o channel que estamos usando é aberto e não privado. Para conhecer mais sobre, acesse a documentação.

O post ficou um pouco extenso, mas ilustra bem a utilização e a integração de filas e mensagens em uma aplicação ruby. No próximo post, irei abordar canais privados e como implementá-los nesse mesmo exemplo.

Até a próxima!

Não esqueça de remover o index.html da pasta public e comece adicionando a gem do Twitter ao Gemfile: Gemfile

\n

Em seguida execute o. A API do Twitter v1.1 que é a mais recente no momento da publicação desse post, necessita de autorização OAuth para liberar o acesso, então será necessário ter um app registrado no Twitter, crie um em https://dev.twitter.com/apps. O Twitter pede url’s do aplicativo que irá consumir a API, utilize https://127.0.0.1 apenas como teste. Crie um arquivo twitter.rb em config/initializers e insira as configurações OAuth do app que você acabou de criar: config/initializers/twitter.rb

\n

\n

Agora que os dados necessários para acessar a API do Twitter estão configurados, crie um novo controller TwitterController em app/controllers/ com um método index e adicione uma rota de root no config/routes.rb:

\n

app/controllers/twitter_controller.rb
\nconfig/routes.rb

\n

É necessário criar uma pasta twitter em app/views/ com a view index.html.erb.

\n

Para customizar as páginas será utilizado o Twitter Bootstrap, porém não irei abordar a instalação e utilização, pois foge ao escopo desse post, para mais informações veja a gem twitter-bootstrap-rails e a documentação.

\n

Vou criar uma interface bem simples, apenas para ilustrar o nosso exemplo, com um formulário de busca e as divs para mostrar os resultados.

\n

app/views/twitter/index.html.erb
\n

\n

Preste atenção no :remote => true que está sendo passado no form, ele é responsável por avisar o método search que o request está vindo de outra página e que será renderizado em outra view.

\n

Agora crie um método no twitter_controller.rb chamado search que será o responsável por disparar os jobs para a fila do Sidekiq processá-los.

\n

app/controllers/twitter_controller.rb
\n

\n

Crie uma rota no config/routes.rb para o método search:

\n

config/routes.rb
\n

\n

* As rotas poderiam ser criadas com um resource, mas para simplificar vamos manter o root direcionando para o index e o search usando o get.

\n

Com o método index e search criados, adicione a gem do Sidekiq e do Pusher no seu Gemfile:
\n

\n

Rode o bundle install e em seguida crie um arquivo pusher.rb em config/initializers/ para configurar o Pusher.

\n

Para utilizá-lo você vai precisar criar uma conta, o plano básico é free. Acesse o link https://pusher.com/ para criar. Depois de criar a conta você irá receber um api_id, um hash key e um secret, que são os dados que você precisa para acessar a API do Pusher.

\n

Insira os dados no arquivo pusher.rb(config/initializers/pusher.rb) :
\n

\n

Essa é a configuração necessária para inicializar o Pusher com os dados da API que você criou.

\n

Para manter o ambiente organizado, crie uma pasta workers em app/ e dentro dela criei um arquivo twitter_worker.rb:

\n

Em twitter_worker.rb crie uma class TwitterWorker e inclua na biblioteca do Sidekiq. Depois defina um método chamado perform passando dois parâmetros, o q (string da busca) e o search_type (tipo da busca, posts, hashtags, users).

\n

app/workers/twitter_worker.rb
\n

\n

O método perform é o responsável por processar o job (acessar a API do Twitter e obter os dados da busca) e posteriormente enviar o resultado para o Pusher.

\n

Agora prepare o método search do twitter_controller, para receber a string com a palavra chave digitada pelo usuário e chamar o worker para enviar o job (busca) para a fila.

\n

app/controllers/twitter_controller.rb
\n

\n

Repare que você chama o worker três vezes, uma para cada tipo de busca. São três chamadas que serão enviadas para a fila e processadas no worker pelo Sidekiq.

\n

Agora volte ao twitter_worker.rb para fazer a busca com a API do Twitter:

\n

app/workers/twitter_worker.rb
\n

\n

Basicamente o código acima, aciona a API do Twitter com o método Twitter.search e Twitter.user_search passando o q (que contém a string que o usuário buscou) e passando um count (que é o número de posts que você irá mostrar). Mapeia o objeto JSON que o twitter retorna e monta um novo JSON apenas com os dados que você necessita.

\n

Para finalizar o trabalho do worker, você precisa chamar o Pusher e enviar um evento para um determinado canal onde browser possa receber os dados.

\n

Adicione a linha abaixo no final do método perform, ela será responsável por registrar um channel no Pusher com o nome de twitter-results, criar um evento com o tipo da busca (search_type) que foi realizada (posts, hashtags ou users), passando os resultados (result) e a string de busca (q) utilizada na busca.
\n

\n

Com o trabalho do worker pronto, você precisa preparar a view para receber os resultados. Criei um arquivo search.js.erb em app/views/twitter e deixe em branco, pois como é feita uma chamada em ajax para o método search, precisamos de um template js.erb para responder ao form com a tag :remote => true.

\n

Insira a biblioteca javascript do Pusher e crie a chamada em ajax usando o jQuery para acionar o método search. Abra o arquivo app/views/layouts/application.html.erb e insira o seguinte:
\n

\n

Vamos analisar um pouco esse código e entender o que ele está fazendo:

\n

Essa linha abre a conexão com a API do Pusher.
\n

\n

E aqui você assina (subscribe) o channel que criamos na classe TwitterWorker, pois é onde os eventos com cada resultado da busca serão registrados.
\n

\n

Na action submit do form, você dispara um evento que atribui o valor que o usuário digitou no campo de busca a uma variavel q, limpa o o campo de busca, faz uma chamada em ajax para o método search passando o q com a string da busca e no final dispara um return false para que o form não solicite um request.
\n

\n

Recapitulando, quando o usuário clica no submit do form, uma action é disparada e chama através do ajax o método search passando o parametro q que contém a palavra chave que o usuário digitou. O método search chama o worker que processa os jobs e envia os resultados para o Pusher através de um evento em um canal.

\n

Por último e não menos importante, é necessário capturar os eventos que você disparou, pois são eles que irão receber os dados quando o worker enviar para o Pusher.
\n

\n

Analisando o código acima, sem falar sobre a forma como os dados são apresentados com o jQuery e sim dos eventos, a linha abaixo é a responsável por capturar um evento conhecido que foi disparado pelo worker.
\n

\n

Após capturar um evento, você precisa tratar os dados para renderizar na tela, parseando o JSON que o Pusher enviou percorrendo item a item do data.result:
\n

\n

Você pode trabalhar com eles da forma que achar melhor, aqui eles estão sendo distribuídos em uma ul.

\n

Para rodar a aplicação, você precisa iniciar o Redis Server, o Sidekiq e por fim o Server Rails da aplicação.

\n

Abra uma nova aba no console e inicie o Redis Server:
\n

\n

Em outra aba inicie o Sidekiq:
\n

\n

E por fim, inicie o Server Rails da aplicação:
\n

\n

Se você não alterou a porta padrão do server rails, a aplicação deve estar disponível em https://localhost:3000.

\n

O código completo desse exemplo está disponível em: https://github.com/elvisnm/search-twitter-public.

\n

Nesse exemplo utilizamos canais abertos, o Pusher vai bem além disso e fornece canais privados. Faça o teste, abra dois navegadores lado a lado e faça uma busca em um deles e verá o resultado aparecer em ambas as instâncias do browser. Isso ocorre porque o channel que estamos usando é aberto e não privado. Para conhecer mais sobre, acesse a documentação.

\n

O post ficou um pouco extenso, mas ilustra bem a utilização e a integração de filas e mensagens em uma aplicação ruby. No próximo post, irei abordar canais privados e como implementá-los nesse mesmo exemplo.

\n

Até a próxima!

\n","protected":false},"excerpt":{"rendered":"

Todo desenvolvedor em algum momento já se deparou com a necessidade de ter processos assíncronos em determinada situação no desenvolvimento de uma aplicação. Isso ocorre quando é necessário executar mais […]

\n","protected":false},"author":1,"featured_media":4836,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[17],"tags":[357,358,172,222,72,359,44,360,361],"language":[],"custom_author":{"avatar":null,"name":null,"description":null},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts/4831"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/types/post"}],"author":[{"embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"replies":[{"embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?post=4831"}],"version-history":[{"count":0,"href":"https://www.concrete.com.br/wp-json/wp/v2/posts/4831/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/media/4836"}],"wp:attachment":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media?parent=4831"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/categories?post=4831"},{"taxonomy":"post_tag","embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/tags?post=4831"},{"taxonomy":"language","embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/language?post=4831"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]},"_embedded":{"author":[{"id":1,"name":"concrete","url":"","description":"","link":"https://www.concrete.com.br/author/concrete/","slug":"concrete","avatar_urls":{"24":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]}}],"replies":[[{"id":1423,"parent":0,"author":0,"author_name":"Paulo Patto","author_url":"","date":"2014-03-13T19:54:00","content":{"rendered":"

Great post guy!

\n"},"link":"https://www.concrete.com.br/2013/02/15/implementando-um-sistema-de-fila-assincrona-e-mensagens-com-sidekiq-e-pusher-em-uma-aplicacao-rails/#comment-1423","type":"comment","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/25cb83088139a8d7decdaf1bf4850671?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/25cb83088139a8d7decdaf1bf4850671?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/25cb83088139a8d7decdaf1bf4850671?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1423"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"embeddable":true,"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/4831"}]}}]],"wp:featuredmedia":[{"id":4836,"date":"2013-02-14T20:28:07","slug":"pusherwslogan","type":"attachment","link":"https://www.concrete.com.br/pusherwslogan/","title":{"rendered":"pusherwslogan"},"author":1,"caption":{"rendered":""},"alt_text":"","media_type":"image","mime_type":"image/png","media_details":{"width":1052,"height":453,"file":"2013/02/pusherwslogan.png","sizes":{"thumbnail":{"file":"pusherwslogan-150x150.png","width":150,"height":150,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-150x150.png"},"medium":{"file":"pusherwslogan-300x129.png","width":300,"height":129,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-300x129.png"},"medium_large":{"file":"pusherwslogan-768x331.png","width":768,"height":331,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-768x331.png"},"large":{"file":"pusherwslogan-1024x441.png","width":1024,"height":441,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-1024x441.png"},"lista-eventos":{"file":"pusherwslogan-477x247.png","width":477,"height":247,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-477x247.png"},"autor-post":{"file":"pusherwslogan-140x140.png","width":140,"height":140,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-140x140.png"},"thumb-relacionado":{"file":"pusherwslogan-250x250.png","width":250,"height":250,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-250x250.png"},"box-grande":{"file":"pusherwslogan-264x418.png","width":264,"height":418,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-264x418.png"},"box-pequeno":{"file":"pusherwslogan-263x219.png","width":263,"height":219,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-263x219.png"},"box-pequeno-2":{"file":"pusherwslogan-264x224.png","width":264,"height":224,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-264x224.png"},"full":{"file":"pusherwslogan.png","width":1052,"height":453,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan.png"}},"image_meta":{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0","keywords":[]}},"source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan.png","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media/4836"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/types/attachment"}],"author":[{"embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"replies":[{"embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?post=4836"}],"wp:term":[{"taxonomy":"language","embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/language?post=4836"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}],"wp:term":[[{"id":17,"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","slug":"engenharia-de-software","taxonomy":"category","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}],[{"id":357,"link":"https://www.concrete.com.br/tag/jquery/","name":"jquery","slug":"jquery","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/357"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=357"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":358,"link":"https://www.concrete.com.br/tag/pusher/","name":"pusher","slug":"pusher","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/358"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=358"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":172,"link":"https://www.concrete.com.br/tag/rails/","name":"rails","slug":"rails","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/172"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=172"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":222,"link":"https://www.concrete.com.br/tag/resque/","name":"Resque","slug":"resque","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/222"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=222"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":72,"link":"https://www.concrete.com.br/tag/ruby/","name":"ruby","slug":"ruby","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/72"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=72"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":359,"link":"https://www.concrete.com.br/tag/sidekiq/","name":"sidekiq","slug":"sidekiq","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/359"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=359"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":44,"link":"https://www.concrete.com.br/tag/twitter/","name":"twitter","slug":"twitter","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/44"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=44"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":360,"link":"https://www.concrete.com.br/tag/twitter-bootstrap/","name":"twitter bootstrap","slug":"twitter-bootstrap","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/360"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=360"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":361,"link":"https://www.concrete.com.br/tag/web-sockets/","name":"web sockets","slug":"web-sockets","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/361"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=361"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}],[]]},"embedded":{"author":[{"id":1,"name":"concrete","url":"","description":"","link":"https://www.concrete.com.br/author/concrete/","slug":"concrete","avatar_urls":{"24":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]}}],"replies":[[{"id":1423,"parent":0,"author":0,"author_name":"Paulo Patto","author_url":"","date":"2014-03-13T19:54:00","content":{"rendered":"

Great post guy!

\n"},"link":"https://www.concrete.com.br/2013/02/15/implementando-um-sistema-de-fila-assincrona-e-mensagens-com-sidekiq-e-pusher-em-uma-aplicacao-rails/#comment-1423","type":"comment","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/25cb83088139a8d7decdaf1bf4850671?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/25cb83088139a8d7decdaf1bf4850671?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/25cb83088139a8d7decdaf1bf4850671?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1423"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"embeddable":true,"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/4831"}]}}]],"wp:featuredmedia":[{"id":4836,"date":"2013-02-14T20:28:07","slug":"pusherwslogan","type":"attachment","link":"https://www.concrete.com.br/pusherwslogan/","title":{"rendered":"pusherwslogan"},"author":1,"caption":{"rendered":""},"alt_text":"","media_type":"image","mime_type":"image/png","media_details":{"width":1052,"height":453,"file":"2013/02/pusherwslogan.png","sizes":{"thumbnail":{"file":"pusherwslogan-150x150.png","width":150,"height":150,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-150x150.png"},"medium":{"file":"pusherwslogan-300x129.png","width":300,"height":129,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-300x129.png"},"medium_large":{"file":"pusherwslogan-768x331.png","width":768,"height":331,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-768x331.png"},"large":{"file":"pusherwslogan-1024x441.png","width":1024,"height":441,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-1024x441.png"},"lista-eventos":{"file":"pusherwslogan-477x247.png","width":477,"height":247,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-477x247.png"},"autor-post":{"file":"pusherwslogan-140x140.png","width":140,"height":140,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-140x140.png"},"thumb-relacionado":{"file":"pusherwslogan-250x250.png","width":250,"height":250,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-250x250.png"},"box-grande":{"file":"pusherwslogan-264x418.png","width":264,"height":418,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-264x418.png"},"box-pequeno":{"file":"pusherwslogan-263x219.png","width":263,"height":219,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-263x219.png"},"box-pequeno-2":{"file":"pusherwslogan-264x224.png","width":264,"height":224,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan-264x224.png"},"full":{"file":"pusherwslogan.png","width":1052,"height":453,"mime_type":"image/png","source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan.png"}},"image_meta":{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0","keywords":[]}},"source_url":"https://static.concrete.com.br/uploads/2013/02/pusherwslogan.png","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media/4836"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/types/attachment"}],"author":[{"embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"replies":[{"embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?post=4836"}],"wp:term":[{"taxonomy":"language","embeddable":true,"href":"https://www.concrete.com.br/wp-json/wp/v2/language?post=4836"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}],"wp:term":[[{"id":17,"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","slug":"engenharia-de-software","taxonomy":"category","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}],[{"id":357,"link":"https://www.concrete.com.br/tag/jquery/","name":"jquery","slug":"jquery","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/357"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=357"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":358,"link":"https://www.concrete.com.br/tag/pusher/","name":"pusher","slug":"pusher","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/358"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=358"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":172,"link":"https://www.concrete.com.br/tag/rails/","name":"rails","slug":"rails","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/172"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=172"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":222,"link":"https://www.concrete.com.br/tag/resque/","name":"Resque","slug":"resque","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/222"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=222"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":72,"link":"https://www.concrete.com.br/tag/ruby/","name":"ruby","slug":"ruby","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/72"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=72"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":359,"link":"https://www.concrete.com.br/tag/sidekiq/","name":"sidekiq","slug":"sidekiq","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/359"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=359"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":44,"link":"https://www.concrete.com.br/tag/twitter/","name":"twitter","slug":"twitter","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/44"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=44"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":360,"link":"https://www.concrete.com.br/tag/twitter-bootstrap/","name":"twitter bootstrap","slug":"twitter-bootstrap","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/360"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=360"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}},{"id":361,"link":"https://www.concrete.com.br/tag/web-sockets/","name":"web sockets","slug":"web-sockets","taxonomy":"post_tag","_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/361"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=361"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}],[]]},"parsedDate":"15 de Fevereiro de 2013","getAuthor":"concrete","getAuthorDescription":"

","getPostDescription":"\nTodo desenvolvedor em algum momento já se deparou com a necessidade de ter processos assíncronos em determinada situação no desenvolvimento de uma aplicação. Isso ocorre quando é necessário executar ...","getPostCategories":{"slug":["engenharia-de-software"],"id":[17],"name":["Desenvolvimento Web"]},"getPostTags":{"slug":["jquery","pusher","rails","resque","ruby","sidekiq","twitter","twitter-bootstrap","web-sockets"],"id":[357,358,172,222,72,359,44,360,361],"name":["jquery","pusher","rails","Resque","ruby","sidekiq","twitter","twitter bootstrap","web sockets"]},"getPostLanguage":"pt"},"postTerm":17,"relatedPosts":[{"date":"2012-10-26T11:03:35","custom_author":{"name":null,"description":null,"avatar":null},"getAuthor":"concrete","_embedded":{"replies":[[{"author_name":"Rafael Zaccanini","date":"2013-04-20T19:13:00","parent":0,"author_url":"http://www.facebook.com/rafaelzaccanini","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1252"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3751","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/10/26/implementando-comet-com-node-js-e-socket-io/#comment-1252","id":1252,"type":"comment","content":{"rendered":"

Muito bom cara, parabéns! Conhece o SignalR? bem bacana tbm! abs

\n"}}]],"author":[{"avatar_urls":{"24":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]},"name":"concrete","link":"https://www.concrete.com.br/author/concrete/","description":"","id":1,"url":"","slug":"concrete"}],"wp:term":[[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}]},"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","id":17,"taxonomy":"category","slug":"engenharia-de-software"}],[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=287"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/287"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/comet/","name":"comet","id":287,"taxonomy":"post_tag","slug":"comet"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=69"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/69"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/javascript/","name":"javascript","id":69,"taxonomy":"post_tag","slug":"javascript"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=313"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/313"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/node-js/","name":"Node.js","id":313,"taxonomy":"post_tag","slug":"node-js"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=314"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/314"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/socket-io/","name":"Socket.io","id":314,"taxonomy":"post_tag","slug":"socket-io"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=315"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/315"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/websockets/","name":"WebSockets","id":315,"taxonomy":"post_tag","slug":"websockets"}]],"wp:featuredmedia":[{"date":"2013-03-16T11:23:38","_links":{"replies":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?post=5593","embeddable":true}],"author":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1","embeddable":true}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/types/attachment"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media/5593"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media"}]},"author":1,"link":"https://www.concrete.com.br/nodejs-2/","caption":{"rendered":""},"type":"attachment","title":{"rendered":"nodejs"},"media_details":{"file":"2012/10/nodejs1.png","sizes":{"thumbnail":{"file":"nodejs1-150x150.png","mime_type":"image/png","width":150,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-150x150.png","height":150},"thumb-relacionado":{"file":"nodejs1-250x250.png","mime_type":"image/png","width":250,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-250x250.png","height":250},"box-pequeno":{"file":"nodejs1-263x219.png","mime_type":"image/png","width":263,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-263x219.png","height":219},"autor-post":{"file":"nodejs1-140x140.png","mime_type":"image/png","width":140,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-140x140.png","height":140},"lista-eventos":{"file":"nodejs1-477x247.png","mime_type":"image/png","width":477,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-477x247.png","height":247},"medium":{"file":"nodejs1-300x154.png","mime_type":"image/png","width":300,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-300x154.png","height":154},"box-grande":{"file":"nodejs1-264x270.png","mime_type":"image/png","width":264,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-264x270.png","height":270},"box-pequeno-2":{"file":"nodejs1-264x224.png","mime_type":"image/png","width":264,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-264x224.png","height":224},"full":{"file":"nodejs1.png","mime_type":"image/png","width":527,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1.png","height":270}},"image_meta":{"aperture":"0","copyright":"","orientation":"0","focal_length":"0","iso":"0","keywords":[],"caption":"","created_timestamp":"0","credit":"","camera":"","title":"","shutter_speed":"0"},"width":527,"height":270},"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1.png","alt_text":"","media_type":"image","mime_type":"image/png","id":5593,"slug":"nodejs-2"}]},"link":"https://www.concrete.com.br/2012/10/26/implementando-comet-com-node-js-e-socket-io/","title":{"rendered":"Implementando Comet com Node.js e Socket.io"},"embedded":{"replies":[[{"author_name":"Rafael Zaccanini","date":"2013-04-20T19:13:00","parent":0,"author_url":"http://www.facebook.com/rafaelzaccanini","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1252"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3751","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/10/26/implementando-comet-com-node-js-e-socket-io/#comment-1252","id":1252,"type":"comment","content":{"rendered":"

Muito bom cara, parabéns! Conhece o SignalR? bem bacana tbm! abs

\n"}}]],"author":[{"avatar_urls":{"24":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]},"name":"concrete","link":"https://www.concrete.com.br/author/concrete/","description":"","id":1,"url":"","slug":"concrete"}],"wp:term":[[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}]},"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","id":17,"taxonomy":"category","slug":"engenharia-de-software"}],[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=287"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/287"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/comet/","name":"comet","id":287,"taxonomy":"post_tag","slug":"comet"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=69"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/69"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/javascript/","name":"javascript","id":69,"taxonomy":"post_tag","slug":"javascript"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=313"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/313"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/node-js/","name":"Node.js","id":313,"taxonomy":"post_tag","slug":"node-js"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=314"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/314"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/socket-io/","name":"Socket.io","id":314,"taxonomy":"post_tag","slug":"socket-io"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=315"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/315"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/websockets/","name":"WebSockets","id":315,"taxonomy":"post_tag","slug":"websockets"}]],"wp:featuredmedia":[{"date":"2013-03-16T11:23:38","_links":{"replies":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?post=5593","embeddable":true}],"author":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1","embeddable":true}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/types/attachment"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media/5593"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media"}]},"author":1,"link":"https://www.concrete.com.br/nodejs-2/","caption":{"rendered":""},"type":"attachment","title":{"rendered":"nodejs"},"media_details":{"file":"2012/10/nodejs1.png","sizes":{"thumbnail":{"file":"nodejs1-150x150.png","mime_type":"image/png","width":150,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-150x150.png","height":150},"thumb-relacionado":{"file":"nodejs1-250x250.png","mime_type":"image/png","width":250,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-250x250.png","height":250},"box-pequeno":{"file":"nodejs1-263x219.png","mime_type":"image/png","width":263,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-263x219.png","height":219},"autor-post":{"file":"nodejs1-140x140.png","mime_type":"image/png","width":140,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-140x140.png","height":140},"lista-eventos":{"file":"nodejs1-477x247.png","mime_type":"image/png","width":477,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-477x247.png","height":247},"medium":{"file":"nodejs1-300x154.png","mime_type":"image/png","width":300,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-300x154.png","height":154},"box-grande":{"file":"nodejs1-264x270.png","mime_type":"image/png","width":264,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-264x270.png","height":270},"box-pequeno-2":{"file":"nodejs1-264x224.png","mime_type":"image/png","width":264,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1-264x224.png","height":224},"full":{"file":"nodejs1.png","mime_type":"image/png","width":527,"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1.png","height":270}},"image_meta":{"aperture":"0","copyright":"","orientation":"0","focal_length":"0","iso":"0","keywords":[],"caption":"","created_timestamp":"0","credit":"","camera":"","title":"","shutter_speed":"0"},"width":527,"height":270},"source_url":"https://static.concrete.com.br/uploads/2012/10/nodejs1.png","alt_text":"","media_type":"image","mime_type":"image/png","id":5593,"slug":"nodejs-2"}]},"parsedDate":"26 de Outubro de 2012","getAuthorDescription":"

","getPostDescription":"","getPostCategories":{"slug":["engenharia-de-software"],"id":[17],"name":["Desenvolvimento Web"]},"getPostTags":{"slug":["comet","javascript","node-js","socket-io","websockets"],"id":[287,69,313,314,315],"name":["comet","javascript","Node.js","Socket.io","WebSockets"]},"getPostLanguage":"pt"},{"date":"2012-06-11T15:43:37","custom_author":{"name":null,"description":null,"avatar":null},"getAuthor":"concrete","_embedded":{"replies":[[{"author_name":"lucabastos","date":"2012-06-16T12:08:00","parent":784,"author_url":"http://twitter.com/lucabastos","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/784","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/788"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-788","id":788,"type":"comment","content":{"rendered":"

O bom de escrever blog de compartilhamento de conhecimento é justamente poder receber um feedback como este do Bruno.

\n

Como eu digo sempre, ninguém sabe tudo e nem temos a pretensão neste blog de sermos os bam-bam-bans, os donos da verdade. Estamos o tempo todo aprendendo e sempre que possível compartilhando o aprendizado.

\n

Obrigado Bruno

\n"}},{"author_name":"lenonm","date":"2012-06-12T11:14:00","parent":785,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/785","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/787"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-787","id":787,"type":"comment","content":{"rendered":"

Valeu, BP. 🙂

\n"}},{"author_name":"lenonm","date":"2012-06-12T11:13:00","parent":784,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/784","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/786"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-786","id":786,"type":"comment","content":{"rendered":"

Verdade, você tem razão. Testei um app usando 3.0.11 e não foi preciso adicionar app/jobs no autoload_paths.

\n

Legal. 🙂

\n"}},{"author_name":"blpsilva","date":"2012-06-12T00:14:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/1d054c3a1a26bf7562361579c99730be?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/1d054c3a1a26bf7562361579c99730be?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/1d054c3a1a26bf7562361579c99730be?s=96&d=mm&r=g"},"_links":{"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=785"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/785"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-785","id":785,"type":"comment","content":{"rendered":"

Gostei muito, menino Lêno. Ficou bem escrito e fácil de entender.

\n"}},{"author_name":"Bruno Andrade","date":"2012-06-11T18:44:00","parent":0,"author_url":"http://twitter.com/brunoandradd","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/?s=96&d=mm&r=g"},"_links":{"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=784"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/784"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-784","id":784,"type":"comment","content":{"rendered":"

Lenon,
\n Muito bom o artigo parabéns, mas apenas uma detalhe, pelo menos nos rails mais novos não é necessário adicionar o path de qualquer pasta dentro de app,sendo assim não precisa desta config

\n

config.autoload_paths += %W(#{config.root}/app/jobs)

\n"}}]],"author":[{"avatar_urls":{"24":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]},"name":"concrete","link":"https://www.concrete.com.br/author/concrete/","description":"","id":1,"url":"","slug":"concrete"}],"wp:term":[[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}]},"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","id":17,"taxonomy":"category","slug":"engenharia-de-software"}],[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=161"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/161"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/message-queuing/","name":"message queuing","id":161,"taxonomy":"post_tag","slug":"message-queuing"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=172"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/172"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/rails/","name":"rails","id":172,"taxonomy":"post_tag","slug":"rails"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=222"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/222"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/resque/","name":"Resque","id":222,"taxonomy":"post_tag","slug":"resque"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=72"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/72"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/ruby/","name":"ruby","id":72,"taxonomy":"post_tag","slug":"ruby"}]]},"link":"https://www.concrete.com.br/2012/06/11/resque/","title":{"rendered":"Resque"},"embedded":{"replies":[[{"author_name":"lucabastos","date":"2012-06-16T12:08:00","parent":784,"author_url":"http://twitter.com/lucabastos","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/784","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/788"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-788","id":788,"type":"comment","content":{"rendered":"

O bom de escrever blog de compartilhamento de conhecimento é justamente poder receber um feedback como este do Bruno.

\n

Como eu digo sempre, ninguém sabe tudo e nem temos a pretensão neste blog de sermos os bam-bam-bans, os donos da verdade. Estamos o tempo todo aprendendo e sempre que possível compartilhando o aprendizado.

\n

Obrigado Bruno

\n"}},{"author_name":"lenonm","date":"2012-06-12T11:14:00","parent":785,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/785","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/787"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-787","id":787,"type":"comment","content":{"rendered":"

Valeu, BP. 🙂

\n"}},{"author_name":"lenonm","date":"2012-06-12T11:13:00","parent":784,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/6174015667b1e21e3693e47ad1861990?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/784","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/786"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-786","id":786,"type":"comment","content":{"rendered":"

Verdade, você tem razão. Testei um app usando 3.0.11 e não foi preciso adicionar app/jobs no autoload_paths.

\n

Legal. 🙂

\n"}},{"author_name":"blpsilva","date":"2012-06-12T00:14:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/1d054c3a1a26bf7562361579c99730be?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/1d054c3a1a26bf7562361579c99730be?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/1d054c3a1a26bf7562361579c99730be?s=96&d=mm&r=g"},"_links":{"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=785"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/785"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-785","id":785,"type":"comment","content":{"rendered":"

Gostei muito, menino Lêno. Ficou bem escrito e fácil de entender.

\n"}},{"author_name":"Bruno Andrade","date":"2012-06-11T18:44:00","parent":0,"author_url":"http://twitter.com/brunoandradd","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/?s=96&d=mm&r=g"},"_links":{"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=784"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/784"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/2220","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/06/11/resque/#comment-784","id":784,"type":"comment","content":{"rendered":"

Lenon,
\n Muito bom o artigo parabéns, mas apenas uma detalhe, pelo menos nos rails mais novos não é necessário adicionar o path de qualquer pasta dentro de app,sendo assim não precisa desta config

\n

config.autoload_paths += %W(#{config.root}/app/jobs)

\n"}}]],"author":[{"avatar_urls":{"24":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]},"name":"concrete","link":"https://www.concrete.com.br/author/concrete/","description":"","id":1,"url":"","slug":"concrete"}],"wp:term":[[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}]},"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","id":17,"taxonomy":"category","slug":"engenharia-de-software"}],[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=161"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/161"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/message-queuing/","name":"message queuing","id":161,"taxonomy":"post_tag","slug":"message-queuing"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=172"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/172"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/rails/","name":"rails","id":172,"taxonomy":"post_tag","slug":"rails"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=222"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/222"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/resque/","name":"Resque","id":222,"taxonomy":"post_tag","slug":"resque"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=72"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/72"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/ruby/","name":"ruby","id":72,"taxonomy":"post_tag","slug":"ruby"}]]},"parsedDate":"11 de Junho de 2012","getAuthorDescription":"

","getPostDescription":"","getPostCategories":{"slug":["engenharia-de-software"],"id":[17],"name":["Desenvolvimento Web"]},"getPostTags":{"slug":["message-queuing","rails","resque","ruby"],"id":[161,172,222,72],"name":["message queuing","rails","Resque","ruby"]},"getPostLanguage":"pt"},{"date":"2012-01-30T13:07:58","custom_author":{"name":null,"description":null,"avatar":null},"getAuthor":"concrete","_embedded":{"replies":[[{"author_name":"Carol Almeida","date":"2014-05-09T14:55:22","parent":422,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/5adee5046174ed4c279c6d39741c6d56?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/5adee5046174ed4c279c6d39741c6d56?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/5adee5046174ed4c279c6d39741c6d56?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/422","embeddable":true}],"author":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/42","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/423"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/1341","embeddable":true}]},"author":42,"link":"https://www.concrete.com.br/2012/01/30/api-java-jms-parte-1/#comment-423","id":423,"type":"comment","content":{"rendered":"

Oi Richard! Vamos providenciar a segunda parte deste post para a próxima semana. Se você quiser deixar seu e-mail, te avisamos! Abs.

\n"}},{"author_name":"Richard Nascimento","date":"2014-05-06T11:55:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/c634da971e87c67ad3c52351a5843bb0?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/c634da971e87c67ad3c52351a5843bb0?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/c634da971e87c67ad3c52351a5843bb0?s=96&d=mm&r=g"},"_links":{"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=422"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/422"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/1341","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/01/30/api-java-jms-parte-1/#comment-422","id":422,"type":"comment","content":{"rendered":"

cade a continuação???

\n"}},{"author_name":"Luca Bastos","date":"2012-01-30T14:26:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/bec8c46f4ea4f86d114e5fee954224f0?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/bec8c46f4ea4f86d114e5fee954224f0?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/bec8c46f4ea4f86d114e5fee954224f0?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/419"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/1341","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/01/30/api-java-jms-parte-1/#comment-419","id":419,"type":"comment","content":{"rendered":"

@ Carlos Olvieira

\n

Obrigado
\nSe quiser compartilhar o link do seu programa eu incluo no post com exemplos

\n"}},{"author_name":"Carlos Olvieira","date":"2012-01-30T13:57:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/bc0f7b0c82ea678334040823bc217da3?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/bc0f7b0c82ea678334040823bc217da3?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/bc0f7b0c82ea678334040823bc217da3?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/418"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/1341","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/01/30/api-java-jms-parte-1/#comment-418","id":418,"type":"comment","content":{"rendered":"

bom, obrigado está explicação me aclarou algumas coisas;
\nbom artigo.
\neu fiz um programa que envia um mensagem ao ActiveMQ com persistencia, cuando voces quizer eu pode compartir

\n"}}]],"author":[{"avatar_urls":{"24":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]},"name":"concrete","link":"https://www.concrete.com.br/author/concrete/","description":"","id":1,"url":"","slug":"concrete"}],"wp:term":[[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}]},"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","id":17,"taxonomy":"category","slug":"engenharia-de-software"}],[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=159"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/159"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/integracao-2/","name":"integração","id":159,"taxonomy":"post_tag","slug":"integracao-2"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=68"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/68"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/java/","name":"java","id":68,"taxonomy":"post_tag","slug":"java"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=164"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/164"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/jms/","name":"JMS","id":164,"taxonomy":"post_tag","slug":"jms"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=160"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/160"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/mensageria/","name":"mensageria","id":160,"taxonomy":"post_tag","slug":"mensageria"}]]},"link":"https://www.concrete.com.br/2012/01/30/api-java-jms-parte-1/","title":{"rendered":"API Java JMS – parte 1"},"embedded":{"replies":[[{"author_name":"Carol Almeida","date":"2014-05-09T14:55:22","parent":422,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/5adee5046174ed4c279c6d39741c6d56?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/5adee5046174ed4c279c6d39741c6d56?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/5adee5046174ed4c279c6d39741c6d56?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/422","embeddable":true}],"author":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/42","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/423"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/1341","embeddable":true}]},"author":42,"link":"https://www.concrete.com.br/2012/01/30/api-java-jms-parte-1/#comment-423","id":423,"type":"comment","content":{"rendered":"

Oi Richard! Vamos providenciar a segunda parte deste post para a próxima semana. Se você quiser deixar seu e-mail, te avisamos! Abs.

\n"}},{"author_name":"Richard Nascimento","date":"2014-05-06T11:55:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/c634da971e87c67ad3c52351a5843bb0?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/c634da971e87c67ad3c52351a5843bb0?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/c634da971e87c67ad3c52351a5843bb0?s=96&d=mm&r=g"},"_links":{"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=422"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/422"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/1341","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/01/30/api-java-jms-parte-1/#comment-422","id":422,"type":"comment","content":{"rendered":"

cade a continuação???

\n"}},{"author_name":"Luca Bastos","date":"2012-01-30T14:26:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/bec8c46f4ea4f86d114e5fee954224f0?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/bec8c46f4ea4f86d114e5fee954224f0?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/bec8c46f4ea4f86d114e5fee954224f0?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/419"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/1341","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/01/30/api-java-jms-parte-1/#comment-419","id":419,"type":"comment","content":{"rendered":"

@ Carlos Olvieira

\n

Obrigado
\nSe quiser compartilhar o link do seu programa eu incluo no post com exemplos

\n"}},{"author_name":"Carlos Olvieira","date":"2012-01-30T13:57:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/bc0f7b0c82ea678334040823bc217da3?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/bc0f7b0c82ea678334040823bc217da3?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/bc0f7b0c82ea678334040823bc217da3?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/418"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/1341","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/01/30/api-java-jms-parte-1/#comment-418","id":418,"type":"comment","content":{"rendered":"

bom, obrigado está explicação me aclarou algumas coisas;
\nbom artigo.
\neu fiz um programa que envia um mensagem ao ActiveMQ com persistencia, cuando voces quizer eu pode compartir

\n"}}]],"author":[{"avatar_urls":{"24":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/50fdb5e1fd0223a4aa65b6deb3461969?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]},"name":"concrete","link":"https://www.concrete.com.br/author/concrete/","description":"","id":1,"url":"","slug":"concrete"}],"wp:term":[[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}]},"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","id":17,"taxonomy":"category","slug":"engenharia-de-software"}],[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=159"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/159"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/integracao-2/","name":"integração","id":159,"taxonomy":"post_tag","slug":"integracao-2"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=68"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/68"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/java/","name":"java","id":68,"taxonomy":"post_tag","slug":"java"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=164"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/164"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/jms/","name":"JMS","id":164,"taxonomy":"post_tag","slug":"jms"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=160"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/160"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/mensageria/","name":"mensageria","id":160,"taxonomy":"post_tag","slug":"mensageria"}]]},"parsedDate":"30 de Janeiro de 2012","getAuthorDescription":"

","getPostDescription":"","getPostCategories":{"slug":["engenharia-de-software"],"id":[17],"name":["Desenvolvimento Web"]},"getPostTags":{"slug":["integracao-2","java","jms","mensageria"],"id":[159,68,164,160],"name":["integração","java","JMS","mensageria"]},"getPostLanguage":"pt"},{"date":"2012-09-27T14:33:07","custom_author":{"name":null,"description":null,"avatar":null},"getAuthor":"Victor Nascimento","_embedded":{"replies":[[{"author_name":"Guilherme","date":"2013-09-24T01:10:00","parent":1150,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/2105d2bd5fcb7e1d42a406410f9b2f31?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/2105d2bd5fcb7e1d42a406410f9b2f31?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/2105d2bd5fcb7e1d42a406410f9b2f31?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1150","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1155"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1155","id":1155,"type":"comment","content":{"rendered":"

Meu Deus, é tão simples fazer isso com erlang.
\nChatisse de Java, java, java.

\n

“Com a ferramenta certa para o problema certo fica muito simples”

\n"}},{"author_name":"Victor Nascimento","date":"2012-09-28T17:28:00","parent":1150,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1150","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1151"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1151","id":1151,"type":"comment","content":{"rendered":"

Possível é sim!

\n

Até onde eu sei (o que não é muito), todas essas opções precisam gerenciar estado mutável de alguma forma. E sempre terão diversas threads rodando (mesmo que não seja uma por client).

\n

Comparações nunca são muito boas, mas seguem dois artigos para comparar (escritos na mesma época):

\n

http://iobound.com/tag/erlang/ (Jetty Continuations)
\nhttp://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3 (mochiweb Erlang server)

\n

No primeiro, após 10.000 conexões abertas, a VM estava usando por volta de 450 MB de RAM e começou a falhar.

\n

No segundo, 10.000 conexões abertas foram possíveis com 77 MB de RAM e na terceira parte do artigo, ele atinge 1 milhao de conexões em uma única máquina.

\n

Enfim, Erlang nasceu para esse propósito enquanto tudo o que for feito na JVM será sempre para tentar driblar sua própria natureza IMHO,

\n"}},{"author_name":"Rafael Nunes","date":"2012-09-28T15:28:00","parent":1148,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1148","embeddable":true}],"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=1150"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1150"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1150","id":1150,"type":"comment","content":{"rendered":"

E não seria possível usar o ‘reactor pattern’ a lá node.js com o Netty, vert.x, ou mesmo JBoss Native Web, Jetty Continuations, etc? Sei que ao menos os dois primeiros não se utilizam de Threads para cada processo/conexão

\n"}},{"author_name":"Victor Nascimento","date":"2012-09-28T10:34:00","parent":1147,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1147","embeddable":true}],"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=1148"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1148"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1148","id":1148,"type":"comment","content":{"rendered":"

A idéia é que a JVM manteria uma Thread rodando para cada conexão aberta e este é um recurso caro para o sistema operacional. Caro em termos de memória consumida.

\n

O Erlang não se utiliza de threads para concorrência (não confundir concorrência com paralelismo!), mas processos leves internos da pŕopria VM dele.

\n

Em uma máquina comum (digamos… core i5 2.5Ghz, 4GB RAM e etc) quantas threads conseguimos abrir antes de derrubarmos a JVM com um out of memory?

\n

Podemos até fazer a comparação, mas em Erlang conseguimos ter absurdamente mais processos concorrentes que a JVM. Por isso long-polling não bem quisto na JVM por consumir muita memória mesmo com um número não tão alto de usuários concorrentes.

\n"}},{"author_name":"Rafael Nunes","date":"2012-09-28T10:10:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=96&d=mm&r=g"},"_links":{"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=1147"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1147"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1147","id":1147,"type":"comment","content":{"rendered":"

Não entendi a parte que diz que isso seria ruim para JVM.

\n"}}]],"author":[{"avatar_urls":{"24":"https://secure.gravatar.com/avatar/7e91a769959ce0ec53d69e57f0d101b3?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/7e91a769959ce0ec53d69e57f0d101b3?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/7e91a769959ce0ec53d69e57f0d101b3?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/28"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]},"name":"Victor Nascimento","link":"https://www.concrete.com.br/author/victor-nascimento/","description":"Desenvolvedor Java por experiência e Erlang por paixão. Bacharel em Filosofia (por opção!), acredita que o mundo das linguagens de programação anda se esquecendo muito do lado \"linguagem\" e se focando muito em \"programação\". Consultor especialista da Concrete Solutions em Java e arquitetura de sistemas, tem uma paixão pela plataforma Erlang, Wittgenstein e Kant.","id":28,"url":"http://olinasc.com","slug":"victor-nascimento"}],"wp:term":[[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}]},"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","id":17,"taxonomy":"category","slug":"engenharia-de-software"}],[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=286"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/286"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/chicagoboss/","name":"chicagoboss","id":286,"taxonomy":"post_tag","slug":"chicagoboss"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=287"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/287"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/comet/","name":"comet","id":287,"taxonomy":"post_tag","slug":"comet"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=288"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/288"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/erlang/","name":"erlang","id":288,"taxonomy":"post_tag","slug":"erlang"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=289"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/289"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/long-polling/","name":"long polling","id":289,"taxonomy":"post_tag","slug":"long-polling"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=290"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/290"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/tempo-real/","name":"tempo real","id":290,"taxonomy":"post_tag","slug":"tempo-real"}]],"wp:featuredmedia":[{"date":"2013-03-13T09:27:02","_links":{"replies":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?post=5509","embeddable":true}],"author":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1","embeddable":true}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/types/attachment"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media/5509"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media"}]},"author":1,"link":"https://www.concrete.com.br/chicago_boss/","caption":{"rendered":""},"type":"attachment","title":{"rendered":"chicago_boss"},"media_details":{"file":"2012/09/chicago_boss.png","sizes":{"thumbnail":{"file":"chicago_boss-150x150.png","mime_type":"image/png","width":150,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-150x150.png","height":150},"thumb-relacionado":{"file":"chicago_boss-250x186.png","mime_type":"image/png","width":250,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-250x186.png","height":186},"box-pequeno":{"file":"chicago_boss-263x186.png","mime_type":"image/png","width":263,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-263x186.png","height":186},"autor-post":{"file":"chicago_boss-140x140.png","mime_type":"image/png","width":140,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-140x140.png","height":140},"lista-eventos":{"file":"chicago_boss-477x186.png","mime_type":"image/png","width":477,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-477x186.png","height":186},"medium":{"file":"chicago_boss-300x102.png","mime_type":"image/png","width":300,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-300x102.png","height":102},"box-grande":{"file":"chicago_boss-264x186.png","mime_type":"image/png","width":264,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-264x186.png","height":186},"box-pequeno-2":{"file":"chicago_boss-264x186.png","mime_type":"image/png","width":264,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-264x186.png","height":186},"full":{"file":"chicago_boss.png","mime_type":"image/png","width":545,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss.png","height":186}},"image_meta":{"aperture":"0","copyright":"","orientation":"0","focal_length":"0","iso":"0","keywords":[],"caption":"","created_timestamp":"0","credit":"","camera":"","title":"","shutter_speed":"0"},"width":545,"height":186},"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss.png","alt_text":"","media_type":"image","mime_type":"image/png","id":5509,"slug":"chicago_boss"}]},"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/","title":{"rendered":"Comet para aplicação web em tempo real"},"embedded":{"replies":[[{"author_name":"Guilherme","date":"2013-09-24T01:10:00","parent":1150,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/2105d2bd5fcb7e1d42a406410f9b2f31?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/2105d2bd5fcb7e1d42a406410f9b2f31?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/2105d2bd5fcb7e1d42a406410f9b2f31?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1150","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1155"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1155","id":1155,"type":"comment","content":{"rendered":"

Meu Deus, é tão simples fazer isso com erlang.
\nChatisse de Java, java, java.

\n

“Com a ferramenta certa para o problema certo fica muito simples”

\n"}},{"author_name":"Victor Nascimento","date":"2012-09-28T17:28:00","parent":1150,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1150","embeddable":true}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1151"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1151","id":1151,"type":"comment","content":{"rendered":"

Possível é sim!

\n

Até onde eu sei (o que não é muito), todas essas opções precisam gerenciar estado mutável de alguma forma. E sempre terão diversas threads rodando (mesmo que não seja uma por client).

\n

Comparações nunca são muito boas, mas seguem dois artigos para comparar (escritos na mesma época):

\n

http://iobound.com/tag/erlang/ (Jetty Continuations)
\nhttp://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3 (mochiweb Erlang server)

\n

No primeiro, após 10.000 conexões abertas, a VM estava usando por volta de 450 MB de RAM e começou a falhar.

\n

No segundo, 10.000 conexões abertas foram possíveis com 77 MB de RAM e na terceira parte do artigo, ele atinge 1 milhao de conexões em uma única máquina.

\n

Enfim, Erlang nasceu para esse propósito enquanto tudo o que for feito na JVM será sempre para tentar driblar sua própria natureza IMHO,

\n"}},{"author_name":"Rafael Nunes","date":"2012-09-28T15:28:00","parent":1148,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1148","embeddable":true}],"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=1150"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1150"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1150","id":1150,"type":"comment","content":{"rendered":"

E não seria possível usar o ‘reactor pattern’ a lá node.js com o Netty, vert.x, ou mesmo JBoss Native Web, Jetty Continuations, etc? Sei que ao menos os dois primeiros não se utilizam de Threads para cada processo/conexão

\n"}},{"author_name":"Victor Nascimento","date":"2012-09-28T10:34:00","parent":1147,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/97194dc317b7411439477d01b7b84f70?s=96&d=mm&r=g"},"_links":{"in-reply-to":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1147","embeddable":true}],"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=1148"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1148"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1148","id":1148,"type":"comment","content":{"rendered":"

A idéia é que a JVM manteria uma Thread rodando para cada conexão aberta e este é um recurso caro para o sistema operacional. Caro em termos de memória consumida.

\n

O Erlang não se utiliza de threads para concorrência (não confundir concorrência com paralelismo!), mas processos leves internos da pŕopria VM dele.

\n

Em uma máquina comum (digamos… core i5 2.5Ghz, 4GB RAM e etc) quantas threads conseguimos abrir antes de derrubarmos a JVM com um out of memory?

\n

Podemos até fazer a comparação, mas em Erlang conseguimos ter absurdamente mais processos concorrentes que a JVM. Por isso long-polling não bem quisto na JVM por consumir muita memória mesmo com um número não tão alto de usuários concorrentes.

\n"}},{"author_name":"Rafael Nunes","date":"2012-09-28T10:10:00","parent":0,"author_url":"","author_avatar_urls":{"24":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/99170d4526e886d17e220731623e146d?s=96&d=mm&r=g"},"_links":{"children":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?parent=1147"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments/1147"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments"}],"up":[{"post_type":"post","href":"https://www.concrete.com.br/wp-json/wp/v2/posts/3277","embeddable":true}]},"author":0,"link":"https://www.concrete.com.br/2012/09/27/comet-para-aplicacao-web-em-tempo-real/#comment-1147","id":1147,"type":"comment","content":{"rendered":"

Não entendi a parte que diz que isso seria ruim para JVM.

\n"}}]],"author":[{"avatar_urls":{"24":"https://secure.gravatar.com/avatar/7e91a769959ce0ec53d69e57f0d101b3?s=24&d=mm&r=g","48":"https://secure.gravatar.com/avatar/7e91a769959ce0ec53d69e57f0d101b3?s=48&d=mm&r=g","96":"https://secure.gravatar.com/avatar/7e91a769959ce0ec53d69e57f0d101b3?s=96&d=mm&r=g"},"_links":{"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/28"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users"}]},"name":"Victor Nascimento","link":"https://www.concrete.com.br/author/victor-nascimento/","description":"Desenvolvedor Java por experiência e Erlang por paixão. Bacharel em Filosofia (por opção!), acredita que o mundo das linguagens de programação anda se esquecendo muito do lado \"linguagem\" e se focando muito em \"programação\". Consultor especialista da Concrete Solutions em Java e arquitetura de sistemas, tem uma paixão pela plataforma Erlang, Wittgenstein e Kant.","id":28,"url":"http://olinasc.com","slug":"victor-nascimento"}],"wp:term":[[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?categories=17"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/category"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories/17"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/categories"}]},"link":"https://www.concrete.com.br/category/engenharia-de-software/","name":"Desenvolvimento Web","id":17,"taxonomy":"category","slug":"engenharia-de-software"}],[{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=286"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/286"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/chicagoboss/","name":"chicagoboss","id":286,"taxonomy":"post_tag","slug":"chicagoboss"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=287"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/287"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/comet/","name":"comet","id":287,"taxonomy":"post_tag","slug":"comet"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=288"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/288"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/erlang/","name":"erlang","id":288,"taxonomy":"post_tag","slug":"erlang"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=289"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/289"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/long-polling/","name":"long polling","id":289,"taxonomy":"post_tag","slug":"long-polling"},{"_links":{"wp:post_type":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/posts?tags=290"}],"curies":[{"templated":true,"name":"wp","href":"https://api.w.org/{rel}"}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/taxonomies/post_tag"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags/290"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/tags"}]},"link":"https://www.concrete.com.br/tag/tempo-real/","name":"tempo real","id":290,"taxonomy":"post_tag","slug":"tempo-real"}]],"wp:featuredmedia":[{"date":"2013-03-13T09:27:02","_links":{"replies":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/comments?post=5509","embeddable":true}],"author":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/users/1","embeddable":true}],"about":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/types/attachment"}],"self":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media/5509"}],"collection":[{"href":"https://www.concrete.com.br/wp-json/wp/v2/media"}]},"author":1,"link":"https://www.concrete.com.br/chicago_boss/","caption":{"rendered":""},"type":"attachment","title":{"rendered":"chicago_boss"},"media_details":{"file":"2012/09/chicago_boss.png","sizes":{"thumbnail":{"file":"chicago_boss-150x150.png","mime_type":"image/png","width":150,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-150x150.png","height":150},"thumb-relacionado":{"file":"chicago_boss-250x186.png","mime_type":"image/png","width":250,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-250x186.png","height":186},"box-pequeno":{"file":"chicago_boss-263x186.png","mime_type":"image/png","width":263,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-263x186.png","height":186},"autor-post":{"file":"chicago_boss-140x140.png","mime_type":"image/png","width":140,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-140x140.png","height":140},"lista-eventos":{"file":"chicago_boss-477x186.png","mime_type":"image/png","width":477,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-477x186.png","height":186},"medium":{"file":"chicago_boss-300x102.png","mime_type":"image/png","width":300,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-300x102.png","height":102},"box-grande":{"file":"chicago_boss-264x186.png","mime_type":"image/png","width":264,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-264x186.png","height":186},"box-pequeno-2":{"file":"chicago_boss-264x186.png","mime_type":"image/png","width":264,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss-264x186.png","height":186},"full":{"file":"chicago_boss.png","mime_type":"image/png","width":545,"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss.png","height":186}},"image_meta":{"aperture":"0","copyright":"","orientation":"0","focal_length":"0","iso":"0","keywords":[],"caption":"","created_timestamp":"0","credit":"","camera":"","title":"","shutter_speed":"0"},"width":545,"height":186},"source_url":"https://static.concrete.com.br/uploads/2012/09/chicago_boss.png","alt_text":"","media_type":"image","mime_type":"image/png","id":5509,"slug":"chicago_boss"}]},"parsedDate":"27 de Setembro de 2012","getAuthorDescription":"

Desenvolvedor Java por experiência e Erlang por paixão. Bacharel em Filosofia (por opção!), acredita que o mundo das linguagens de programação anda se esquecendo muito do lado \"linguagem\" e se focando muito em \"programação\". Consultor especialista da Concrete Solutions em Java e arquitetura de sistemas, tem uma paixão pela plataforma Erlang, Wittgenstein e Kant.

","getPostDescription":"","getPostCategories":{"slug":["engenharia-de-software"],"id":[17],"name":["Desenvolvimento Web"]},"getPostTags":{"slug":["chicagoboss","comet","erlang","long-polling","tempo-real"],"id":[286,287,288,289,290],"name":["chicagoboss","comet","erlang","long polling","tempo real"]},"getPostLanguage":"pt"}],"relatedPostsFrom":5,"relatedPostSize":4},"posts":{"pageNumber":0,"pageSize":4,"offset":0,"pagination":9,"app":{"ssrLocation":"/2013/02/15/implementando-um-sistema-de-fila-assincrona-e-mensagens-com-sidekiq-e-pusher-em-uma-aplicacao-rails/","title":"Concrete Implementando um sistema de fila assíncrona e mensagens com sidekiq e pusher em uma aplicação Rails","currentLang":{"intro":{"title":"Nós
Movemos
O Mundo.","subtitle":"Nós desenvolvemos produtos digitais com inovação, agilidade e excelentes práticas, para que o mercado brasileiro e latino-americano acompanhe a velocidade do mercado digital mundial. Acreditamos que as transformações que mantêm o mundo em constante movimento passam por nossas mãos - e gostamos disso."},"jobs":{"more":"Mais informações","apply":"Quero me candidatar","other":"Outras vagas","moreInformation":"Mais informações"},"posts":{"loadmore":"Carregar mais posts"},"search":{"placeholder":"Faça sua busca..."},"shared":{"begin":"Início","blog":"Blog","jobs":"Vagas","contact":"Contato","back":"Voltar","share":"Compartilhar","press":"Comunicação
e imprensa","commercial":"Comercial","hr":"Recursos
Humanos"}},"language":"pt"}}}