Pular para o conteúdo
Decoding Chat API

Snowflakes

Um snowflake é um identificador de 64 bits para um recurso do Decoding Chat, como um usuário, servidor, canal, mensagem, cargo ou anexo. É o tipo escrito como snowflake em todas as tabelas de transmissão desta referência, e a API HTTP, a API de administração e o Gateway compartilham esse mesmo espaço de identificadores.

Um snowflake é único dentro da implantação que o emitiu. O valor permanece estável, e o Decoding Chat não o reutiliza depois que o recurso é excluído. Implantações distintas podem emitir o mesmo valor numérico, então o cliente DEVE associar cada snowflake à sua implantação.

Um snowflake empacota um timestamp, um ID de worker e uma sequência em 64 bits. Os campos de worker e sequência distinguem identificadores emitidos no mesmo milissegundo. O bit 63 é sempre zero, então um snowflake emitido cabe em um inteiro de 64 bits com sinal.

CampoBitsDescrição
Timestamp162 a 22A quantidade de milissegundos desde 2015-01-01T00:00:00.000Z
ID do worker21 a 12O identificador sem sinal do worker alocador, de 0 até 1023
Sequência211 a 0A sequência sem sinal por worker, de 0 até 4095

1 O timestamp registra o instante em que o identificador foi emitido, que pode ocorrer pouco antes de o recurso existir

2 Um valor de sequência maior indica um identificador posterior apenas quando ambos vêm do mesmo worker no mesmo milissegundo

A época é 1420070400000 milissegundos após a época Unix. Toda instância do Decoding Chat usa esse mesmo valor. Os 22 bits menos significativos expõem detalhes do alocador, então o cliente NÃO DEVE usá-los para roteamento nem para semântica de recurso.

Trate o timestamp embutido como um horário aproximado de emissão, não como prova de que o recurso já existe.

Para obter o horário de criação em milissegundos Unix, desloque o snowflake 22 bits para a direita e some a época.

timestamp_ms = (snowflake >> 22) + 1420070400000

A expressão inversa produz o menor snowflake possível para um timestamp Unix em milissegundos. É útil como limite de paginação.

snowflake = (timestamp_ms - 1420070400000) << 22

A faixa representável vai de 2015-01-01T00:00:00.000Z até 2084-09-06T15:47:35.551Z.

O Decoding Chat emite um snowflake como string decimal sem sinal em todo corpo JSON, parâmetro de caminho, parâmetro de query string e payload do Gateway. Um valor emitido contém apenas dígitos ASCII. O tráfego de entrada é mais permissivo, e RECOMENDA-SE que o cliente envie sempre a forma emitida.

SuperfícieEntrada aceita
Requisição HTTP10, ou um dígito diferente de zero seguido de outros dígitos, enviado como string JSON ou como inteiro JSON
Comando do Gateway2Um dígito não zero seguido de outros dígitos, como string de dígitos ASCII ou inteiro JSON positivo

1 O Decoding Chat remove espaços no início e no fim antes de ler o texto. Nesse texto, um zero à esquerda, um sinal, um ponto decimal e qualquer outro caractere não numérico são rejeitados com o código de validação INVALID_SNOWFLAKE_FORMAT, e um valor bem formado acima de 9223372036854775807 é rejeitado com SNOWFLAKE_OUT_OF_RANGE

2 O Gateway rejeita 0, zero à esquerda, valor com sinal, inteiro negativo e valor acima de 9223372036854775807

Os dois códigos de validação HTTP são códigos de elemento dentro de uma resposta 400 INVALID_FORM_BODY. Cada comando do Gateway indica o que sua própria rejeição provoca, desde descartar o campo até abandonar o comando inteiro.

Um snowflake enviado como número JSON mantém o valor exato em qualquer tamanho. Um número JSON fracionário é uma falha comum de tipo e reporta INVALID_FORMAT. O Decoding Chat lê a forma exponencial como o número que ela representa, e um valor acima de 9007199254740991 reporta INVALID_SNOWFLAKE_FORMAT. Parâmetros de caminho e de query string sempre chegam como texto.

Um endpoint de coleção que pagina sobre um recurso ordenado por snowflake aceita um cursor como before, after ou around. O endpoint define quais cursores aceita, se são mutuamente exclusivos, a ordem do resultado e como limit é aplicado.

CursorSeleciona
beforeIdentificadores menores que o valor do cursor, excluindo-o
afterIdentificadores maiores que o valor do cursor, excluindo-o
aroundUma janela centrada no valor do cursor, incluindo-o

Listar mensagens do canal aceita around como parâmetro de query string, e Listar mensagens de vários canais o aceita em cada entrada do corpo da requisição. Nenhuma outra operação o aceita.

O tipo de um cursor before ou after depende da operação. Listar mensagens fixadas pagina pelo horário de fixação, então seu before é um timestamp ISO 8601. Listar entradas da lista de bloqueio pagina pelo valor da entrada. Seu after é o valor armazenado da última entrada da página anterior. Cada operação indica o tipo dos próprios cursores.

Como o timestamp ocupa os bits mais significativos, a ordem numérica dos snowflakes é a ordem de criação na resolução de milissegundos.