
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çãoEste 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ãoEsse 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çãoEsse 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