Цю сторінку ще не перекладено — показано англійську версію.
Social
Social додає одне поняття — зв’язок двох акторів, який має власний стан та ініціатора. Клан, гільдія чи загін — це група з шаром зв’язків поверх неї, а не ще один різновид об’єктів. Блокування, яке потрібне кільком модулям, теж живе тут, щоб ним володіло лише одне місце.
Коли це потрібно
- Гравці мають знати одне одного на ім’я: друзі, підписники (follower), списки заблокованих.
- Кланові чи гільдії потрібні правила вступу: запрошення від групи, запит на вступ від актора й рішення щодо кожного з них.
- Список друзів має показувати, хто в мережі: присутність (presence) виводять із сесій, а хто може її бачити, визначає предикат, який оголошуєте ви.
- Іншому модулю треба знати, що когось заблоковано: він читає цей стан звідси, а не зберігає власний.
- Не використовуйте його, якщо йдеться про множину акторів, а не про пару зі станом. Це група, а група на кожну пару означала б мільйони груп із двох людей, кожна з власним життєвим циклом і правилами вступу.
Хто що робить
| Актор | Може | Не може |
|---|---|---|
player | запропонувати зв’язок (relationship) або підписатися на гравця; прийняти, відхилити чи відкликати пропозицію; розірвати взаємний зв’язок; заблокувати й розблокувати; читати власні зв’язки та присутність пов’язаних акторів; підписуватися на зміни; подавати запит на вступ | читати чужий список зв’язків — хоч би яким був зв’язок між учасниками |
moderator | ухвалювати рішення щодо запрошень і запитів на вступ там, де має атомарний дозвіл (permission atom) на керування участю | ухвалювати рішення щодо заявки (intent), на яку не має дозволу, — відповідь буде forbidden |
Модель
Що містить оголошення зв’язку.
| Оголошення | Що це |
|---|---|
kind | симетричний — пара потребує згоди обох сторін, і машина станів нижче стосується саме його; або односторонній — коли гравець підписується на іншого, а єд иний стан такого зв’язку — active. Унікальність на пару й ідемпотентність пропозиції діють для обох видів |
правило повторного запрошення | що можна після відмови: заборонено · дозволено після оголошеного строку · дозволено одразу. Правило оголошують, бо «запитати ще раз» — це продуктове рішення |
видимість присутності | предикат: усім · лише взаємно пов’язаним · нікому. Значення за замовчуванням немає |
режим вступу (для типу групи) | вільний · за запитом із рішенням · лише за запрошенням |
зберігання відхилених і розірваних | після оголошеного строку зв’язок видаляють, і запросити знову можна незалежно від правила повторного запрошення |
Стани симетричного зв’язку.
| Стан | Значення |
|---|---|
proposed | ініціатор запропонував, а інша сторона ще не відповіла |
mutual | обидві сторони згодні |
declined | інша сторона відмовилася. Платформа зберігає зв’язок, бо правило повторного запрошення має про це знати |
broken | одна зі сторін вийшла із взаємного зв’язку |
blocked | одна сторона заблокувала іншу |
Що справджується для кожного зв’язку.
| Завжди | Що це |
|---|---|
одна сутність на пару | а не два дзеркальні записи. «A запропонував B» і «B отримав пропозицію від A» — це один факт, який читають із двох боків |
ініціатор | оголошений: відомо, хто запропонував. Це потрібно і для відображення, і для правила повторного запрошення |
блокування переважає | з нього немає переходу в proposed чи mutual |
блокування | несиметричне за керуванням і симетричне за дією: зняти його може лише той, хто встановив, а діє воно в обидва боки |
стан блокування | належить цьому модулю, а використовують його інші: його читають Messaging та інші модулі, але жоден із них його не змінює й не зберігає копії |
присутність | виводять із сесій, і ніхто її не записує. Предикат видимості застосовують для кожного запитувача окремо, а не один раз для актора |
відкладена заявка | не займає місця (seat): запрошення чи запит на вступ ніколи не зараховують до місткості групи, тож сотня запитів не вичерпає клан на п’ятдесят осіб |
група | завжди має адміністратора: принаймні один актор повинен мати атомарний дозвіл на керування участю, і останній такий актор не може просто піти. Клан, з якого вийшов останній адміністратор, уже ніколи нікого не зміг би прийняти |
ролей усередині групи немає | «офіцер клану» — це актор з атомарним дозволом, а не звання, записане в списку |
імпорт нічого не перезаписує | зв’язки, імпортовані від провайдера входу, лише додаються: той, кого заблокували, не стане другом лише тому, що так вважає провайдер |
Помилки
- Зв’язок уже взаємний — це конфлікт: пропонувати нічого.
- Пропозиція самому собі — відмова валідації.
- Якщо одна зі сторін заблокувала іншу, відповідь — not found, а не forbidden: відмова, яка розрізняла б ці випадки, видала б блокування. Повторювати марно.
- Повторне запрошення до кінця строку — конфлікт; його варто повторити, коли строк мине.
- Вичерпаний ліміт — зв’язків чи заявок — це конфлікт, а не forbidden: дозвіл є, але місця вже немає. Повторіть, коли щось звільниться або коли за наявними заявками ухвалять рішення.
- Прострочена заявка — конфлікт: створіть нову, а не повторюйте стару.
- Вихід останньо го адміністратора групи — конфлікт, доки дозвіл не передано іншому.
- Рішення щодо чужої заявки без дозволу дає forbidden, і повторювати марно.
- Імпорт від провайдера, який не підключено, дає unavailable: повторюйте зі зростаючою паузою (backoff).
Обмеження
Конкретні числа з’являться разом із розділом про ліміти платформи, а що відбувається на кожній стелі, визначено вже зараз.
- Взаємні зв’язки на актора: пропозицію відхиляють як конфлікт; наявні зв’язки ніколи не розривають, щоб звільнити місце.
- Односторонні зв’язки на актора: новий відхиляють, наявні лишаються.
- Вихідні пропозиції: нову відхиляють, і витіснення немає: витіснене запрошення виглядало б як відхилене.
- Блокування на актора: нове відхиляють як конфлікт, а старі блокування не витісняють, тож нікого не розблокують мовчки.
- Строк дії заявки:
expired, з подією (event). - Частота пропозицій на актора: обмеження частоти з часом, після якого можна повторити.
- Частота змін присутності в потоці даних (stream): її обмежує частота оновлень, а не відкидання змін.
- Зберігання відхилених і розірваних зв’язків: їх видаляють після оголошеного строку.