Olá pessoal, essa semana foi lançado o novo site da Amil, a maior operadora de saúde do país, utilizamos o VRaptor como controller, a experiência foi muito boa, o framework sempre se mostrou bastante maduro e estável, contudo, tivemos alguns problemas de performance, não relacionado ao VRaptor exatamente mas sim ao fato de estarmos utilizando o Spring como DI do controller, acredito que p/ escopo de request ele seja um pouco pesado, a primeira versão do site apresentou bastante lentidão o thread dump de um nó do cluster (aqui nós temos um Weblogic em cluster com 3 nós) mostrou o seguinte:
...
"[ACTIVE] ExecuteThread: '94' for queue: 'weblogic.kernel.Default (self-tuning)'" id=1118 idx=0xb4 tid=3400 prio=5 alive, in native, blocked, daemon
-- Blocked trying to get lock: java/util/concurrent/ConcurrentHashMap@0x2aab6f59e4c8[unlocked]
at jrockit/vm/Threads.waitForUnblockSignal()V(Native Method)
at jrockit/vm/Locks.fatLockBlockOrSpin(Locks.java:1679)
at jrockit/vm/Locks.lockFat(Locks.java:1780)
at jrockit/vm/Locks.monitorEnterSecondStageHard(Locks.java:1312)
at jrockit/vm/Locks.monitorEnterSecondStage(Locks.java:1259)
at jrockit/vm/Locks.monitorEnter(Locks.java:2466)
at org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:180)
at org/springframework/beans/factory/support/AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:455)
at org/springframework/beans/factory/support/DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:317)
at org/springframework/beans/factory/BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:185)
at org/springframework/beans/factory/support/DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:829)
at org/springframework/beans/factory/support/DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:786)
at org/springframework/beans/factory/support/DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
at org/springframework/beans/factory/support/ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795)
at org/springframework/beans/factory/support/ConstructorResolver.resolvePreparedArguments(ConstructorResolver.java:765)
at org/springframework/beans/factory/support/ConstructorResolver.autowireConstructor(ConstructorResolver.java:131)
at org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactor
...
O thread dump mostrava diversas threads enfileradas aguardando lock de um trecho synchonized de um ConcurrentHashMap do Spring, tentando pegar um bean do container. Analisando ainda a aplicação identificamos um tempo de resposta médio de urls que só passavam pelo controller e que não tinham nenhum tipo de acesso a banco ou qualquer outro tipo de I/O o tempo de resposta médio foi de aproximadamente 200 ms, o que achei um pouco alto, imagino que se deva ao número de acessos ao container de beans do Spring pelo VRaptor e pelos nossos interceptors, com isso resolvemos mudar o DI Framework p/ o Google Guice o que foi uma grata surpresa o tempo de resposta médio das mesmas urls passou a ser de 40 ms, subimos a nova versão e o problema de lentidão foi resolvido.
Apenas p/ constar não tenho nenhum problema com o Spring, continuo usando ele em toda a minha camada de negócios é um grande framework.
Espero que a nossa experiência aqui possa ajudar e até demonstrar como um framework como o VRaptor é escalável, o nosso site tem a média de 160 threads simultâneas, temos aproximadamente no nosso balancer cerca de 120 requisições por segundo.
Estamos usando também o VRaptor p/ os nossos serviços Rest
Serviço de Busca da Rede Credenciada:
http://www.amil.com.br/portal/servicos/rede-credenciada/saude
Accept: application/vnd.amil.busca-credenciado.v1+json