• 0
ronaldoguedess

Obter mais desempenho ao gravar notificações no DB

Question

Ola tudo bem? estou com um problema de muito uso do processador de meu servidor, o pessoal que o gerencia disse que o problema é as notificações...
dissem que eu deveria usar menos o mysql.

Existe alguma solução pra eu não ficar gravando a todo instante a notificação no banco de dados?
Queria uma forma de agrupar elas, e gravar de uma vez... ou gravar em outro lugar sem ser o mysql, algum forma que seja facil pra gerenciar.

Eu já não sei o que fazer... meu servidor esta 100% em uso todos os 6 nucleos... 
uso um 2 dedicados para o sitema e mesmo assim ta dessa forma.
http://prntscr.com/m8p0pk

 

 

 

Share this post


Link to post
Share on other sites

13 answers to this question

Recommended Posts

  • 0

é um assunto bem complexo, pois depende de vários fatores, mas vamos lá:

1. opções de DB:

não acho MySQL uma boa opção para este tipo de uso, existem opções melhores de bancos mais leves, tanto SQL quanto NoSQL (key/value ou document store).
um bom lugar para comparar bancos de dados é 
https://db-engines.com

 

2. 

12 minutes ago, ronaldoguedess said:

Existe alguma solução pra eu não ficar gravando a todo instante a notificação no banco de dados?

qualquer opção pode te gerar um problema similar, tudo que você faz consome recursos de memória e processamento, se você recebe a notificação e não quer gravar ela no DB ela vai ter que de qualquer forma ficar armazenada em algum lugar (e geralmente acaba sendo em memória), o que pode gerar agilidade mas vai te consumir mais memória e precisar de maior controle para evitar que uma queda do servidor perca os dados.

para você ter ideia aqui trabalhamos com um servidor intermediário que serve somente para controlar filas de notificações (não só do ML), armazenando temporariamente na memória em um DB key-value para depois ser processada em outro servidor e gravada no DB definitivo (documento)

 

3. 

18 minutes ago, ronaldoguedess said:

Eu já não sei o que fazer... meu servidor esta 100% em uso todos os 6 nucleos... 
uso um 2 dedicados para o sitema e mesmo assim ta dessa forma.

eu diria para trocar de servidor, em vez de usar dois dedicados migre para Azure, AWS ou outras PAAS que são flexíveis, desta forma pode ir adequando conforme o uso
 

a última dica é repensar todo seu sistema: conforme ele cresce algumas soluções já não vão mais se adequar, você precisa de novas ferramentas e uma arquitetura mais complexa para lidar com os novos problemas e desafios que vão surgindo

Share this post


Link to post
Share on other sites
  • 0

Tente algo básico como o xml. Geral e diário. 

Coloque uma flag de controle de processo nos dados.

Você utiliza uma vez as notificações,  mas reutiliza? Relê em algum momento?

Crie uma rotina de manutenção do Geral apagando o que for velho demais.

 

Isso não é assunto de API, é lógica de programação,  infraestrutura,  linguagem,  ...

Share this post


Link to post
Share on other sites
  • 0

Parece mais problema com alguma lógica do que com o banco em si. Sua máquina parece parruda demais para ter este tipo de problema.

O servidor de aplicação está separado do banco? Caso não esteja desta forma, recomendo separar o banco de dados em uma máquina única. Outra apenas para receber as notificações e outra para processar filas de notificações, por exemplo.

Qual servidor de aplicação você usa? Quantas notificações você recebe por minuto aproximadamente?

Share this post


Link to post
Share on other sites
  • 0
On 1/18/2019 at 12:07 AM, ronaldoguedess said:

Ola tudo bem? estou com um problema de muito uso do processador de meu servidor, o pessoal que o gerencia disse que o problema é as notificações...
dissem que eu deveria usar menos o mysql.

Existe alguma solução pra eu não ficar gravando a todo instante a notificação no banco de dados?
Queria uma forma de agrupar elas, e gravar de uma vez... ou gravar em outro lugar sem ser o mysql, algum forma que seja facil pra gerenciar.

Eu já não sei o que fazer... meu servidor esta 100% em uso todos os 6 nucleos... 
uso um 2 dedicados para o sitema e mesmo assim ta dessa forma.
http://prntscr.com/m8p0pk

 

 

 

Você grava todas as notificações em banco de dados ?

Eu uso mysql 5.7 na minha aplicação numa plataforma mais simples que a sua

proc.png.1b4cf94b52f7723235ff09a5d7c7368d.png

 

PS - Parece meio comico restringir o tamanho de TODOS os arquivos anexados a 500kb por usuário. Se tu fizer um guia para usuários novatos não ficarem repetindo perguntas la se vai o espaço

 

Share this post


Link to post
Share on other sites
  • 0
On 1/18/2019 at 12:31 AM, mldev said:

1. opções de DB:

não acho MySQL uma boa opção para este tipo de uso, existem opções melhores de bancos mais leves, tanto SQL quanto NoSQL (key/value ou document store).
um bom lugar para comparar bancos de dados é 
https://db-engines.com

 

2. 

qualquer opção pode te gerar um problema similar, tudo que você faz consome recursos de memória e processamento, se você recebe a notificação e não quer gravar ela no DB ela vai ter que de qualquer forma ficar armazenada em algum lugar (e geralmente acaba sendo em memória), o que pode gerar agilidade mas vai te consumir mais memória e precisar de maior controle para evitar que uma queda do servidor perca os dados.

para você ter ideia aqui trabalhamos com um servidor intermediário que serve somente para controlar filas de notificações (não só do ML), armazenando temporariamente na memória em um DB key-value para depois ser processada em outro servidor e gravada no DB definitivo (documento)

 

3. 

eu diria para trocar de servidor, em vez de usar dois dedicados migre para Azure, AWS ou outras PAAS que são flexíveis, desta forma pode ir adequando conforme o uso
 

a última dica é repensar todo seu sistema: conforme ele cresce algumas soluções já não vão mais se adequar, você precisa de novas ferramentas e uma arquitetura mais complexa para lidar com os novos problemas e desafios que vão surgindo

Dei uma olhada, parece o mysl ta até em uma posição boa se for comparado aos outros.. mas realmente tem melhor como vc disse.
é verdade... eu gravo elas no DB e processo depois... antes eu tinha um sistema que fazia uma fila e atualiza 100 de cada bloco, tipo 100 itens de cada cliente a cada 5 minutos.. mas isso criava uma fila muito grande... dai criei um pyton que a cada minuto executa 100 de cada cliente individual usanod threads... ficou muito melhor... exige mais.. mas melhorou muito.

nossa, interessante.. realmente seria o ideal um servidor/instancia apenas para gerenciamento das notificações. vou pensar nisso...

Eu tinha 3 clouds no linode, conhece? tinha uma de 8GB de RAM e 4nucleos.... dedicado ao banco de dados... 1 instancia com 2 nucleos e 4gb de ram para o frontend, e 1 instnacia de 1GB e 1 nucleo para meus crons... usava nginx, configurado por mim mesmo... mas tinha um problema... qualquer solciitação longa, exemplo conectar uma conta, exportar produtos... ja removia o acesso de todos os clientes o chrome mostrava "Waiting for avaliables sockets" e com isso comecava a perder notificações... cliente perdia acesso... era um caos... talvez estava mal configurado...  quando contratei os dedicados o cara falou q era pq la eu só tinha 1 thread por nucleo...  mas estou desconfado... pois ele disse q tinha hightavaliable, e balanceamento de carga mas nunca vi isso funcionar... então terei que encontrar outro lugar pra migrar meu sistema.

Obrigado pela dica... meio que ja comecei repensar algumas coisas... mas terei que bolar uma outra estrutura...

Share this post


Link to post
Share on other sites
  • 0
On 1/18/2019 at 12:48 AM, rodrigojob said:

Tente algo básico como o xml. Geral e diário. 

Coloque uma flag de controle de processo nos dados.

Você utiliza uma vez as notificações,  mas reutiliza? Relê em algum momento?

Crie uma rotina de manutenção do Geral apagando o que for velho demais.

 

Isso não é assunto de API, é lógica de programação,  infraestrutura,  linguagem,  ...

Opa.. ultilizo apenas 1 vez, para processar os dados e quando são processadas sao atualizadas para true, vou analizar a possibilidade de usar XML, assim ja alivia o DB para as notificações. Obrigado...

Atualmente tenho uma rotina que apaga os atualiazados de tempos em tempos. assim vai dando uma aliviada nas tabelas temporarias.

Share this post


Link to post
Share on other sites
  • 0
On 1/18/2019 at 5:19 PM, Diogenes Lima said:

Parece mais problema com alguma lógica do que com o banco em si. Sua máquina parece parruda demais para ter este tipo de problema.

O servidor de aplicação está separado do banco? Caso não esteja desta forma, recomendo separar o banco de dados em uma máquina única. Outra apenas para receber as notificações e outra para processar filas de notificações, por exemplo.

Qual servidor de aplicação você usa? Quantas notificações você recebe por minuto aproximadamente?

Eu tambem achei estranho.... tanto que quando usava as Clouds Linode não tinha esse problema...

Não esta.. é tudo no mesmo servidor... o segundo servidor que eu mencionei, é para Hight Avaliable e Loadbalancer... coisa que não vi funcionar até hoje pra ser sinsero... até mesmo quando aconteceu um problema, eu desliguei a maquina 1 pra ver se a segunda assumia e nada.. dai ele me disse q eu nao deveria ter feito aquilo... conversando mais com ele depois ele me disse q é manual, ele identifica o sobreacarregamento da maquina e passa pra outra... mas olhando os dados... a segunda maquina fica em uso igual a primeira. kkk o que é mais estranho ainda... tenho que arrumar outro servidor pra sair desse... não estou satisfeito ali....

Como eu disse na primeira resposta:
 tinha uma de 8GB de RAM e 4nucleos.... dedicado ao banco de dados... 1 instancia com 2 nucleos e 4gb de ram para o frontend, e 1 instnacia de 1GB e 1 nucleo para meus crons... usava nginx, configurado por mim mesmo... mas tinha um problema... qualquer solciitação longa, exemplo conectar uma conta, exportar produtos... ja removia o acesso de todos os clientes o chrome mostrava "Waiting for avaliables sockets" e com isso comecava a perder notificações... cliente perdia acesso... era um caos... talvez estava mal configurado...  quando contratei os dedicados o cara falou q era pq la eu só tinha 1 thread por nucleo...  mas estou desconfado... pois ele disse q tinha hightavaliable, e balanceamento de carga mas nunca vi isso funcionar... 

Foi configurado no Centos, com cpanel + Ngixn...  ainda não verifique quantas estou recebendo por minuto, mas varia... tem um cliente que ultimamente ja tem uns 20 mil produtos e ta subindo produtos em massa... dasi as vezes acontece de chegar muitasss mesmo... deve ser isso... e como ta tudo na mesma maquina ta bugando.... acredito que a melhor solução realmente seja 1 para receber as notificações + 1 pra processalas + 1 pra front end + 1 pro DB. mas isso acredito que ficaria muitooo caro.

 

Share this post


Link to post
Share on other sites
  • 0
2 hours ago, gbandoni said:

Você grava todas as notificações em banco de dados ?

Eu uso mysql 5.7 na minha aplicação numa plataforma mais simples que a sua

proc.png.1b4cf94b52f7723235ff09a5d7c7368d.png

 

PS - Parece meio comico restringir o tamanho de TODOS os arquivos anexados a 500kb por usuário. Se tu fizer um guia para usuários novatos não ficarem repetindo perguntas la se vai o espaço

 

Sim, gravo todas no DB... dai depois tenho tarefas cron que processa elas... e vao atualizando com true... ai tenho rotina que vai sempre limpando o banco de dados.

la ultilizo o mysql 5.6... o rapaz que gerencia la colocou a 5.7 mas deu incompatibilidade de acentuação quando ele importou! dai tivemos que voltar pra 5.6. 😞

não entendi o Ps. kkk 

Share this post


Link to post
Share on other sites
  • 0
38 minutes ago, ronaldoguedess said:

conversando mais com ele depois ele me disse q é manual, ele identifica o sobreacarregamento da maquina e passa pra outra.

isso que ele disse de "ser manual" não faz o menor sentido... kkk

Share this post


Link to post
Share on other sites
  • 0
7 minutes ago, mldev said:

isso que ele disse de "ser manual" não faz o menor sentido... kkk

Pois é... kkkkk não tem nenhum sentido isso...  isso tem q atuar de forma automatica pelo que li...
Meu conhecimento de servidor não é muito bom, mas qando ele falou isso ja desconfiei!! tenho que ir atrás de outro!
Vou dar uma olhada nos  Azure e AWS como sugeriu!

Obrigado mesmo.

Share this post


Link to post
Share on other sites
  • 0
On 1/21/2019 at 12:39 PM, ronaldoguedess said:

Eu tambem achei estranho.... tanto que quando usava as Clouds Linode não tinha esse problema...

Não esta.. é tudo no mesmo servidor... o segundo servidor que eu mencionei, é para Hight Avaliable e Loadbalancer... coisa que não vi funcionar até hoje pra ser sinsero... até mesmo quando aconteceu um problema, eu desliguei a maquina 1 pra ver se a segunda assumia e nada.. dai ele me disse q eu nao deveria ter feito aquilo... conversando mais com ele depois ele me disse q é manual, ele identifica o sobreacarregamento da maquina e passa pra outra... mas olhando os dados... a segunda maquina fica em uso igual a primeira. kkk o que é mais estranho ainda... tenho que arrumar outro servidor pra sair desse... não estou satisfeito ali....

Como eu disse na primeira resposta:
 tinha uma de 8GB de RAM e 4nucleos.... dedicado ao banco de dados... 1 instancia com 2 nucleos e 4gb de ram para o frontend, e 1 instnacia de 1GB e 1 nucleo para meus crons... usava nginx, configurado por mim mesmo... mas tinha um problema... qualquer solciitação longa, exemplo conectar uma conta, exportar produtos... ja removia o acesso de todos os clientes o chrome mostrava "Waiting for avaliables sockets" e com isso comecava a perder notificações... cliente perdia acesso... era um caos... talvez estava mal configurado...  quando contratei os dedicados o cara falou q era pq la eu só tinha 1 thread por nucleo...  mas estou desconfado... pois ele disse q tinha hightavaliable, e balanceamento de carga mas nunca vi isso funcionar... 

Foi configurado no Centos, com cpanel + Ngixn...  ainda não verifique quantas estou recebendo por minuto, mas varia... tem um cliente que ultimamente ja tem uns 20 mil produtos e ta subindo produtos em massa... dasi as vezes acontece de chegar muitasss mesmo... deve ser isso... e como ta tudo na mesma maquina ta bugando.... acredito que a melhor solução realmente seja 1 para receber as notificações + 1 pra processalas + 1 pra front end + 1 pro DB. mas isso acredito que ficaria muitooo caro.

 

Só voltei a ver isso hoje. Recomendo não deixar tudo em uma mesma máquina, mas se não puder, se forem instâncias isoladas já ajuda. Só não deixe tudo em uma mesma instância Mesmo que ela seja muito parruda, os recursos ficam concorrendo entre si. Aqui eu uso servidores bem parecidos que o seu e a performance tá suave, mesmo nos picos de processamento. Processo em média 3000 notificações por minuto com picos de até 8000 por minuto e tá de boa.

Sua configuração está boa pro banco. Eu separaria o front end nesta máquina de 4GB e deixaria outra instância de 4GB semelhante, para os processos de backend e cron. E esta outra instância de 1GB apenas para receber notificações do ML e colocar em uma fila. Assim ela não concorre com o front end e não prejudica o acesso dos seus usuários nos momentos de pico. Além disso, se ela ficar sobrecarregada, seus usuários não perdem o acesso.

Não esqueça de ajustar o nginx com relação à memória usada, quantidade de conexões, etc. O mesmo para a máquina do banco de dados. Se possível troque o mysql pelo mariadb. Eles são compatíveis, mas o mariadb gerencia um pouco melhor a memória na minha opinião.

Edited by Diogenes Lima

Share this post


Link to post
Share on other sites
  • 0
Posted (edited)
On 1/18/2019 at 12:07 AM, ronaldoguedess said:

Ola tudo bem? estou com um problema de muito uso do processador de meu servidor, o pessoal que o gerencia disse que o problema é as notificações...
dissem que eu deveria usar menos o mysql.

Existe alguma solução pra eu não ficar gravando a todo instante a notificação no banco de dados?
Queria uma forma de agrupar elas, e gravar de uma vez... ou gravar em outro lugar sem ser o mysql, algum forma que seja facil pra gerenciar.

Eu já não sei o que fazer... meu servidor esta 100% em uso todos os 6 nucleos... 
uso um 2 dedicados para o sitema e mesmo assim ta dessa forma.
http://prntscr.com/m8p0pk

 

 

 

Se é informação repetida, tu dá o unique_id no resource.

Não esquece de enviar o ok resposta 200 pro servidor do mercado livre no ato do recebimento, antes de incluir o dado no banco de dados, então, se por algum motivo for dado repetido, o unique id irá reter e não irá usar o banco nele.

Quando usar a notificação de fato, pode dar um delete na linha do banco, e quando voce receber ela novamente, então será inclusa ao banco.

É assim que eu faço,

Eu tenho um cron rodando a cada 1 minuto executa todas notificações salvas no banco.

Sendo que cada vez que recebo a notificação eu salvo no banco e dou o ok 200, além de proteger o banco com unique id dentro deste 1 minuto.

Fica super rápido

Mas a parte do cron a cada 1 minuto você pode eliminar caso necessite de maior exatidão no sistema que está sua api.

O meu é provisório pois pretendo futuramente rodar no mesmo momento do recebimento.

Edited by andre machado

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now