No introdução a esta sérieNa postagem anterior, discuti algumas das motivações para reescrever o SDK do .NET, as metas, os objetivos e os principais recursos da próxima versão 2.0, e examinamos a arquitetura de alto nível (visão de 10000 pés) de um SDK cliente do Couchbase Server. Nesta postagem, examinaremos o projeto e o desenvolvimento de um dos principais componentes de configuração de um SDK do Couchbase: Configuração do servidor.

Introdução

Um cliente do SDK do Couchbase requer configuração de duas fontes: a Configuração do Cliente, que define o IP do cluster ao qual se conectar, o número de conexões a serem usadas e outras informações importantes sobre como o cliente interagirá com o cluster, e a Configuração do Servidor, que define o estado atual do cluster (por exemplo, número de nós, buckets disponíveis etc.), direcionando assim o estado interno de um cliente (Mapa de clusters)

Esta postagem discutirá apenas os aspectos de configuração do servidor e, em grande parte, girará em torno da implementação de várias interfaces ou contratos bem definidos.

Configuração de streaming HTTP

Atualmente, a maioria dos clientes usa uma técnica de "bootstrapping" por meio da configuração do cliente e uma "Streaming Configuration" exposta pelo API REST do Couchbase. Isso é compatível com as versões do Couchbase a partir da versão 2.2. A abordagem usual é a seguinte:

  1. No elemento "uris" de uma Configuração de Cliente (a semântica varia de acordo com o cliente), é definido um URL para iniciar o processo de bootstrapping:
    http://[SERVER]:8091/pools
  2. A resposta é então analisada e é feita uma solicitação para obter o configuração de buckets:
    http://[SERVER]:8091/pools/default?uuid=[UUID]
  3. Essa resposta é analisada e outra solicitação é feita para obter URL de streaming de:
    http://[SERVER]:8091/pools/default/buckets?v=[VERSION]&uuid=[UUID]
  4. Por fim, é feita a conexão de URL de streaming, que é de longa duração e gera eventos no cliente com relação às alterações no cluster:
    http://[SERVER]:8091/pools/default/bucketsStreaming/default?bucket_uuid=[UUID]
  5. Em seguida, o cliente alterará seu estado interno para corresponder à configuração atual do servidor.

Há alguns problemas com essa abordagem, entre outros:

  • O "URL de streaming" consome muitos recursos para criar e manter (principalmente memória) no lado do servidor
  • Durante uma situação de rebalanceamento ou failover, a configuração do cluster pode mudar muitas e muitas vezes. Cada vez que isso acontece, o cliente precisa derrubar todos os seus recursos (conexões de soquete, mapeamentos do VBucket) e construir seu estado repetidamente, o que pode reduzir a taxa de transferência, a latência, o uso de memória e CPU acima do esperado, e assim por diante...
  • As operações que estão em andamento podem ser encerradas e, em seguida, tentadas novamente em um novo estado de configuração - é como se o "o carpete foi arrancado de debaixo deles".
  • As respostas a NOT_MY_VBUCKET são tratadas de forma ineficiente, simplesmente tentando o próximo nó da lista - não há informações que ajudem o cliente a saber para qual nó redirecionar a operação.

Um novo modelo para o gerenciamento de configuração: CCCP Gerenciamento otimizado de conexões

Embora a abordagem de streaming HTTP "bootstrapping" tenha funcionado razoavelmente bem para a maioria dos clientes, as desvantagens começaram a superar as vantagens, portanto, um novo modelo para atualizar a configuração do cliente foi definido e está disponível a partir da versão 2.5 do Couchbase Server: Publicação de configuração de cluster de cliente ou "CCCP" Gerenciamento otimizado de conexões. CCCP  O gerenciamento de conexão otimizado introduz uma nova operação a ser usada antes ou depois da autenticação para solicitar a configuração, bem como um mecanismo para retornar informações de configuração quando uma resposta NOT_MY_VBUCKET é retornada para uma operação com falha.

Nesse caso CCCP Com o SDK de suporte ao gerenciamento de conexão otimizado, o cliente reagirá usando a configuração para se atualizar antes de reenviar a operação. Observe que NOT_MY_VBBUCKET é a resposta padrão retornada pelo cluster quando o próprio cluster foi alterado (durante um cenário de reequilíbrio ou failover, por exemplo) e o cliente ainda não foi "sincronizado" e está usando uma configuração obsoleta, resultando em um mapeamento de chave inválido. Já a abordagem de "bootstrapping" é, de certa forma, uma operação do tipo "pull", CCCP O gerenciamento otimizado da conexão é "push" ou "pull", dependendo do fato de a solicitação ter sido iniciada pelo cliente (por meio de uma operação CMD_GET_CLUSTER_CONFIG explícita) ou pelo próprio servidor (por meio de uma resposta NOT_MY_VBUCKET a uma operação). Examinaremos CCCP Gerenciamento otimizado de conexões em mais detalhes em uma postagem posterior.

*Edição: O CCCP agora é conhecido como "Gerenciamento de conexão otimizado".

Configuração baseada em arquivos

Existe uma outra opção de configuração semissuportada: a configuração baseada em arquivo. A configuração baseada em arquivos é útil principalmente para testes e desenvolvimento, e forneceremos uma implementação nos projetos de teste para remover algumas das dependências que são difíceis de replicar ou que causam falsos positivos ao executar o conjunto de testes.

Visão da arquitetura estrutural

Internamente, o componente Server Configuration do cliente é um modelo baseado em provedor, no qual várias implementações de um provedor de configuração podem ser configuradas no cliente e, em seguida, uma estratégia pode ser escolhida para determinar qual provedor deve ser usado. O padrão é uma abordagem linear simples de fallback em que o primeiro provedor configurado é usado e, se ele falhar, o próximo provedor na sequência tomará seu lugar.

Aqui está um diagrama que mostra os principais objetos do ator e os relacionamentos com alguns dos outros objetos-chave dentro do cliente, que serão discutidos em postagens posteriores:

Segue uma descrição de cada um deles:

  • ConfigurationProvider: uma fonte que produzirá um novo ConfigInfo. É responsabilidade do provedor fornecer o mecanismo para obter a configuração de sua origem.
  • ConfigurationInformation: As informações de configuração contêm uma lista de possíveis nós e o mapa do VBucket que informa aos clientes para quais servidores dentro desses nós uma determinada chave deve ser encaminhada.
  • ConfigurationManager: ponte entre o cliente e os provedores e a estratégia adotada para determinar qual provedor usar e qual lógica de repetição aplicar.

Um documento mais detalhado sobre essa arquitetura pode ser encontrado em aqui. Observe que este, como todo desenvolvimento, é um processo evolutivo, portanto, espere algumas mudanças e revisões ao longo do tempo.

Conclusão e próximas etapas

Esta postagem discutiu o histórico (HTTP Streaming) e o futuro (CCCP Gerenciamento de conexão otimizado) do Gerenciamento de configuração do servidor do Couchbase SDK. Na próxima postagem, entraremos em detalhes sobre a implementação do provedor de configuração HTTP Streaming, que é necessário para clientes que têm como alvo versões anteriores à 2.5 do Couchbase Server.

Autor

Postado por Jeff Morris, engenheiro de software sênior, Couchbase

Jeff Morris é engenheiro de software sênior da Couchbase. Antes de ingressar na Couchbase, Jeff passou seis anos na Source Interlink como arquiteto da Web corporativa. Jeff é responsável pelo desenvolvimento dos SDKs do Couchbase e pela integração com o N1QL (linguagem de consulta).

2 Comentários

  1. Olá, Jeff,

    Estamos usando o .Net sdk 1.2 e queremos obter alguns conselhos de um desenvolvedor real do couchbase sobre como escrevê-lo da melhor maneira.

    Como posso entrar em contato diretamente com vocês?

    1. Chen -

      Você pode entrar em contato comigo diretamente:
      Canal IRC: #libcouchbase

      ou por meio de um desses métodos:
      http://www.couchbase.com/commu

      ou criando um NCBC, se você tiver um problema específico (crie uma conta):
      http://www.couchbase.com/issue

      Estou um pouco hesitante em publicar meu endereço de e-mail (Internet pública), mas se você se conectar comigo no LinkedIn, eu o enviarei para você em particular.

      -Jeff

Deixar uma resposta