Trabalhar com o serviço Digital Ocean Managed Databases no .NET Core



Enquanto outras plataformas em nuvem há muito tempo têm suas próprias soluções de banco de dados, a Digital Ocean não ofereceu nada neste segmento até hoje. Porém, em 14 de fevereiro, dia de todos os amantes, a empresa decidiu fazer um presente para seus clientes e lançou o serviço Managed Databases no modo Disponibilidade Limitada.

Como o Digital Ocean agora é uma plataforma bastante popular para hospedar pequenos projetos no .NET Core, não pude ignorar esse evento.

Como o serviço funciona e quais são as nuances ao conectar-se ao banco de dados ao usar o .NET Core, descreverei nesta publicação.



Hoje, os bancos de dados do PostrgeSQL versão 10 e 11. estão disponíveis. MySQL e Redis são os próximos a seguir.

De acordo com a Digital Ocean, o serviço de banco de dados gerenciado resolve os problemas comuns que muitas empresas e desenvolvedores enfrentam ao criar um cluster do zero:

  • Determinando a infraestrutura ideal
  • Escale a infraestrutura à medida que seus requisitos de negócios e dados aumentam
  • Projetar e gerenciar processos de infraestrutura e failover altamente disponíveis
  • Implementando uma estratégia de backup e recuperação
  • Previsão e manutenção de custos de manutenção de infraestrutura

Hoje, a criação da base mais compacta custará US $ 15. A configuração mais cara pode custar mais de dois mil dólares por mês .

Pools de conexão


Quando um cliente se conecta diretamente a um banco de dados PostgreSQL, o servidor cria um processo para lidar com essa conexão. Cada conexão individual requer aproximadamente 10 MB de RAM e usa essa memória até ser fechada. Além disso, o número total de conexões é fixo e, quando todas as conexões são usadas, novos clientes não poderão mais se conectar.

O Digital Ocean permite criar pools de conexão que são executados com base no PgBouncer. O conjunto de conexões reduz os problemas de desempenho direcionando as conexões do cliente para o aplicativo de conjunto, reduzindo assim o número de processos que o banco de dados precisa processar. O aplicativo de pool transfere parte das conexões ao banco de dados e coloca o restante na fila onde estão até que o banco de dados esteja livre para novas conexões.

Ao usar o pool de conexões, os aplicativos não precisam gerenciar a conexão real. Eles só precisarão se conectar ao pool e desconectar depois de concluir a tarefa.

Criação de pool


Criar um pool de conexões é muito simples - você precisa abrir um cluster e ir para a guia Pools de Conexões. O DigitalOcean suporta três tipos de pool:



Transação

Este modo permite que cada cliente use o pool simultaneamente para uma transação. Se mais transações forem enviadas do que as disponíveis no pool, transações adicionais serão colocadas em fila e processadas depois que as conexões estiverem disponíveis. O modo de transação é adequado quando você possui um grande número de clientes que usam conexões inativas. Esses clientes manterão sua conexão com o pool sem estabelecer uma conexão com o PostgreSQL.

Sessão

Esse modo permite que o cliente processe solicitações até desconectar-se do banco de dados, mantendo uma conexão com esse cliente o tempo todo. Se mais clientes estiverem se conectando do que falhando ao processar no pool, esses clientes serão colocados na fila e conectados após desconectar um cliente existente.

Declaração

Esse modo é o mais rigoroso e permite apenas um operador por vez antes de passar para o próximo cliente na fila. Isso significa que solicitações com vários operadores não são permitidas e não serão executadas. Este modo é útil principalmente em situações em que cada transação é limitada a um operador. Transações com vários agentes serão rejeitadas pelo pool.

Depois de criar o pool, você precisa usar os parâmetros do pool para se conectar ao banco de dados. Você pode vê-los clicando no link Detalhes da conexão:



Conexão à piscina




Nos meus projetos eu uso o Npgsql , portanto, outros exemplos implicarão o uso desse driver.

A cadeia de conexão ficará assim:

User ID=xxx;Password=xxxx;Host=xxx.db.ondigitalocean.com;Port=xxx;Database=pool_name;Pooling=false;SslMode=Require;Server Compatibility Mode=Redshift; 


O que você deve prestar atenção:

  • O parâmetro Database não conterá o nome do banco de dados, mas o nome do pool pelo qual a conexão com o banco de dados ocorrerá.
  • O pool será definido como false. O conjunto de conexões será gerenciado pelo PgBouncer, não pelo driver.
  • O parâmetro SslMode deve ser definido como Exigir, pois será necessário um certificado para abrir a conexão.
  • O parâmetro Server Compatibility Mode deve ser inicializado com o valor Redshift . Isso evitará vários problemas ao usar o driver npgsql através do PgBouncer.

O método de preparação da conexão terá a seguinte aparência:

 protected async Task<IDbConnection> CreateConnection() { var connection = new NpgsqlConnection(_connectionString) { ProvideClientCertificatesCallback = certificates => { certificates.Add(new X509Certificate2(_cert)); }, UserCertificateValidationCallback = CertificateValidation() }; await connection.OpenAsync(); return connection; } private RemoteCertificateValidationCallback CertificateValidation() => (sender, certificate, chain, errors) => { if (errors == SslPolicyErrors.None) return true; if ((errors & SslPolicyErrors.RemoteCertificateChainErrors) != 0) { var allErrorsIsUntrustedRoot = chain? .ChainStatus .All(o => o.Status == X509ChainStatusFlags.UntrustedRoot); return allErrorsIsUntrustedRoot ?? true; } return true; }; 

Aqui vale a pena prestar atenção a dois pontos.

  • Primeiro . Ao criar uma conexão, você deve usar um certificado. Ele pode ser baixado na caixa de diálogo para visualizar os parâmetros de conexão com o pool. A conexão do certificado é configurada por meio de ProvideClientCertificatesCallback .
  • Segundo . O procedimento de verificação de certificado de pool, configurado através de RemoteCertificateValidationCallback. No meu exemplo, é usado um pequeno hack que permite ignorar o erro que ocorre devido ao fato de a verificação do certificado raiz não funcionar.

Não se esqueça que o serviço atualmente é fornecido no modo DISPONIBILIDADE LIMITADA, o que significa que parte da funcionalidade ainda pode ser expandida e podem surgir problemas durante o trabalho com os serviços, que a equipe do DO ainda não teve tempo de eliminar.

Referências


Source: https://habr.com/ru/post/pt440464/


All Articles