FileVO: mudanças entre as edições
Linha 63: | Linha 63: | ||
{{nota|Configuração do Bucket do S3|O bucket do S3 deve ter as seguintes características definidas: | |||
* Ter a regra de versionamento ativa. | |||
}} | |||
Por não estar na transação do Container, o sistema de persistência do S3 nunca excluí de fato um arquivo. O Bucket utilizado deve ter o sistema de versionamento funcionando inclusive para arquivos excluídos. | Por não estar na transação do Container, o sistema de persistência do S3 nunca excluí de fato um arquivo. O Bucket utilizado deve ter o sistema de versionamento funcionando inclusive para arquivos excluídos. | ||
O BIS saberá qual é o arquivo correto de acordo com o '''VersionID''' fornecido pelo S3. Assim, mesmo que o Banco de dados sofra uma restauração anterior, o banco trará o versionID adequado à época do banco de dados que foi restaurado, permitindo que o S3 continue devolvendo o arquivo correto quando necessário. | O BIS saberá qual é o arquivo correto de acordo com o '''VersionID''' fornecido pelo S3. Assim, mesmo que o Banco de dados sofra uma restauração anterior, o banco trará o versionID adequado à época do banco de dados que foi restaurado, permitindo que o S3 continue devolvendo o arquivo correto quando necessário. Dito isso, '''o bucket não deve ter nenhuma regra de exclusão automática'''. Em um cenário em que um arquivo foi atualizado, no bucket teremos uma versão antiga e uma nova. Caso o banco de dados seja restaurado, fazendo com que a versão antiga volte a ser a vigente, o bucket não é notificado e uma regra de exclusão de versões antigas pode acabar excluindo o que é na verdade a versão vigente no banco de dados. | ||
== Como escolher o método de persistência adequado? == | == Como escolher o método de persistência adequado? == |
Edição das 20h59min de 30 de setembro de 2021
O FileVO é o objeto oferecido pelo Kernel do BIS10 para simplificar a persistência de arquivos no BIS10.
Associando o FileVO
O FileVO deve ser usado sempre com o relacionamento do tipo ASSOCIATION. Para evitar que o FileVO seja persistido diretamente como uma composição do objeto que tem o arquivo. Para persistir o FileVO utilize o método persistFile(...) disponível no KernelCrud. Este método não é publicado na fachada, deve sempre fazer parte da lógica de outros métodos de negócio.
![]() |
Exemplo de Utilização do FileVO
@BISMetaRelationshipField(caption = "Arquivo do Objeto", relationship = RelationshipTypes.ASSOCIATION, required = true, column = "idk_file")
private FileVO fileVO = null;
|
![]() |
|
![]() |
|
Modos de Persistência
Atualmente o BIS suporta dois métodos de persistência do arquivo:
Banco de Dados (DB)
O modo de persistência DB persiste o arquivo como um Blob dentro do próprio banco de dados. Fazendo com que o conteúdo do arquivo sofra rollback ou commit junto com o resto da transação.
Vantagens deste Método
- Não deixa arquivos "lixo" para trás durante as atualizações dos objetos.
- Tem um acesso rápido sendo recuperado na mesma transação que o FileVO (se solicitado, uma vez que fica em um objeto composto FileContentVO).
Desvantagens deste Método
- Sobrecarrega os arquivos da base de dados, podendo deixar o banco lento e atingindo a capacidade de tamanho da tabela cedo.
- Deixa os arquivos do banco maiores, e cada snapshot inclui o conteúdo completo do arquivo, mesmo que ele seja igual ao seu anterior.
Amazon S3 (S3)
Este método faz o post do arquivo em um bucket próprio da aplicação na Amazon. O FileVO continua sendo salvo no banco de dados mas apenas com as informações de meta-dados do arquivo, seu conteúdo é enviado para o S3.
Vantagens deste Método
- Mantém a base de dados apenas com as informações de meta-dados, não sobrecarregando os arquivos do banco.
- Os arquivos na S3 são salvos todos separados, novos arquivos não forçam um backup contendo novamente o conteúdo de outros arquivos que não foram alterados
- Passando versões antigas para o Glacier, o custo do aramazenamento e de backups se torna muito menor do que o gasto com espaço no banco de dados.
Desvantagens deste método
- O arquivo quando salvo/recuperado precisa abrir uma nova conexão HTTPS com o servidor da S3 para realizar a operação. Tirando a performance da ação.
- Uma vez que a operação não está inclusa na transaction, um rollback da operação não exclui o arquivo já postado ou marcado como excluído. Gerando versões e deixando lixo dentro do Bucket.
Lógica de Funcionamento
![]() |
|
![]() |
|
Por não estar na transação do Container, o sistema de persistência do S3 nunca excluí de fato um arquivo. O Bucket utilizado deve ter o sistema de versionamento funcionando inclusive para arquivos excluídos.
O BIS saberá qual é o arquivo correto de acordo com o VersionID fornecido pelo S3. Assim, mesmo que o Banco de dados sofra uma restauração anterior, o banco trará o versionID adequado à época do banco de dados que foi restaurado, permitindo que o S3 continue devolvendo o arquivo correto quando necessário. Dito isso, o bucket não deve ter nenhuma regra de exclusão automática. Em um cenário em que um arquivo foi atualizado, no bucket teremos uma versão antiga e uma nova. Caso o banco de dados seja restaurado, fazendo com que a versão antiga volte a ser a vigente, o bucket não é notificado e uma regra de exclusão de versões antigas pode acabar excluindo o que é na verdade a versão vigente no banco de dados.
Como escolher o método de persistência adequado?
Dada as vantagens e desvantagens de cada modelo de persistência, eles devem ser escolhidos conforme os seguintes critérios:
- Utilizar o S3 quando:
- Sempre que tivermos um grande volume de arquivos para serem salvos
- Os arquivos tendem a ser mais "estocados" do que "utilizados"
- O overhead da conexão adicional é aceitável para a operação.
- Exemplos: Arquivos XML de Notas Fiscais, Arquivos do SAT, Digitalizações de comprovantes e outros documentos.
- Utilizar o DB quando:
- Há uma quantidade pequena de arquivos que serão utilizadas
- Os arquivos são utilizados com frequência pelo tempo que existirem na base de dados.
- Quando os arquivos são utilizados com frequência por um pequeno período de tempo, e depois ficam estocados, deve-se utilizar o S3. Sempre pensando a relação uso/estoque em relação ao tempo que o arquivo ficará na base de dados.
- O overhead da conexão adicional não é aceitável
- Neste caso devemos ainda pensar se a quantidade de arquivos no Banco não será grande de mais. Se for o caso trabalhar uma ideia de um cache de arquivos temporários.
- Utilizar quando precisamos persistir arquivos que são temporários (como relatórios que demoram a ficar pronto e devem ficar disponíveis por um período) e não podemos perde-los em arquivos temporários do sistema. Quando puder, utilizar o sistema de arquivos temporários de qualquer forma.
Limpeza e Manutenção
O BIS tem uma rotina de manutenção que temporariamente tenta excluir os FileVOs que não estão em uso. A maneira de saber se o FileVO está em uso é tentando excluí-lo e descobrir se o banco impede por restrição de alguma FK com ON DELETE RESTRICT, por isso torna-se obrigatório que qualquer objeto que utilize o FileVO coloque na sua contraint o ON DELETE RESTRICT.
Limpeza e Manutenção do S3
Ainda não implementado. Detalhes da ideia inicial descrita na sessão do S3.