Esta página aún no está traducida: se muestra la versión en inglés.
Social
Social agrega un solo concepto: la relación entre dos actores, con un estado propio y un iniciador. Un clan, un gremio o un escuadrón es un grupo con una capa de relaciones encima, no otro tipo de cosa. Y el bloqueo, que varios módulos necesitan, vive aquí para que un solo lugar sea su dueño.
Cuándo usarlo
- Los jugadores (player) necesitan encontrarse por nombre: amigos, seguidores, listas de bloqueo.
- Un clan o un gremio necesita reglas de ingreso: una invitación del grupo, una petición de ingreso de un actor y una decisión sobre cualquiera de las dos.
- Una lista de amigos tiene que mostrar quién está en línea: la presencia se deriva de las sesiones, y quién puede verla lo define un predicado que declaras tú.
- Otro módulo necesita saber que alguien está bloqueado: lee ese estado de aquí en lugar de guardar el suyo.
- No lo uses cuando se trate de un conjunto de actores y no de un par con estado: eso es un grupo, y un grupo por cada par significaría millones de grupos de dos personas, cada uno con su propio ciclo de vida y sus reglas de ingreso.
Quién hace qué
| Actor | Puede | No puede |
|---|---|---|
player | proponer una relación o seguir a alguien; aceptar, rechazar o retirar una propuesta; romper una relación mutua; bloquear y desbloquear; leer sus propias relaciones y la presencia de los actores relacionados; suscribirse a los cambios; enviar una petición de ingreso | leer la lista de relaciones de otra persona, sea cual sea la relación que tenga con ella |
moderator | decidir sobre invitaciones y peticiones de ingreso donde tenga el permiso atómico de administración de miembros | decidir sobre una solicitud (intent) para la que no tiene permiso: la respuesta es forbidden |
El modelo
Qué incluye la declaración de una relación.
| Declaración | Qué es |
|---|---|
kind | simétrica: el par necesita que las dos partes estén de acuerdo, y a ella se refiere la máquina de estados de abajo; o unilateral: seguir a alguien, cuyo único estado es active. La unicidad por par y la idempotencia de una propuesta valen para ambas |
regla de reinvitación | después de un rechazo: prohibido · permitido tras un período declarado · permitido de inmediato. Se declara porque “volver a preguntar” es una decisión de producto |
visibilidad de la presencia | un predicado: para todos · solo para quienes tienen una relación mutua · para nadie. No hay valor predeterminado |
modo de ingreso (en el tipo de grupo) | abierto · por petición con una decisión · solo por invitación |
retención de rechazadas y rotas | después del período declarado, la relación se elimina y se vuelve a poder invitar, sin importar la regla de reinvitación |
Los estados de una relación simétrica.
| Estado | Significado |
|---|---|
proposed | el iniciador hizo la propuesta y la otra parte no respondió |
mutual | las dos partes están de acuerdo |
declined | la otra parte se negó. La relación se conserva, porque la regla de reinvitación necesita saberlo |
broken | una de las partes abandonó una relación mutua |
blocked | una parte bloqueó a la otra |
Lo que se cumple en toda relación.
| Siempre | Qué es |
|---|---|
una entidad por par | no dos registros espejo. “A le propuso a B” y “B recibió una propuesta de A” son un mismo hecho leído desde dos lados |
un iniciador | está declarado: quién hizo la propuesta, un dato que necesitan tanto la interfaz como la regla de reinvitación |
blocked manda | desde ese estado no hay transición a proposed ni a mutual |
un bloqueo | es asimétrico en el control y simétrico en el efecto: solo quien lo puso puede quitarlo, y actúa en ambos sentidos |
el estado de bloqueo | su dueño es este módulo y lo consumen otros: Messaging y los demás lo leen; ninguno lo modifica y ninguno guarda una copia |
la presencia | se deriva de las sesiones: nadie la escribe, y el predicado de visibilidad se aplica para cada solicitante, no una sola vez por actor |
una solicitud pendiente | no ocupa un lugar (seat): una invitación o una petición de ingreso nunca cuenta para la capacidad del grupo, así que cien peticiones no pueden llenar un clan de cincuenta |
un grupo | siempre conserva un administrador: al menos un actor tiene que tener el permiso atómico de administración de miembros, y el último no puede simplemente irse. Un clan cuyo último administrador se fue nunca podría volver a admitir a nadie |
no hay roles dentro del grupo | “oficial del clan” es un actor que tiene un permiso atómico, no un rango guardado en una lista |
una importación nunca sobrescribe | las relaciones que llegan desde un proveedor de inicio de sesión solo se suman: alguien bloqueado no se vuelve amigo porque lo diga un proveedor |
Errores
- Una relación que ya es mutua es un conflicto: no hay nada que proponer.
- Una propuesta a uno mismo es un rechazo de validación.
- Si una de las partes bloqueó a la otra, la respuesta es not found, no forbidden, porque un rechazo que distinguiera los dos casos revelaría el bloqueo. No tiene sentido repetir.
- Una reinvitación antes del plazo es un conflicto; vale la pena repetirla cuando el plazo vence.
- Un límite agotado — de relaciones, de solicitudes — es un conflicto, no una prohibición: el permiso está, pero no queda capacidad. Reintenta cuando se libere un lugar o cuando se hayan decidido las solicitudes existentes.
- Una solicitud vencida es un conflicto: crea una nueva en lugar de reintentar la anterior.
- La salida del último administrador de un grupo es un conflicto hasta que transfiera el permiso a otro actor.
- Decidir sobre la solicitud de otro sin el permiso recibe forbidden, y no tiene sentido repetir.
- Una importación desde un proveedor que no está conectado recibe unavailable: reintenta con backoff.
Límites
Los números llegarán con el capítulo sobre los límites de la plataforma; lo que pasa al alcanzar cada tope ya está definido.
- Relaciones mutuas por actor: una propuesta se rechaza como conflicto; las existentes nunca se rompen para hacer lugar.
- Relaciones unilaterales por actor: se rechaza la nueva; las existentes se mantienen.
- Propuestas salientes: se rechaza la nueva, y no se expulsa ninguna: una invitación expulsada se vería igual que una rechazada.
- Bloqueos por actor: agregar uno se rechaza como conflicto, y los bloqueos antiguos no se expulsan, así que nadie queda desbloqueado en silencio.
- Vida útil de una solicitud:
expired, con un evento. - Frecuencia de propuestas por actor: un límite de frecuencia con plazo.
- Frecuencia de cambios de presencia en el flujo (stream): se acota con la frecuencia de actualización, no descartando cambios.
- Retención de relaciones rechazadas y rotas: se eliminan al cumplirse el período declarado.