Esta página ainda não foi traduzida: mostrando a versão em inglês.
Social
O Social acrescenta um conceito: a relação entre dois atores, com estado próprio e um iniciador. Um clã, uma guilda ou um esquadrão é um grupo com uma camada de relações por cima, não um segundo tipo de coisa; e o bloqueio, de que vários módulos precisam, fica aqui para que um único lugar seja o dono dele.
Quando usar
- Os jogadores precisam encontrar uns aos outros pelo nome: amigos, seguidores (follower), listas de bloqueio.
- Um clã ou guilda precisa de regras de entrada: um convite do grupo, um pedido de entrada de um ator e uma decisão sobre cada um.
- A lista de amigos precisa mostrar quem está online: a presença é derivada das sessões, e quem pode vê-la é um predicado que você declara.
- Outro módulo precisa saber que alguém está bloqueado: ele lê esse estado daqui, em vez de manter o seu próprio.
- Dispensável quando se trata de um conjunto de atores, e não de um par com estado: isso é um grupo. Um grupo por par significaria milhões de grupos de duas pessoas, cada um com ciclo de vida e regras de entrada próprios.
Quem faz o quê
| Ator | Pode | Não pode |
|---|---|---|
player | propor uma relação ou seguir; aceitar, recusar ou retirar; desfazer uma relação mútua; bloquear e desbloquear; ler as próprias relações e a presença dos atores relacionados; assinar as mudanças; enviar um pedido de entrada | ler a lista de relações de qualquer outra pessoa, seja qual for a relação entre os participantes |
moderator | decidir sobre convites e pedidos de entrada onde tem a permissão atômica de administrar a participação | decidir sobre uma intenção para a qual não tem permissão — a resposta é forbidden |
O modelo
O que a declaração de uma relação contém.
| Declara | O que é |
|---|---|
kind | simétrica — o par precisa que os dois lados concordem, e a máquina de estados abaixo trata dela; ou unilateral — seguir, cujo único estado é active. A unicidade por par e a idempotência da proposta valem para as duas |
regra de novo convite | depois de uma recusa: proibido · permitido após um período declarado · permitido na hora. É declarada porque “pedir de novo” é uma decisão de produto |
visibilidade da presença | um predicado — para todos · só para quem tem relação mútua · para ninguém. Não há padrão |
modo de entrada (no tipo de grupo) | aberto · por pedido com decisão · só por convite |
retenção das recusadas e desfeitas | depois do período declarado, a relação é removida, e um novo convite volta a ser possível independentemente da regra de novo convite |
Os estados de uma relação simétrica.
| Estado | Significado |
|---|---|
proposed | o iniciador propôs e o outro lado ainda não respondeu |
mutual | os dois lados concordam |
declined | o outro lado recusou. A relação é mantida, porque a regra de novo convite precisa dessa informação |
broken | um dos lados saiu de uma relação mútua |
blocked | um lado bloqueou o outro |
O que vale para toda relação.
| Sempre | O que é |
|---|---|
uma entidade por par | e não dois registros espelhados. “A fez uma proposta a B” e “B recebeu uma proposta de A” são um só fato, lido dos dois lados |
um iniciador | é declarado: quem propôs, informação de que tanto a exibição quanto a regra de novo convite precisam |
o bloqueio prevalece | a partir dele não há transição para proposed nem para mutual |
um bloqueio | é assimétrico no controle e simétrico no efeito: só quem bloqueou pode desfazer o bloqueio, e ele vale nos dois sentidos |
o estado de bloqueio | pertence a este módulo e é consumido por outros: o módulo Messaging e outros o leem; nenhum deles o altera nem guarda uma cópia |
a presença | é derivada das sessões: ninguém a escreve, e o predicado de visibilidade é aplicado a cada solicitante, e não uma vez por ator |
uma intenção pendente | não ocupa vaga (seat): um convite ou um pedido de entrada nunca conta para a capacidade do grupo, então cem pedidos não esgotam um clã de cinquenta |
um grupo | sempre tem um administrador: pelo menos um ator precisa ter a permissão atômica de administrar a participação, e o último não pode simplesmente sair — um clã cujo último administrador foi embora nunca mais poderia aceitar ninguém |
sem papéis internos ao grupo | “oficial do clã” é um ator que tem uma permissão atômica, não um cargo guardado numa lista |
a importação nunca sobrescreve | as relações trazidas de um provedor de login só se somam às existentes: alguém bloqueado não vira amigo porque um provedor diz que é |
Erros
- Relação já mútua é um conflito; não há o que propor.
- Uma proposta para si mesmo é uma recusa de validação.
- Um dos lados bloqueou responde not found — e não forbidden, porque uma recusa que diferenciasse os casos revelaria o bloqueio. Não adianta repetir.
- Um novo convite antes do prazo é um conflito; vale repetir depois dele.
- Um limite esgotado — de relações, de intenções — é um conflito, não forbidden: a permissão existe, mas não sobrou capacidade. Tente de novo quando uma vaga for liberada ou quando as intenções existentes tiverem sido decididas.
- Uma intenção expirada é um conflito: crie uma nova em vez de repetir a antiga.
- A saída do último administrador de um grupo é um conflito até a permissão ser repassada.
- Decidir sobre a intenção de outra pessoa sem a permissão responde forbidden, e não adianta repetir.
- Uma importação de um provedor não conectado responde unavailable: tente de novo com backoff.
Limites
Os números chegam com o capítulo de limites da plataforma; o que acontece em cada teto já está definido.
- Relações mútuas por ator: a proposta é recusada como conflito; as existentes nunca são desfeitas para abrir espaço.
- Relações unilaterais por ator: uma nova é recusada; as existentes ficam.
- Propostas enviadas: uma nova é recusada, e nenhuma é descartada: um convite descartado pareceria um convite recusado.
- Bloqueios por ator: adicionar mais um é recusado como conflito, e os bloqueios antigos não são descartados, então ninguém é desbloqueado em silêncio.
- Validade de uma intenção:
expired, com um evento. - Frequência de propostas por ator: um rate limit com prazo.
- Frequência de mudanças de presença no fluxo (stream): limitada pela taxa de atualização, e não pelo descarte de mudanças.
- Retenção de relações recusadas e desfeitas: remoção conforme o período declarado.