Payments Engineering Meetup

Em junho deste ano ocorreu o primeiro meetup sobre billing & payments onde participaram várias pessoas interessadas nos novos desafios de engenharia de sistemas que são trazidos pelas mudanças que estão ocorrendo no mercado de pagamentos.

Payments Engineering Meetup
Captura de Tela 2014-10-17 às 00.05.08
Payments Engineering Meetup
Payments Engineering Meetup

Várias empresas do vale do silício apresentaram seus cases com produtos bem diferentes um do outro.

Achei o conteúdo muito bom e queria compartilha aqui no blog  com vocês.

O conteúdo foi criado pelo time abaixo:

  • Mathieu Chauvin – Engineering Manager for Payments @ Netflix
  • Taylor Wicksell – Sr. Software Engineer for Billing @ Netflix
  • Jean-Denis Greze – Engineer @ Dropbox
  • Alec Holmes – Software Engineer @ Square
  • Emmanuel Cron – Software Engineer III, Google Wallet @ Google
  • Paul Huang – Engineering Manager @ Survey Monkey
  • Anthony Zacharakis – Lead Engineer @ Lumos Labs
  • Shengyong Li / Feifeng Yang – Dir. Engineering Commerce / Tech Lead Payment @ Electronic Arts

The total number of locks exceeds the lock table size

Pessoal,  eu estava aqui hoje efetuando uma query bem nervosa no meu banco de dados e tive com retorno o erro: The total number of locks exceeds the lock table size

Então segue abaixo a solução:

Erro: The total number of locks exceeds the lock table size

Motivo: Este erro ocorre porque quando o mysql percebe que o resultado de uma consulta é muito grande ele efetua uma cópia destes dados para uma tabela temporária (tmp table) que fica armazenada em um buffer mas este buffer tem um tamanho limitado (padrão de instalação do mysql é 80MB) e se o resultado for maior que o buffer o corre o erro.

Solução: Alterar a variável do mysql innodb_buffer_pool_size para um espaço maior, no meu caso coloquei 500MB

Como: 1) Antes de tudo acesse o console do mysql e execute o comando: show variables; e veja que o valor da variável innodb_buffer_pool_size ele deverá estar com 50MB.

2) Vamos alterar a variável innodb_buffer_pool_size para 500MB, acesso o arquivo /etc/mysql/my.cnf que deveria estar em acrescente a linha innodb_buffer_pool_size=500MB depois disso re-inicie o mysql

3) Depois de re-iniciar o mysql execute novamente o show variables; no console so mysql e confirme a alteração da variável.

Pronto, agora execute sua query novamente.

Abs[],

Bruno Gambier

The Economist – Brazil Takes Off

O Brasil é capa da revista de economia “The Economist” e o título é Brasil Takes Off.
O artigo fala muito superficialmente sobre o olé que o Brasil deu na crise internacional.

Leia aqui o artigo completo.

Nunca tinha visto um artigo que faz tantas referências a nossa história econômica e exibindo tantos gráficos do nosso desempenho.

Fica aqui minha pergunta: “O que foi que o Lula falou na ultima reunião com empresário na Europa?”.

Esta história esta parecendo com caviar “Nunca vi nem comi, eu só ouço falar”.
brazil_takes_of

Integração Apache com Tomcat e balanceamento de carga com JkMount

A integração do Apache com o TOMCAT é feita para que as páginas estáticas sejam executadas pelo Apache e as em JSP pelo contêiner TOMCAT, além do direcionamento das aplicações via APACHE, sendo o WebServer de acesso para as aplicações que estão no TOMCAT. As páginas ESTÁTICAS serão executadas pelo APACHE (ganho de performance) e as páginas dinâmicas (JSP) executadas pelo contêiner TOMCAT. A integração permite “esconder” as portas do TOMCAT, já que sua aplicação será chamada por uma URL na porta 80 e o APACHE sim, irá pegar sua aplicação no TOMCAT e mostrar. Possibilidade de se realizar LOADBALANCER entre dois ou mais TOMCATs usando o APACHE como o WebServer que irá gerenciar essa carga e dividirá ela. Quando o servidor é instalado, a configuração inicial do Tomcat contém um conector que recebe pedidos de HTTP utilizando AJP (Apache Jserv Protocol). Embora o Tomcat seja capaz de recebe pedidos de HTTP diretamente da rede, esse conector permite que o Tomcat receba pedidos de software em uma camada inferior. Por exemplo, o Tomcat pode receber pedidos de servidores da Web (como o Apache HTTP Server), servidores proxy e sistemas de balanceamento de carga que suportem os protocolos AJP.

Exemplo:
Integração Apache Tomcat com JkMount

Instalação

Para que o Apache consiga efetuar o balanceamento de carga entre ele e camada inferior de servidores (Tomcat) ele precisa ter o módulo JkMount (mod_jk) instalado pois ele é o responsável pela comunicação entre o Apache e o Tomcat. Este módulo pode ser obtido aquie os seus arquivos devem ser descompactados na pasta de módulos do
Apache:

/etc/httpd/modules

JkMount

Configuração

Para que o Apache utilize o módulo JkMout isso deve-se:

Localização do módulo

Localização do módulo: Criar o arquivo /etc/httpd/conf/jk.conf indicando onde está instalado o módulo JkMount, veja abaixo o conteúdo do arquivo:

 LoadModule jk_module /usr/lib64/httpd/modules/mod_jk.so

Definição dos Workers

Definição dos Workers: Criar o arquivo /etc/httpd/conf/jkworkers.properties

O arquivo abaixo cria 7 workers que são os servidores que o Apache irá balancear.

  • 4 servidores Tomcats, descrevendo a porta padrão, nome do localhost e qual o tipo de conexão (no nosso caso utilizamos o conector AJP para criar um proxy do Tomcat)
  • 2 balanceadores: loadbalancer efetua o balanceamento entre os servidores Tomcat 1 e 2 e loadbalancer2 efetua o balanceamento entre os servidores Tomcat 3 e 4.
  • 1 worker.status que é responsável de retornar o status de cada worker.
 #
 # workers.properties
 #
 #
 # In Unix, we use forward slashes:
 ps=/
 #
 # list the workers by name
 #
 worker.list=tomcat1, tomcat2, tomcat3, tomcat4, loadbalancer, loadbalancer2, status
 #
 # ------------------------
 # First tomcat server
 # ------------------------
 worker.tomcat1.port=8009
 worker.tomcat1.host=localhost
 worker.tomcat1.type=ajp13
 #
 # Specify the size of the open connection cache.
 #worker.tomcat1.cachesize
 #
 #
 # Specifies the load balance factor when used with
 # a load balancing worker.
 # Note:
 #  ----> lbfactor must be > 0
 #  ----> Low lbfactor means less work done by the worker.
 worker.tomcat1.lbfactor=100
 #
 # ------------------------
 # Second tomcat server
 # ------------------------
 worker.tomcat2.port=9009
 worker.tomcat2.host=localhost
 worker.tomcat2.type=ajp13
 #
 # Specify the size of the open connection cache.
 #worker.tomcat2.cachesize
 #
 #
 # Specifies the load balance factor when used with
 # a load balancing worker.
 # Note:
 #  ----> lbfactor must be > 0
 #  ----> Low lbfactor means less work done by the worker.
 worker.tomcat2.lbfactor=100
 #
 # ------------------------
 # Third tomcat server
 # ------------------------
 worker.tomcat3.port=10009
 worker.tomcat3.host=localhost
 worker.tomcat3.type=ajp13
 #
 # Specify the size of the open connection cache.
 #worker.tomcat3.cachesize
 #
 #
 # Specifies the load balance factor when used with
 # a load balancing worker.
 # Note:
 #  ----> lbfactor must be > 0
 #  ----> Low lbfactor means less work done by the worker.
 worker.tomcat3.lbfactor=100
 #
 worker.tomcat4.port=11009
 worker.tomcat4.host=localhost
 worker.tomcat4.type=ajp13
 worker.tomcat4.lbfactor=100
 #
 #
 # ------------------------
 # Load Balancer worker
 # ------------------------
 #
 #
 # The loadbalancer (type lb) worker performs weighted round-robin
 # load balancing with sticky sessions.
 # Note:
 #  ----> If a worker dies, the load balancer will check its state
 #        once in a while. Until then all work is redirected to peer
 #        worker.
 worker.loadbalancer.type=lb
 worker.loadbalancer.balanced_workers=tomcat1, tomcat2
 #
 worker.loadbalancer2.type=lb
 worker.loadbalancer2.balanced_workers=tomcat3 ,tomcat4
 #
 #
 # ------------------------
 # Status worker
 # ------------------------
 worker.status.type=status
 #
 #
 # END workers.properties
 #

Regras de Balanceamento

Regras de Balanceamento: No arquivo /etc/httpd/conf/httpd.conf devem ser inseridas as regras de balanceamento que deverão ser aplicadas pelo Apache, segue as regras criadas para o MoIP:

NameVirtualHost [ip localhost]
<VirtualHost ip localhost:80>
#
#JkMount /ig/* loadbalancer2
#
JkMount /*.jsp loadbalancer
#JkMount /*.do loadbalancer
JkMount /admin* loadbalancer
JkMount /manager* loadbalancer
JkMount /web-console* loadbalancer
JkMount /* loadbalancer
#
JkMount /jkstatus status
#
JkUnMount  /mail* loadbalancer
JkUnMount  /cgi-bin/* loadbalancer
JkUnMount  /openwebmail/* loadbalancer

ScriptAlias /cgi-bin/awstats /var/www/cgi-bin/awstats
Alias /awstats /var/www/html/awstats
ServerName   exemplo.com.br
DocumentRoot /var/www/vhosts/
SuexecUserGroup apache apache
ServerAlias "www.exemplo.com.br"
ServerAlias "www.exemplo_url2.com.br"
ServerAdmin "webmaster@exemplo.com.br"
ErrorDocument "503" "Por favor, tente mais tarde. O sistema esta temporariamente fora do ar.
CustomLog "/etc/httpd/logs/exemplo-access_log" "combined"
ErrorLog "/etc/httpd/logs/exemplo-error_log"
SSLCertificateChainFile  /etc/httpd/conf/ssl.crt/verisign.site.pro.intermediate.crt
Redirect /exemplo http://blog.exemplo.com.br
Redirect /forum http://forum.exemplo.com.br
<Directory /var/www/vhosts/exemplo.com.br>
Options Includes FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost ip localhost:443>
#
JkMount /*.jsp loadbalancer
#JkMount /*.do loadbalancer
JkMount /admin* loadbalancer
JkMount /manager* loadbalancer
JkMount /web-console* loadlancer
JkMount /* loadbalancer
#
JkMount /jkstatus status
#
JkUnMount  /mail* loadbalancer
JkUnMount  /cgi-bin/* loadbalancer
JkUnMount  /openwebmail/* loadbalancer
#
#
ScriptAlias /cgi-bin/awstats /var/www/cgi-bin/awstats
Alias /awstats /var/www/html/awstats
ServerName exemplo.com.br
DocumentRoot /var/www/vhosts/exemplo.com.br
SuexecUserGroup apache apache
ServerAlias "www.exemplo.com.br"
ServerAlias "www.exemplo_url2.com.br"
ServerAdmin "webmaster@exemplo.com.br"
ErrorDocument "503" "Por favor, tente mais tarde. O sistema esta temporariamente fora do ar.
CustomLog "/etc/httpd/logs/exemplo-access_log" "combined"
ErrorLog "/etc/httpd/logs/exemplo-error_log"
SSLCertificateFile /etc/httpd/conf/ssl.crt/exemplo.com.br.hspc.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/exemplo.com.br.hspc.key
SSLEngine on
SSLCertificateChainFile  /etc/httpd/conf/ssl.crt/verisign.site.pro.intermediate.crt
Redirect /moipideias http://blog.exemplo.com.br
Redirect /forum http://forum.exemplo.com.br
< Directory /var/www/vhosts/exemplo.com.br>
Options Includes FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>

Carregar o Módulo

Carregar o Módulo: Criar o arquivo /etc/httpd/conf.d/tomcat.conf que o Apache irá utilizar para carregar o módulo JkMount, workers e regras.

<IfModule mod_jk.c>
    JkWorkersFile /etc/httpd/conf/jkworkers.properties
    JkLogFile logs/mod_jk.log
    JkLogLevel error
    #
    JkMount /*.jsp loadbalancer
    #
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
    JkRequestLogFormat "%w %V %T"
</IfModule>

JasperException: Attribute value is quoted with which must be escaped when used within the value

Muitos desenvolvedores ao tentar efetuar o deploy de aplicações web em tomcat’s a partir da versão 5.5.27 estão tendo uma dor de cabeça terrível com um erro que não ocorria nas versões anteriores,  erro é:

JasperException: Attribute value is quoted with which must be escaped when used within the value “o atributo da página onde está dando o erro ”  is quoted with ” which must be escaped when used within the value>org.apache.jasper.JasperException:  “endereço da página com a linha onde está ocorrendo o erro”

Este erro ocorre com estas versões do apache com páginas onde o JSP não segue a nova especificação do JSP 2.0

“According to JSP 2.0 specification (chapter 1.7 page 72,73)”

A especificação diz que o atributo value das tags não podem mais ser definidas com “(aspas) dentro de ” (aspas) e por isso o erro JasperException ocorre.

Em resumo a nova especificação diz que esta declaração deve ser feita de outra maneira conforme o exemplo abaixo:

This code is illegal:
<mytags:tag value="<%= "hi!" %>" />

Instead the correct sentence would be:
<mytags:tag value='<%= "hi!" %>' />
<mytags:tag value="<%= \"hi!\" %>" />
<mytags:tag value='<%= \"name\" %>' />

Questão: Mas e agora? Terei que mudar todas as minhas tags que estão utilizando esta sintaxe?

Resposta: Não.

Como: Desativar nas configurações do tomcat a validação desta sintaxe, conforme o exemplo abaixo.

Para contornar o erro JasperException discutido nesta sessão basta acrescentar a linha abaixo no arquivo catalina.properties.

org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false

Referência: http://tomcat.apache.org/tomcat-5.5-doc/config/systemprops.html