Finalmente, o Couchbase .NET SDK 2.1.0 GA está disponível! Essa versão é uma versão secundária para a 2.1.0, mas inclui suporte para o padrão de assincronia de tarefas (palavras-chave async e await) e E/S sem bloqueio para todas as operações de chave/valor. Além disso, vários outros recursos foram incluídos:
- Configurações TCP KEEP_ALIVE por conexão
- Novos pontos de extensão para a criação de transcodificadores, serializadores e conversores "plugáveis"
- Suporte para "Get and Touch" para expirações deslizantes em pares de chave/valor
- Suporte oficial para um método "a chave existe"
Outros aprimoramentos e correções de bugs incluem uma correção para leituras de réplicas, um novo mecanismo de solicitação de consulta para lidar com inconsistências e erros durante cenários de troca/rebalanceamento/failover e uma infinidade de outras correções de bugs e aprimoramentos (mais de 45 tíquetes Jira fechados). Esta versão é JUGGED!
Nas próximas seções, abordarei brevemente os principais recursos desta versão; aguarde postagens mais longas em um futuro próximo que se aprofundem em cada recurso.
Suporte ao padrão de assincronia de tarefas para K/V
Todo o mecanismo de E/S foi reformulado nesta versão para oferecer suporte a E/S sem bloqueio; para aproveitar esse recurso, nós o expusemos por meio das palavras-chave async e await. Se você não estiver familiarizado com as palavras-chave async/await e com o TAP (Task Asynchrony Pattern, padrão de assincronia de tarefas), talvez queira dar um pulo lá e ler esteou esteou este antes de continuar.
Sem entrar em muitos detalhes (haverá um mergulho profundo em outro post futuro), aqui está um exemplo de uso do async/await e do SDK do Couchbase para inserir e recuperar uma chave de um cluster do Couchbase:
A primeira diferença que você notará é que a assinatura do método agora tem a palavra-chave async adicionada a ele; isso possibilitará o uso da palavra-chave await no corpo do método. Quando o método for executado, ele será executado de forma síncrona até chegar à palavra-chave await e, em seguida, será "retirado" e executado de forma assíncrona. Há um pouco de mágica de compilador envolvida aqui no lado do .NET, mas isso é tudo o que você precisa fazer para escrever código assíncrono usando o SDK do Couchbase .NET!
No SDK do Couchbase .NET, uma tarefa será criada e armazenada na fila; a solicitação será disparada para o servidor do Couchbase de maneira "dispare e esqueça" (via IOCP) e, quando for concluída, será disparado um retorno de chamada que concluirá a solicitação lendo a resposta e retornando-a ao chamador. Se ocorrer um erro ou exceção, ele será tratado e retornado como a implementação IOperationResult que a tarefa encapsula. Mais uma vez, aguarde um aprofundamento em um post futuro!
Novos pontos de extensão!
Um dos objetivos do SDK 2.0 era fornecer pontos de extensão para os vários componentes do SDK; se você não gostar da nossa implementação ou da API externa na qual ela se baseia, escreva a sua própria! Outro efeito positivo colateral é que isso facilita o isolamento e o teste de várias camadas e componentes dentro do SDK.
Na versão 2.1.1, agora oferecemos suporte a três novos pontos de extensão:
- Serializadores - manipulam a serialização e a desserialização de POCOs para JSON.
- Conversores - lidar com a conversão dos pacotes de bytes do Memcached que vão e voltam do servidor Couchbase (e a paridade entre os outros SDKs)
- Transcodificadores - manipulam a conversão e a serialização/desserialização do corpo da solicitação ou da resposta (a parte "valor" de "chave/valor").
Para criar um serializador personalizado, implemente a interface ITypeSerializer e forneça um Func
Conversores e transcodificadores personalizados também podem ser conectados, implementando as interfaces ITypeConverter ou ITypeTranscoder e fornecendo uma classe personalizada que lide com seu caso de uso ou necessidade específica. Da mesma forma que os serializadores, você fornece uma classe Func
Aguarde postagens futuras que se aprofundem nesses pontos de extensão e ilustrem como seria possível criar e injetar um novo comportamento de transcodificador, serializador e/ou conversor no cliente.
Outros recursos novos na versão 2.1.0
Configurações por conexão para TCP KEEP-ALIVES
A configuração padrão do sistema operacional para TCP KEEP-ALIVES no Windows é de 120 minutos. Em alguns casos, como implantações em nuvem em que os dispositivos de rede (balanceadores de carga etc.) foram configurados para eliminar conexões TCP que ficaram ociosas por um período mais curto, precisamos de uma maneira de definir o TCP KEEP-ALIVES padrão para um período de tempo menor. É possível fazer isso globalmente no nível do sistema operacional por meio das configurações do Registro via KeepAliveInterval e KeepAliveTime; no entanto, isso afetará todos os aplicativos em execução nesse servidor. Uma solução melhor é alterar o intervalo e o tempo no nível da conexão TCP para que ele se aplique somente às conexões que o cliente está usando.
Agora é possível fazer isso por meio das propriedades EnableTcpKeepAlives, TcpKeepAliveTime e TcpKeepAliveInterval da classe ClientConfiguration. EnableTcpKeepAlives ativará ou desativará o TCP KEEP-ALIVES (o padrão é ativado), TcpKeepAliveTime é o tempo que transcorrerá antes que os KEEP-ALIVES sejam enviados e TcpKeepAliveInterval é o intervalo entre os KEEP-ALIVES depois que o TcpKeepAliveTime for atingido.
No exemplo acima, antes de criar o objeto Cluster e abrir um bucket a partir dele, criamos uma ClientConfiguration e definimos EnableTcpKeepAlives como true (observe que o padrão é true, portanto, isso é apenas para ilustração), o TcpKeepAliveTime é definido como 1hr (é quando o primeiro pacote KEEP-ALIVE será enviado se a conexão estiver ociosa) e, por fim, definimos o TcpKeepAliveInterVal como 5secs. Isso significa que, após 1 hora de inatividade, o cliente começará a enviar TCP KEEP-ALIVES a cada 5 segundos até que a conexão se torne ativa novamente.
Suporte ao método Exists
Os usuários frequentemente pedem uma maneira de verificar se uma chave existe sem realmente recuperar o valor. Agora temos esse suporte na versão 2.1.0. Há suporte para as versões síncrona e assíncrona desse método.
Suporte para GAT (Get and Touch) e Touch (para expirações deslizantes)
Dois novos métodos foram introduzidos: GetAndTouch e Touch. GetAndTouch recuperará um valor e atualizará sua expiração e Touch atualizará a expiração de uma chave, mas não retornará nenhum valor.
Correções de erros importantes
- Transcodificação de números inteiros de 1.3.X para 2.X
- Correções para leituras de réplicas
- Muitas e muitas correções de bugs e melhorias!
Como obter o SDK do Couchbase .NET
O SDK está disponível para download diretamente, por meio do NuGet, ou clonando e extraindo o repositório do Github: