Oi, eu tenho no meu sistema, uma requisição a um webservice. Separei essa requisição em um service.php; No controller da aplicação eu chamo esse serviço, pois o mesmo aparece em outras rotas, pra não ficar repetindo código; Na blade, eu mando exibir, e demora um pouco, a pagina fica carregando, mas não é só isso, na mesma pagina tenho mais conteúdo de banco de dados também. Como eu posso fazer uma fila para essa requisição, e ao mesmo tempo mostrar a pagina para o usuário com os dados do banco, e somente depois dos dados do webservice aparecer?
Olá, Rafael. Acredito que por você estar usando o Sail, não foi preciso instalar o predis ou phpredis. Pois no caso o phpredis já vem por padrão no container. Certo ? Uma outra dúvida. Quando usamos "database", ao invés de redis, conseguimos ver os processos (antes de executarmos a fila) na tabela "jobs" e os que falharam na tabela "failed_jobs". Agora, quando usamos "redis", onde conseguimos ver esses jobs e esses jobs que falharam ?
No meu caso, o projeto está em um servidor remoto compartilhado, mas eu tenho acesso ao terminal, nesse caso dou o comando php artisan queue:word normalmente para iniciar, ou tem outra forma que geralmente fazem?
Fala Rafael, posso disparar um job dentro de outro job? A ideia é ter um job a cada 30 minutos.. esse job a cada 30 minutos vai fazer um foreach em uma tabela e a cada registro disparar um job para evitar problemas de um falhar e não executar os outros, ta certo isso?
certíssimo.. é o aconselhado. nunca deixa um job com o foreach torando toda a lógica. usa o foreach pra criar novos jobs e deixa a fila executar os jobs criados pelo foreach.. senão você perde todo o pq da fila.
No sistema, tenho 5 base de dados diferente, cada base tem cerca de 30 usuários, e cada usuário faz o login na sua base (para logar, eles passam user,pass e base(nome da empresa) . 1-Como colocar uma fila para rodar recebendo jobs das 5 bases ? 2-Quando executar , como falar para fila qual base ele precisa pegar os dados? tendo em vista que nao vai servir a base do .env e sim a base do usuário que logou e disparou o job
Cara, tu tem que passar a informação de qual base para o job de alguma maneira. Não sei como você vê essa configuração no banco, se você tem um Tenant ID algo assim, mas você precisa passar pro job e no job você seta o banco de dados que vai usar pra aquele sequencia de transações.
Gostaria de fazer uma função automática que alteraria o dado de uma tabela de cobrança, caso o data de vencimento na tabela seja menor que a data atual, alterar status para pagamento atrasado. Qual seria a maneira de fazer isso
@@PinguimDoLaravel como funciona o schedule:work quando se tem load balancing da aws? por exemplo, tem 3 máquinas ec2. Nesse caso acho melhor criar um lambda que aciona por agendamento que faz as queries e updates q ele precisa
Como deixo o work rodando ou sendo acionado automaticamente sem a necessidade de acionar via comando? Ex: crio uma api onde vou receber 10mil requisição com dados em json. Pego essas requisição e salvo os dados no banco. Após isso preciso que o sistema processe cada registro, pegue esses dados do banco faça algumas função com eles.. como deixo isso autômatico ?
Você vai precisar configurar o seu servidor para deixar um serviço da queue:work rodando sempre. Na documentação do Laravel tem os detalhes de como você faz isso: laravel.com/docs/9.x/queues#supervisor-configuration Agora para o seu processo: 1. Para cada requisição recebida precisa disparar um job para a fila para ser executado assim que possível ( até para salvar no banco de dados ) 2. Você pode deixar todo esse teu processamento dentro do job que você vai disparar logo que você receber o request
Conhecendo seu canal hoje. Obrigado pelo conteúdo!
Que aula top mano, didática mt boa!
O meu codigo o schedule nao funciona somente o queue
Oi, eu tenho no meu sistema, uma requisição a um webservice.
Separei essa requisição em um service.php;
No controller da aplicação eu chamo esse serviço, pois o mesmo aparece em outras rotas, pra não ficar repetindo código;
Na blade, eu mando exibir, e demora um pouco, a pagina fica carregando, mas não é só isso, na mesma pagina tenho mais conteúdo de banco de dados também.
Como eu posso fazer uma fila para essa requisição, e ao mesmo tempo mostrar a pagina para o usuário com os dados do banco, e somente depois dos dados do webservice aparecer?
Olá, Rafael.
Acredito que por você estar usando o Sail, não foi preciso instalar o predis ou phpredis. Pois no caso o phpredis já vem por padrão no container. Certo ?
Uma outra dúvida. Quando usamos "database", ao invés de redis, conseguimos ver os processos (antes de executarmos a fila) na tabela "jobs" e os que falharam na tabela "failed_jobs". Agora, quando usamos "redis", onde conseguimos ver esses jobs e esses jobs que falharam ?
isso.. o container do sail já vem com as dependências necessárias.
você consegue ver o que tem no redis através do Horizon ..
@@PinguimDoLaravel Show. E em prod, tem alguma sugestão ?
No meu caso, o projeto está em um servidor remoto compartilhado, mas eu tenho acesso ao terminal, nesse caso dou o comando php artisan queue:word normalmente para iniciar, ou tem outra forma que geralmente fazem?
Crontab
Amigo, você usa Laravel Horizon em produção? Recomenda?
Uso muito. Funciona lindo
Fala Rafael, posso disparar um job dentro de outro job? A ideia é ter um job a cada 30 minutos.. esse job a cada 30 minutos vai fazer um foreach em uma tabela e a cada registro disparar um job para evitar problemas de um falhar e não executar os outros, ta certo isso?
certíssimo.. é o aconselhado. nunca deixa um job com o foreach torando toda a lógica. usa o foreach pra criar novos jobs e deixa a fila executar os jobs criados pelo foreach.. senão você perde todo o pq da fila.
No sistema, tenho 5 base de dados diferente, cada base tem cerca de 30 usuários, e cada usuário faz o login na sua base (para logar, eles passam user,pass e base(nome da empresa) .
1-Como colocar uma fila para rodar recebendo jobs das 5 bases ?
2-Quando executar , como falar para fila qual base ele precisa pegar os dados? tendo em vista que nao vai servir a base do .env e sim a base do usuário que logou e disparou o job
Cara, tu tem que passar a informação de qual base para o job de alguma maneira. Não sei como você vê essa configuração no banco, se você tem um Tenant ID algo assim, mas você precisa passar pro job e no job você seta o banco de dados que vai usar pra aquele sequencia de transações.
Gostaria de fazer uma função automática que alteraria o dado de uma tabela de cobrança, caso o data de vencimento na tabela seja menor que a data atual, alterar status para pagamento atrasado. Qual seria a maneira de fazer isso
um comando que roda todo dia via schedule:work varrendo a tabela de cobrança aplicando essa lógica
@@PinguimDoLaravel como funciona o schedule:work quando se tem load balancing da aws? por exemplo, tem 3 máquinas ec2.
Nesse caso acho melhor criar um lambda que aciona por agendamento que faz as queries e updates q ele precisa
@@fabioselau4576 deixa uma das máquinas responsável pelo schedule: work . não precisa das 3 rodando o schedule senão vai triplicar a chamada
Como deixo o work rodando ou sendo acionado automaticamente sem a necessidade de acionar via comando?
Ex: crio uma api onde vou receber 10mil requisição com dados em json. Pego essas requisição e salvo os dados no banco. Após isso preciso que o sistema processe cada registro, pegue esses dados do banco faça algumas função com eles.. como deixo isso autômatico ?
Você vai precisar configurar o seu servidor para deixar um serviço da queue:work rodando sempre.
Na documentação do Laravel tem os detalhes de como você faz isso: laravel.com/docs/9.x/queues#supervisor-configuration
Agora para o seu processo:
1. Para cada requisição recebida precisa disparar um job para a fila para ser executado assim que possível ( até para salvar no banco de dados )
2. Você pode deixar todo esse teu processamento dentro do job que você vai disparar logo que você receber o request