🌍 Відкрийте понад 60 можливостей продукту. Дізнатися більше →

engineeringproduct

Чому ми не зберігаємо копію вашої адресної книги

Очевидний спосіб побудувати продукт для спільних контактів — імпортувати все. Стягнути кожен контакт із кожного підключеного облікового запису у власну базу даних, оголосити її джерелом правди й виштовхувати зміни назад. Так інженерія простіша: запити швидкі, схема під контролем, а синхронізація зводиться до «порівняй мою базу з їхньою».

Ми свідомо будували Rolyio не так. Ваші контакти живуть у Google і Microsoft. Rolyio зберігає звʼязки спільного доступу та права — посилання між копіями контакту в різних облікових записах, — а не дзеркало вашої адресної книги. У цій публікації пояснюємо, що це означає конкретно й чому ми вважаємо цей компроміс правильним.

Що ми зберігаємо насправді

Коли ви підключаєте обліковий запис і ділитеся лейблом, у базі даних Rolyio зберігаються:

  • Записи облікових записів і токени OAuth — токени зашифровані у спокої за допомогою AES-256-GCM.
  • Метадані лейблів — тонкий шар поверх справжніх структур провайдера. Лейбл і є групою контактів Google чи категорією Outlook; ми зберігаємо, якій групі/категорії він відповідає і з ким ним поділилися.
  • Спільні доступи та ролі — хто має «Перегляд», «Редагування» чи «Може ділитися далі» на якому лейблі, включно з доступами в очікуванні для людей, які ще не входили.
  • Кластери звʼязків — записи, які кажуть: «контакт X в обліковому записі Google власника і контакт Y в Outlook отримувача — це та сама людина». Це серце системи: зіставлення ідентичності, а не зберігання вмісту.
  • Стан синхронізації — інкрементальні токени синхронізації, відбитки змін для захисту від «еха» та часові мітки для розвʼязання конфліктів.

Чого там немає: таблиці з вашими контактами. Під час синхронізації дані контактів протікають через механізм синхронізації з одного облікового запису провайдера в інший, керуючись звʼязками та ролями, — і не осідають у сховищі на нашому боці.

Є один свідомий, обмежений виняток: коли спільний контакт видаляють, ми зберігаємо знімок у Кошику протягом 30 днів, щоб випадкове видалення — ваше чи колеги — можна було відкотити. Через 30 днів знімок стирається. Це страхувальна сітка з терміном придатності, а не тіньова адресна книга. (Її можна очистити й самостійно; див. Кошик і відновлення та видалення ваших даних.)

Чому звʼязки кращі за дзеркала

Менша поверхня для витоку

Архітектура безпеки починається з незручного припущення: скомпрометувати можна будь-яку систему. Питання лише в тому, що дістанеться зловмиснику. У дзеркальній архітектурі відповідь — усі контакти всіх клієнтів: імена, номери телефонів, звʼязки між людьми — усе в одній базі. В архітектурі звʼязків даних контактів, за якими полював би зловмисник, там просто немає. Є метадані — які лейбли з ким спільні — плюс зашифровані токени, ключ до яких живе окремо від бази.

Ми воліємо не бути медовою пасткою. Найменш ризиковані дані — ті, яких ви ніколи не зберігали.

Жодного другого джерела правди

Кожне дзеркало рано чи пізно розходиться зі своїм оригіналом. Віддзеркалена база контактів і копія Google неминуче «розповзуться» — невдала синхронізація тут, стан перегонів там — і тоді продукту доведеться вирішувати, яка версія справжня. Користувачі програють у будь-якому разі: або інструмент показує застарілі дані, або, ще гірше, «виправляє» копію провайдера власною застарілою версією.

Залишаючи провайдера авторитетним джерелом, Rolyio обходить цілий клас проблем. Те, що ви бачите в contacts.google.com чи Outlook, і є правдою. Створіть групу контактів у Google — вона зʼявиться в Rolyio; перейменуйте лейбл у Rolyio — він перейменується в Google. Робота механізму синхронізації — переносити зміни між копіями у провайдерів: із розвʼязанням конфліктів за принципом «останній запис перемагає» з урахуванням ролей і захистом від «еха» на основі відбитків, щоб наші власні записи ніколи не сприймалися як правки користувача. Механіка задокументована в статті як працює синхронізація.

Спільний доступ, який закінчується, коли закінчується

Звʼязки мають ще одну властивість, якої бракує дзеркалам: їх дешево розірвати — повністю. Коли ви скасовуєте спільний доступ до лейбла, Rolyio прибирає спільні контакти з адресних книг отримувачів і видаляє відповідні звʼязки. У нашій базі не залишається жодної залишкової копії того, що бачив отримувач, — бо її там ніколи й не було. Відкликання — це віднімання, а не проєкт із прибирання.

Та сама логіка діє, якщо ви залишаєте Rolyio зовсім. Ваша адресна книга ніколи не була в наших руках, тож немає чого експортувати назад і не треба вірити, що ми все зітремо: видалення облікового запису видаляє звʼязки та зашифровані токени, а ваші контакти залишаються рівно там, де були завжди, — у вашому обліковому записі Google чи Microsoft.

Чого це коштує нам

Чесність вимагає перелічити й недоліки, бо ми платимо за них щодня:

  • Синхронізацію складніше будувати. Без центральної копії кожна операція має міркувати про N копій на боці провайдерів, поєднаних звʼязками. Розвʼязання конфліктів, семантика видалення (надгробки, що поважають ролі) і дедуплікація за email — усе це має працювати в розподіленому середовищі.
  • Ми успадковуємо обмеження провайдерів. Google не дає push-сповіщень для контактів, тож бік Google синхронізується опитуванням приблизно кожні 60 секунд з інкрементальними токенами. Microsoft Graph дає вебхуки, тож бік Microsoft працює майже в реальному часі — але Graph не дозволяє перейменовувати категорії. Дзеркало могло б замаскувати такі асиметрії; ми показуємо їх відкрито й проєктуємо з їх урахуванням.
  • Деякі функції просто поза грою. Усе, що вимагає аналізу вашої повної адресної книги на сервері, суперечить тому, що повної адресної книги в нас немає. Ми вважаємо це обмеження перевагою.

Тест, який ми застосовуємо

Оцінюючи нову можливість, ми ставимо питання: чи можна побудувати це зі звʼязків, ролей і API провайдерів, не накопичуючи даних контактів на нашому боці? Якщо так — будуємо. Якщо ні — шукаємо іншу форму. Міжекосистемний спільний доступ між Google Workspace і Microsoft 365 — визначальна функція продукту — цей тест пройшов: йому потрібні звʼязки ідентичності між екосистемами та синхронізація з урахуванням ролей, а не центральний склад контактів.

Якщо така архітектура збігається з вашим уявленням про те, як інфраструктура має поводитися з вашими даними, — підключіть обліковий запис і подивіться, що саме ми запитуємо: інкрементальні OAuth-дозволи розповідають ту саму історію, що й ця публікація.

Читайте далі

how-to

Пʼять способів позбутися дублікатів контактів

🕐 4 хв читанняЧитати далі
migration

Microsoft закриває EWS: що це означає для ваших спільних контактів

🕐 4 хв читанняЧитати далі
product

Спільні контакти між Google Workspace і Microsoft 365

🕐 4 хв читанняЧитати далі