Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O SendGrid para PHP é lento. As solicitações sem bloqueio são possíveis?


Para responder à primeira parte da sua pergunta:Sim, você pode fazer solicitações assíncronas com PHP , e até mesmo ignorar a resposta do serviço. No entanto, como você diz corretamente, não é uma ótima solução.

Solicitações assíncronas


Esta excelente postagem no blog sobre solicitações assíncronas do PHP por Segment.io chega a várias conclusões:
  • Você pode abrir um soquete e escrever nele , conforme descrito por este tópico do Stack Overflow - No entanto, parece que isso está realmente bloqueando e bastante lento (300ms em seus testes).
  • Você pode gravar em um arquivo de log e processá-lo de outra maneira (essencialmente uma fila, como você descreve) - No entanto, isso requer outro processo para ler o log e processá-lo. O uso do sistema de arquivos pode ser lento e arquivos compartilhados podem causar todos os tipos de problemas.
  • Você pode fork uma solicitação cURL - No entanto, isso significa que você não está esperando por uma resposta, portanto, se o SendGrid (ou algum outro serviço) responder com um erro, você não poderá pegá-lo e reagir.

Terra da opinião


Agora estamos entrando no terreno da semi-opinião , mas as filas como você descreve (como uma mySQL com um cron job, ou um arquivo de texto ou qualquer outra coisa) tendem a ser muito escaláveis, pois você pode lançar trabalhadores na fila se precisar processar mais rapidamente. Eles podem estar fora do sistema voltado para o usuário (e, portanto, não compartilham recursos).

Filas


Com uma fila, você teria um serviço separado que seria responsável por enviar um e-mail com SendGrid (por exemplo). Ele retiraria tarefas de uma fila (por exemplo, "enviar um email para Nick") e depois executaria nela.

Existem várias maneiras de implementar filas que você pode processar.
  • Você pode escrever o seu próprio - Como você parece querer ficar no PHP/mySQL, se você fizer isso, precisará levar em conta vários problemas de filas e casos extremos estranhos. No entanto, você terá controle absoluto e, para um aplicativo simples, talvez isso funcione.
  • Você pode implementar uma fila de tarefas auto-hospedada - Aipo deve ser uma fila de tarefas distribuída, øMQ (ZeroMQ) e RabbitMQ também pode ser usado como Filas de Tarefas. Estes são feitos para serem rápidos e distribuídos e tiveram muita reflexão sobre eles. Você precisaria compará-los em seu sistema para ver se eles o aceleram. Isso também significa que você tem que hospedar peças adicionais. No entanto, essa provavelmente será a solução mais rápida do ponto de vista da comunicação.
  • Você pode passar coisas para uma fila de tarefas hospedada - IronMQ e Amazon SQS ambas são soluções hospedadas legais, o que significa que você não precisaria dedicar recursos a elas, adicionalmente com IronWorkers (por exemplo) você poderia ter o outro serviço cuidado. No entanto, como você está tentando otimizar uma solicitação para um serviço externo, essa provavelmente não é a solução neste cenário.

Enfileiramento de e-mails


No tópico de enfileirar e-mails (especificamente), isso é algo comum aos remetentes de e-mail. Como em todo o resto, isso significa que você pode ter melhor confiabilidade (porque se um serviço abaixo da linha falhar, você poderá mantê-lo na fila e tentar novamente).

No entanto, com o e-mail, existem alguns serviços específicos para enfileirar mensagens. Estes são servidores SMTP. Teoricamente, você pode configurar um servidor como sendmail e então defina SendGrid como seu "smarthost" ou retransmitir e fazer com que o servidor envie para o SendGrid. Em seguida, ele enfileira e lida com interrupções de serviço e envia e-mails com pouco código adicional. No entanto , os servidores SMTP são difíceis de lidar, mesmo que estejam apenas encaminhando mensagens. Além disso, o SMTP é ainda mais lento que o HTTP para estabelecer uma conexão e, portanto, provavelmente não é o que você deseja, mas é bom saber.