Atualização de um aplicativo com contêineres

O tópico descreve como atualizar um Snowflake Native App with Snowpark Container Services.

Sobre a atualização de um aplicativo com contêineres

O processo de atualização de um aplicativo com contêineres tem duas etapas principais:

  • Atualize os serviços nos contêineres gerenciados pelo aplicativo.

    Como outros Snowpark Continer Services, os aplicativos de contêiner usam o comando ALTER SERVICE para modificar um serviço com base em um arquivo de especificação de serviço para a nova versão. Este comando é executado de forma assíncrona.

  • Atualize outros objetos no aplicativo.

    Após os serviços serem atualizados com sucesso, outros objetos dentro do aplicativo serão atualizados. Isto é semelhante ao processo de atualização normal do Snowflake Native App. Consulte Sobre upgrades para obter mais informações.

O desafio ao atualizar um aplicativo com contêineres é que o comando ALTER SERVICE é executado de forma assíncrona. Se um provedor adicionar esse comando diretamente ao script de configuração, o script de configuração continuará a ser executado enquanto a atualização do serviço estiver em andamento. Os provedores precisam escrever o código para a atualização do serviço para que os serviços sejam atualizados corretamente antes de continuar a atualização para outros objetos no aplicativo.

Para lidar corretamente com as atualizações de serviço, o Snowflake Native App Framework fornece recursos que permitem ao aplicativo:

  • Pause a execução do script de configuração até que os serviços sejam atualizados com sucesso ou falhem. Os provedores devem garantir que o script de configuração possa lidar com possíveis situações. Consulte Pausa na execução do script de configuração para obter mais informações.

  • Use uma função de retorno de chamada para reverter serviços atualizados anteriormente para uma versão anterior se a atualização falhar. Consulte Coordenação de atualizações de serviços para obter mais informações.

Pausa na execução do script de configuração

Para permitir que os serviços sejam atualizados corretamente, os provedores podem pausar o script de configuração usando a função do sistema SYSTEM$WAIT_FOR_SERVICES dentro do script de configuração. O exemplo a seguir mostra como utilizar esta função do sistema:

SELECT SYSTEM$WAIT_FOR_SERVICES(600, 'services.web_ui', 'services.worker, 'services.aggregation');
Copy

Este comando faz com que o script de configuração seja pausado até que uma das seguintes situações ocorra:

  • Todos os serviços nomeados passados para a função do sistema têm o status READY.

  • Qualquer um dos serviços nomeados tem o status FAILED.

  • 600 segundos se passaram.

Coordenação de atualizações de serviços

O Snowflake Native App Framework fornece uma função de retorno de chamada que permite aos provedores sincronizar os serviços de atualização com o restante do procedimento de atualização.

Possíveis conflitos ao atualizar serviços

Durante a atualização de um Snowflake Native App do núcleo, o script de configuração atualiza para a nova versão do aplicativo modificando objetos dentro de um esquema com versão. Se ocorrer um erro durante a atualização, os objetos dentro do esquema versionado retornarão à versão anterior do aplicativo.

No caso de um aplicativo com contêineres, os serviços são modificados executando o comando ALTER SERVICE no script de instalação com base em um arquivo de especificação de serviço aplicável à nova versão. Como os serviços não são criados dentro de esquemas com versão, um serviço é atualizado assim que o ALTER SERVICE é executado com sucesso. Se houver uma falha posteriormente no script de configuração, por exemplo, os objetos em esquemas versionados serão revertidos para a versão anterior, mas os serviços modificados serão aqueles da nova versão.

Use uma função de retorno de chamada do inicializador de versão para gerenciar atualizações de serviço

O Snowflake Native App Framework fornece um inicializador de versão usado para iniciar ou atualizar serviços ou outros processos relacionados, por exemplo, tarefas. O inicializador de versão é um procedimento armazenado de retorno de chamada especificado no arquivo de manifesto.

A função de retorno de chamada do inicializador de versão é invocada nos seguintes contextos:

  • Durante a instalação, o inicializador de versão é chamado assim que o script de configuração do aplicativo termina sem erros.

  • Durante a atualização do inicializador de versão, há dois cenários possíveis:

    • Se o script de configuração da nova versão for bem-sucedido, a nova versão do inicializador de versão será chamada.

    • Se o script de configuração ou o inicializador de versão da nova versão falhar, o inicializador de versão da versão anterior será chamado. Isso permite que o inicializador da versão anterior use o ALTER SERVICE para reverter os serviços para a versão anterior.

Especificação do inicializador da versão

Para especificar o procedimento armazenado usado como inicializador de versão, adicione o seguinte ao arquivo manifest.yml:

lifecycle_callbacks:
  version_initializer: callbacks.version_init
Copy

Neste exemplo, a propriedade version_initializer é definida como um procedimento armazenado denominado version_init dentro de um esquema denominado callbacks.

No script de configuração, um provedor pode definir esse procedimento dentro de um esquema com versão, conforme mostrado no exemplo a seguir:

CREATE OR ALTER VERSIONED SCHEMA callbacks;

CREATE OR REPLACE PROCEDURE callbacks.version_init()
  ...
  -- body of the version_init() procedure
  ...
Copy

Práticas recomendadas ao atualizar aplicativos com contêineres

  • Tenha cuidado ao definir o valor de tempo limite para a função do sistema SYSTEM$WAIT_FOR_SERVICES().

  • A Snowflake recomenda criar o procedimento armazenado usado como inicializador de versão dentro de um esquema versionado. Se este procedimento armazenado não for criado dentro de um esquema de versão, o inicializador de versão poderá não existir.

  • Se um aplicativo especificar um inicializador de versão, o aplicativo não deverá tentar iniciar ou atualizar serviços dentro do script de configuração.

  • O inicializador de versão não requer a concessão de funções de aplicativo.