Servidor de aplicativos GraphQL

O Commerce GraphQL Application Server permite que o Adobe Commerce mantenha o estado entre as solicitações de API do Commerce GraphQL. O GraphQL Application Server, que é criado na extensão Swoole, opera como um processo com threads de trabalho que lidam com o processamento de solicitações. Ao preservar um estado de aplicativo inicializado entre as solicitações de API do GraphQL, o GraphQL Application Server aprimora o manuseio de solicitações e o desempenho geral do produto. As solicitações de API tornam-se significativamente mais eficientes.

O GraphQL Application Server está disponível somente para o Adobe Commerce. Não está disponível para o Magento Open Source. Você deve enviar um tíquete de Suporte da Adobe Commerce para habilitar o Servidor de Aplicativos GraphQL em projetos Pro.

NOTE
No momento, o GraphQL Application Server não é compatível com Amazon Simple Storage Service (AWS S3). Os clientes do Adobe Commerce na infraestrutura em nuvem que atualmente usam o AWS S3 para armazenamento remoto não podem usar o GraphQL Application Server até que o Adobe libere um hotfix posteriormente em 2024.

Arquitetura

O GraphQL Application Server mantém o estado entre as solicitações de API do Commerce GraphQL e elimina a necessidade de inicialização. Ao compartilhar o estado do aplicativo entre os processos, as solicitações do GraphQL tornam-se significativamente mais eficientes, reduzindo os tempos de resposta em até 30%.

O modelo de execução do PHP sem compartilhamento oferece um desafio da perspectiva de latência porque cada solicitação requer o bootstrapping da estrutura. Esse processo de inicialização inclui tarefas demoradas, como ler a configuração, configurar o processo de inicialização e criar objetos de classe de serviço.

A transição da lógica de manipulação de solicitações para um loop de eventos no nível do aplicativo parece solucionar o desafio de simplificar o processamento de solicitações em um nível corporativo. Essa abordagem elimina a necessidade de bootstrapping durante o ciclo de vida de execução da solicitação.

Vantagens

O GraphQL Application Server permite que o Adobe Commerce mantenha o estado entre solicitações consecutivas da API do Commerce GraphQL. O compartilhamento do estado do aplicativo entre solicitações melhora a eficiência da solicitação da API, minimizando a sobrecarga do processamento e otimizando o manuseio de solicitações. Como resultado, o tempo de resposta de solicitação do GraphQL pode ser reduzido em até 30%.

Requisitos do sistema

A execução do GraphQL Application Server requer o seguinte:

  • PHP 8.2 ou superior
  • Extensão PHP v5+ Swoole instalada
  • RAM e CPU adequadas com base na carga esperada

Ativar e implantar na infraestrutura em nuvem

O módulo ApplicationServer (Magento/ApplicationServer/) habilita o Servidor de Aplicativos GraphQL.

Habilitar projetos Pro

NOTE
O servidor de aplicativos é um recurso de opt-in nas instâncias do Cloud Pro. Para ativá-lo, envie uma solicitação de suporte.

Depois que o recurso Servidor de aplicativos for ativado em seu projeto Pro, conclua as seguintes etapas antes de implantar o Servidor de aplicativos GraphQL:

  1. Implante o Adobe Commerce na infraestrutura de nuvem usando o modelo de nuvem da 2.4.7-ramificação appserver.

  2. Verifique se todas as suas personalizações e extensões do Commerce são compatíveis com o GraphQL Application Server.

  3. Clonar o projeto do Commerce Cloud.

  4. Ajuste as configurações no arquivo 'application-server/nginx.conf.sample' se necessário.

  5. Comente a seção 'web' ativa totalmente no arquivo project_root/.magento.app.yaml.

  6. Remova o comentário da seguinte configuração da seção 'web' no arquivo project_root/.magento.app.yaml que inclui o comando start do GraphQL Application Server.

    code language-yaml
    web:
        upstream:
            socket_family: tcp
            protocol: http
        commands:
            start: ./application-server/start.sh > var/log/application-server-status.log 2>&1
    
  7. Verifique se /application-server/start.sh é executável executando o seguinte comando:

    code language-bash
    chmod +x application-server/start.sh
    
  8. Adicione arquivos atualizados ao índice Git com este comando:

    code language-bash
    git add -f .magento.app.yaml application-server/*
    
  9. Confirme suas alterações com este comando:

    code language-bash
    git commit -m "AppServer Enabled"
    

Implantar projetos Pro

Após concluir as etapas de ativação, envie as alterações para o repositório Git para implantar o GraphQL Application Server:

git push

Habilitar projetos iniciais

Conclua as seguintes etapas antes de implantar o GraphQL Application Server em projetos iniciais:

  1. Implante o Adobe Commerce na infraestrutura de nuvem usando o modelo de nuvem da 2.4.7-ramificação appserver.

  2. Verifique se todas as personalizações e extensões do Commerce são compatíveis com o GraphQL Application Server.

  3. Confirme se a variável de ambiente CRYPT_KEY está definida para sua instância. Você pode verificar o status dessa variável no Portal de projetos na nuvem (interface de integração).

  4. Clonar o projeto do Commerce Cloud.

  5. Renomeie application-server/.magento/.magento.app.yaml.sample como application-server/.magento/.magento.app.yaml e ajuste as configurações em .magento.app.yaml, se necessário.

  6. Descomente a configuração da rota a seguir no arquivo project_root/.magento/routes.yaml para redirecionar o tráfego /graphql para o GraphQL Application Server.

    code language-yaml
    "http://{all}/graphql":
        type: upstream
        upstream: "application-server:http"
    
  7. Adicionar arquivos atualizados ao índice Git:

    code language-bash
    git add -f .magento/routes.yaml application-server/.magento/*
    
  8. Confirme suas alterações:

    code language-bash
    git commit -m "AppServer Enabled"
    
NOTE
Verifique se todas as configurações personalizadas no arquivo raiz .magento.app.yaml foram migradas adequadamente para o arquivo application-server/.magento/.magento.app.yaml. Depois que o arquivo application-server/.magento/.magento.app.yaml for adicionado ao seu projeto, você deverá mantê-lo além do arquivo .magento.app.yaml raiz. Por exemplo, se você precisar configurar o rabbitmq ou gerenciar propriedades da Web, adicione a mesma configuração ao application-server/.magento/.magento.app.yaml também.

Implantar projetos iniciais

Após concluir as etapas de habilitação, envie as alterações para o repositório Git para implantar o GraphQL Application Server:

git push

Verificar habilitação em projetos na nuvem

  1. Execute uma consulta ou mutação do GraphQL na sua instância para confirmar se o ponto de extremidade graphql está acessível. Por exemplo:

    code language-none
    mutation {
     createEmptyCart
    }
    

    A resposta esperada deve ser semelhante a este exemplo:

    code language-json
    {
     "data": {
         "createEmptyCart": "HLATPzcLw5ylDf76IC92nxdO2hXSXOrv"
         }
     }
    
  2. Use SSH para acessar a instância da nuvem. O project_root/var/log/application-server.log deve conter um novo registro de log para cada solicitação GraphQL.

  3. Você também pode verificar se o GraphQL Application Server está em execução executando o seguinte comando:

    code language-bash
    ps aux|grep php
    

    Você deve ver um processo bin/magento server:run com vários threads.

Se essas etapas de verificação forem bem-sucedidas, o GraphQL Application Server estará em execução e atendendo a /graphql solicitações.

Habilitar projetos locais

O módulo ApplicationServer (Magento/ApplicationServer/) habilita o GraphQL Application Server para APIs GraphQL.

A execução local do GraphQL Application Server requer a instalação da extensão Swoole e uma pequena alteração no arquivo de configuração Nginx da implantação.

Pré-requisitos

Conclua as seguintes etapas antes de habilitar o módulo ApplicationServer:

  • Configurar Nginx
  • Instalar e configurar a extensão Swoole v5+

Configurar Nginx

A implantação específica do Commerce determina como configurar o Nginx. Em geral, o arquivo de configuração Nginx é nomeado por padrão nginx.conf e é colocado em um destes diretórios: /usr/local/nginx/conf, /etc/nginx, ou /usr/local/etc/nginx. Consulte o Guia do Iniciante para obter mais informações sobre a configuração do Nginx.

Exemplo de configuração do Nginx:

location /graphql {
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_pass http://127.0.0.1:9501/graphql;
}

Instalar e configurar Swoole

Para executar o GraphQL Application Server localmente, instale a extensão Swoole (v5.0 ou superior). Há várias maneiras de instalar essa extensão.

O procedimento seguinte descreve como instalar a extensão Swoole para PHP 8.2 em sistemas baseados em OSX. É uma das várias maneiras de instalar a extensão Swoole.

pecl install swoole

Durante a instalação, o Adobe Commerce exibe prompts para habilitar o suporte para openssl, mysqlnd, sockets, http2 e postgres. Digite yes para todas as opções, exceto postgres.

Verificar a instalação do Swoole

Confirme se a extensão foi ativada com sucesso:

php -m | grep swoole

Erros comuns na instalação do Swoole

Todos os erros que ocorrem durante a instalação do Swoole normalmente ocorrem durante a fase de instalação do pecl. Os erros típicos incluem arquivos openssl.h e pcre2.h ausentes. Para resolver esses erros, verifique se esses dois pacotes estão instalados no sistema local.

  • Verifique o local de openssl executando:
openssl version -d

Este comando mostra o caminho onde o openssl está instalado.

  • Verifique o local de pcre2 executando:
pcre2-config --prefix

Use o Homebrew para instalar os pacotes ausentes se a saída do comando indicar que os arquivos estão ausentes:

brew install openssl
brew install pcre2

Resolver problemas com o openssl

Para resolver problemas relacionados a openssl, execute:

export LDFLAGS="-L/opt/homebrew/etc/openssl@3/lib" export CPPFLAGS="-I/opt/homebrew/etc/openssl@3/include"

Confirme se você está usando o caminho do ambiente dev local.

Confirmar resolução de problemas relacionados ao openssl

Você pode executar o comando a seguir novamente para verificar se os problemas relacionados ao openssl foram resolvidos:

pecl install swoole

Resolver problemas com pcre2.h

Para resolver problemas relacionados a pcre2.h, vincule o caminho pcre2.h ao diretório de extensão PHP instalado. Sua versão específica instalada do PHP e do pcr2.h determina a versão específica do comando que você deve usar.

Executar o GraphQL Application Server

Iniciar o GraphQL Application Server:

bin/magento server:run

Esse comando inicia uma porta HTTP em 9501. Depois que o GraphQL Application Server é iniciado, a porta 9501 se torna um servidor proxy HTTP para todas as consultas do GraphQL.

Para confirmar se o GraphQL Application Server está em execução na implantação:

ps aux | grep php

Outras maneiras de confirmar que o GraphQL Application Server está em execução incluem:

  • Verifique o arquivo /var/log/application-server.log para entradas relacionadas a solicitações GraphQL processadas.
  • Tente se conectar à porta HTTP em que o GraphQL Application Server é executado. Por exemplo: curl -g 'http://localhost:9501/graph.

Confirme se as solicitações do GraphQL estão sendo processadas

O GraphQL Application Server adiciona o cabeçalho de resposta X-Backend com o valor graphql_server a cada solicitação processada. Para verificar se uma solicitação foi tratada pelo GraphQL Application Server, verifique esse cabeçalho de resposta.

Confirmar compatibilidade de extensão e personalização

Os desenvolvedores e comerciantes de extensões devem primeiro verificar se sua extensão e código de personalização seguem as diretrizes técnicas descritas em Diretrizes técnicas.

Considere estas diretrizes durante a avaliação do código:

  • As classes de serviço (ou seja, classes que fornecem comportamento, mas não dados, como EventManager) não devem ter estado mutável.
  • Evite o acoplamento temporal.

Desativar o servidor de aplicativos GraphQL

Os procedimentos para desabilitar o GraphQL Application Server variam dependendo se o servidor está sendo executado em uma implantação local ou na nuvem.

Desabilitar o GraphQL Application Server (nuvem)

  1. Remova quaisquer novos arquivos e quaisquer outras alterações de código que tenham sido incluídas na confirmação AppServer Enabled durante seus preparativos para a implantação.

  2. Confirme as alterações usando este comando:

    code language-bash
    git commit -m "AppServer Disabled"
    
  3. Implante essas alterações usando este comando:

    code language-bash
    git push
    

Desabilitar o GraphQL Application Server (local)

  1. Comente a seção /graphql do arquivo nginx.conf que você adicionou ao habilitar o GraphQL Application Server.
  2. Reinicie o nginx.

Esse método de desativação do GraphQL Application Server pode ser útil para testar ou comparar rapidamente o desempenho.

Confirme se o GraphQL Application Server está desativado

Para confirmar se as solicitações do GraphQL estão sendo processadas por php-fpm em vez do GraphQL Application Server, digite este comando: ps aux | grep php.

Depois que o GraphQL Application Server for desativado:

  • bin/magento server:run está inativo.
  • var/log/application-server.log não contém entradas após solicitações GraphQL.

Integração e testes funcionais do GraphQL Application Server

Os desenvolvedores de extensão podem executar dois testes de integração para verificar a compatibilidade da extensão com o GraphQL Application Server: GraphQlStateTest e ResetAfterRequestTest.

GraphQlStateTest

GraphQlStateTest detecta o estado em objetos compartilhados que não deve ser reutilizado para solicitações múltiplas.

Este teste foi projetado para detectar alterações de estado em objetos de serviço produzidos pelo ObjectManager. O teste executa consultas GraphQL idênticas duas vezes e compara o estado do objeto de serviço antes e depois da segunda consulta.

Falhas de GraphQlStateTest e possível correção

  • Não é possível adicionar, ignorar ou filtrar uma lista. Se você encontrar uma falha que sugira que não é seguro adicionar, ignorar ou filtrar uma lista, considere se a classe pode ser refatorada de uma maneira compatível com versões anteriores para usar as fábricas das classes de serviço que têm estado mutável.

  • A classe exibe um estado mutável. Se a própria classe exibir um estado mutável, tente reescrever seu código para contornar esse estado. Se o estado mutável for necessário por motivos de desempenho, implemente ResetAfterRequestInterface e use _resetState() para redefinir o objeto para seu estado construído inicial.

  • A propriedade digitada $x não deve ser acessada antes da mensagem de inicialização. Falhas com esse tipo de mensagem sugerem que a propriedade especificada não foi inicializada pelo construtor. Esta é uma forma de acoplamento temporal que ocorre porque o objeto não pode ser usado após ser construído inicialmente. Essa combinação ocorre mesmo se a propriedade for privada porque o Coletor que recupera os dados das propriedades está usando o recurso de reflexão do PHP. Nesse caso, tente refatorar a classe para evitar acoplamento temporal e evitar estado mutável. Se essa refatoração não resolver a falha, você poderá alterar o tipo de propriedade para um tipo anulável para que ele possa ser inicializado como nulo.  Se a propriedade for uma matriz, tente inicializar a propriedade como uma matriz vazia.

Executar GraphQlStateTest executando vendor/bin/phpunit -c $(pwd)/dev/tests/integration/phpunit.xml dev/tests/integration/testsuite/Magento/GraphQl/App/GraphQlStateTest.php.

ResetAfterRequestTest

ResetAfterRequestTest procura todas as classes que implementam ResetAfterRequestInterface e verifica se o método _resetState() retorna o estado de um objeto ao mesmo estado que ele manteve após ser construído por ObjectManager.  Este teste cria um objeto de serviço com ObjectManager, clona esse objeto, chama _resetState() e compara ambos os objetos. O teste não chama nenhum método entre a instanciação de objeto e _resetState(), portanto, não confirma a redefinição de nenhum estado mutável. Ele não encontra problemas em que um erro ou erro de digitação em _resetState() possa definir o estado para algo diferente do que era originalmente.

Falhas de ResetAfterRequestTest e possível correção

  • A classe tem valores de propriedade inconsistentes. Se esse teste falhar, verifique se uma classe foi alterada com o resultado de que o objeto após a construção tem valores de propriedade diferentes dos que tem após a chamada do método _resetState(). Se a classe em que você está trabalhando não contiver o método _resetState() em si, verifique a hierarquia de classe de uma superclasse que o implemente.

  • A propriedade digitada $x não deve ser acessada antes da mensagem de inicialização. Esse problema também ocorre com GraphQlStateTest.

    Executar ResetAfterRequestTest executando: vendor/bin/phpunit -c $(pwd)/dev/tests/integration/phpunit.xml dev/tests/integration/testsuite/Magento/Framework/ObjectManager/ResetAfterRequestTest.php.

Teste funcional

Os desenvolvedores de extensão devem executar testes funcionais de WebAPI para o GraphQL, bem como quaisquer testes funcionais automatizados ou manuais personalizados para o GraphQL, ao implantar o GraphQL Application Server. Esses testes funcionais ajudam os desenvolvedores a identificar possíveis erros ou problemas de compatibilidade.

Modo de Monitor de Estado

Durante a execução de testes funcionais (ou testes manuais), o servidor de aplicativos pode ser executado com o --state-monitor mode habilitado para ajudar a encontrar classes em que o estado está sendo reutilizado involuntariamente. Inicie o Servidor de Aplicativos normalmente, exceto para adicionar o parâmetro --state-monitor.

bin/magento server:run --state-monitor

Após cada solicitação ser processada, um novo arquivo é adicionado ao diretório tmp, por exemplo: var/tmp/StateMonitor-thread-output-50-6nmxiK. Após concluir o teste, esses arquivos poderão ser mesclados com o comando bin/magento server:state-monitor:aggregate-output, que cria dois arquivos mesclados, um em XML e um em JSON.

Exemplos:

/var/workspace/var/tmp/StateMonitor-json-2024-04-10T18:50:39Z-hW0ucN.json
/var/workspace/var/tmp/StateMonitor-junit-2024-04-10T18:50:39Z-oreUco.xml

Esses arquivos podem ser inspecionados com qualquer ferramenta usada para exibir XML ou JSON, que mostrará as propriedades modificadas dos objetos de serviço, como o GraphQlStateTest. O modo --state-monitor usa a mesma lista de salto e lista de filtro que GraphQlStateTest.

NOTE
Não use o modo --state-monitor na produção. Ele é projetado apenas para desenvolvimento e teste. Ele cria muitos arquivos de saída e será executado mais lentamente do que o normal.
NOTE
--state-monitor não é compatível com as versões do PHP 8.3.0 - 8.3.4 devido a um erro no coletor de lixo do PHP. Se você está usando o PHP 8.3, deve atualizar para 8.3.5 ou mais recente para usar este recurso.
recommendation-more-help
c0c5bbed-4957-4162-81bc-120c837a1894