Compartilhar via


IDs flexíveis

As IDs flexíveis são usadas para identificar réplicas, itens ou unidades de alterações. O Estrutura de sincronização oferece suporte aos seguintes tipos de IDs flexíveis:

  • ID de comprimento fixo

    Uma ID de comprimento fixo tem sempre o mesmo comprimento cada vez que é usada. O comprimento é especificado no esquema de formato de ID.

  • ID de comprimento variável

    Uma ID de comprimento variável pode variar o comprimento cada vez que for usada. O comprimento máximo é especificado no esquema de formato de ID.

Código gerenciado Uma ID é representada pela classe SyncId. Esta classe contém a ID e um valor que indica se a ID é de comprimento variável.

Código não gerenciado Uma ID é representada como uma matriz de bytes. As IDs de comprimento variável são representadas pela estrutura SYNC_ID. Esta estrutura contém o comprimento da ID e a ID representada como uma matriz de bytes.

Esquema da ID

Os formatos de ID são definidos em um esquema que especifica as seguintes informações sobre cada ID no sistema:

  • Se a ID é de comprimento fixo ou variável.

  • O tamanho se a ID for de comprimento fixo ou o tamanho máximo se a ID for de comprimento variável.

Código gerenciado O esquema de formato da ID é especificado usando a classe SyncIdFormatGroup.

Código não gerenciado O esquema de formato de ID é especificado usando a estrutura ID_PARAMETERS.

Este esquema deve ser fornecido para vários métodos do Estrutura de sincronização e é usado para garantir que todos os objetos usem as mesmas informações de esquema da ID.

Em uma sessão de sincronização, ambos provedores são consultados por seus esquemas. Os esquemas são comparados para verificar se ambos provedores estão usando o mesmo esquema. Se esta verificação falhar, a sessão não será criada.

Código gerenciado A sessão obtém o esquema de um provedor usando a propriedade IdFormats.

Código não gerenciado A sessão obtém o esquema de um provedor usando o método ISyncProvider::GetIdParameters.

Dica

O formato de uma ID passada para um método do Estrutura de sincronização deve corresponder ao formato especificado no esquema de formato da ID ou o método falhará.

Formato recomendado para IDs globais

Uma ID global é necessária para cada item no escopo de sincronização e deve ser exclusiva em uma comunidade de sincronização. Uma ID global é uma ID flexível e, portanto, pode usar qualquer formato. No entanto, como os metadados podem representar um grupo ordenado de IDs como um intervalo simples, os metadados são mais compactos quando as IDs são enumeradas como grupos ordenados. O uso de intervalos também torna a manutenção de metadados mais eficiente. Portanto, pode ser útil fazer a ordem das IDs se ajustar logicamente à ordem conveniente para enumeração. Para o formato de uma ID global, é recomendado o uso de um GUID de 16 bytes com um prefixo de 8 bytes, como a classe SyncGlobalId gerenciada ou a estrutura SYNC_GID não gerenciada.

Considerações especiais sobre dados hierárquicos

Em situações nas quais os itens em sincronização possuem uma hierarquia, é útil colocar no prefixo da ID números que aumentam de forma monotônica, como a hora de um relógio. Como os pais serão tipicamente criados antes dos filhos, esses aparecerão anteriormente na ordem de enumeração. Isso permite que um fornecedor minimize o requisito pra lidar com itens fora de ordem nos quais devem ser aplicados.

Uma abordagem para atribuir IDs globais para dados hierárquicos é a seguinte:

  1. Crie um contador grande o suficiente para indexar em todos os itens exclusivos na réplica.

  2. Iniciando na raiz do escopo, favoreça profundidade sobre amplitude e desvie o sistema.

  3. Para cada item (pai ou filho), gere um GUID.

  4. Insira um prefixo no GUID com a hora do relógio de parede.

IDs globais podem ser atribuídas aos novos itens criados usando este mesmo método, independentemente de seus contêineres ou itens individuais aninhados.

Tratamento da memória no código não gerenciado

As IDs são representadas como ponteiros para matrizes de bytes. Portanto, converter a ID usada para um ponteiro de byte é suficiente para IDs de comprimento fixo. Para IDs de comprimento variável, os dados da ID devem ser antecedidos pelo tamanho do buffer, como na estrutura SYNC_ID.

Dica

O Estrutura de sincronização nunca manterá uma referência a uma ID alocada por um chamador. Se o Estrutura de sincronização deve manter uma ID, sua própria memória será alocada para a ID e copiará a ID internamente. Os chamadores são responsáveis por alocar e liberar memória associada a IDs.

IDs como valores de retorno no código não gerenciado

As IDs de comprimento variável são retornada dos métodos do Estrutura de sincronização em um processo de duas chamadas:

  1. O método é chamado para determinar o tamanho da ID.

  2. O chamador aloca a memória e chama a função novamente, fornecendo o novo buffer alocado e seu tamanho.

Um usuário pode otimizar este processo alocando um buffer do tamanho correto ou alocando um buffer do tamanho máximo. Nessa caso, a primeira chamada é desnecessária, embora o chamador deva sempre verificar o HRESULT retornado para garantir que o buffer tinha o tamanho correto.

Métodos que retornam IDs de comprimento fixo não usam o processo de duas etapas. Em vez disso, os métodos apenas fornecem um buffer do comprimento correto. O parâmetro de tamanho é opcional ao solicitar uma ID de comprimento fixo (NULL pode ser fornecido). Se o tamanho for passado, os métodos agem como no caso do comprimento variável. Isso significa que se o tamanho for menor que a ID que será retornada, um código de erro indicando que mais dados estão disponíveis será retornado e a variável de tamanho armazenará o tamanho necessário. Se o tamanho for maior que o tamanho necessário, o método terá êxito e o tamanho necessário será retornado.

Intervalos

Os blocos de IDs ordenadas podem ser referidos como um intervalo. Um intervalo usa as IDs inferiores e superiores como os limites fechados para o intervalo.

Código gerenciado Os limites de intervalo são passados diretamente para os métodos que trabalham com intervalos.

Código não gerenciado Um intervalo é representado usando a estrutura SYNC_RANGE.

Consulte também

Referência

Estrutura ID_PARAMETERS
Estrutura ID_PARAMETER_PAIR
Estrutura SYNC_ID
Estrutura SYNC_RANGE
SyncIdFormatGroup
SyncIdFormat
SyncId

Conceitos

Gerenciamento de metadados
Requisitos de metadados