LINUX.ORG.RU

Пишем мессенджер. Подумаем об архитектуре БД для черновиков.

 


0

2

Есть мессенджер, в котором несколько разных распределённых баз, ничего не знающих друг от друге и не имеющих распределённых транзакций. Одна база - это, условно, как отдельный постгрес, а распределённая - это значит пошарденая по какому-то ключу. Реально там не постгресы, а скорее рэдисы. То есть, каждая база - это несколько каких-то редисов. У баз есть кодовые имена, типа:

  • MESSAGE - хранит сами сообщения; это особая база, она хранит каждый чатик как вектор объектов Message, больше ничего не умеет. Зато умеет зверски быстро отдать любой подинтервал любого чатика или вставить мессагу в середину чатика длиной миллиард месаг за микросекунду.
  • LIKES - хранит лайки к чему-то, может вернуть число лайков под каким-то объектом по его ID, больше ничо не умеет. Ну и умеет гарантировать, что ты не лайкнул что-то 2 раза. Реакции короче.
  • ACCOUNT - хранит профили юзеров. Пароли там всякие, ID фотки аватара и что-то такое.
  • SESSION - хранит куки или какие-то залогиненные сессии; Буквально это хештаблица sid=uid.
  • ATTACH - хранит инфу про аттачи; буквально хештаблица attach_id = (кодовое filename в хранилище файликов, автор аттача, когда запощено, тип аттача, что-то ещё..)
  • ATTACH_HASH - хранит хеши известных файлов, дедупликация аттачей, чтобы 2 раза одно и тоже не хранить
  • ATTACH_UID - обратный индекс для аттачей uid=[список всех аттачей этого юзера, чтобы можно было все экстремистские материалы сразу майору слить когда террориста поймали]
  • LIBRARY - информация про чатики или группы или каналы. Длинный профиль и настройки чатика. Буквально хештаблица chat_id = (структура данных про этот чатик рассказывающая - кто создал, когда, полное имя, полное описание, аватарка, флаги разрешённых действий с чатиком, список модеров и владельцев и прочая херобаза)
  • CONTACTLIST - контактлисты юзеров. Ты в чатик зашёл, тебе его в контактлист захерачили. В мессенджер вошёл - твой контактлист вычитали и тебе вернули, чтобы ты мог в свои чатики или в свои контакты смотреть.
  • и т.п. Разных баз около 20 под каждый пук.

И тут мы захотели сделать черновики. Ну короче, запилили базу DRAFT и запилили функционал в клиента и в сервер. Набираемое в поле ввода периодически отправляется серверу, сервер это кладёт в отдельную базу «DRAFT». Когда клиент умер и переподключился, то открыв данный чатик ему подгрузят из DRAFT что он там набирал и он может продолжить. Всё как-бы хорошо, но есть приколы.

  1. Раньше постинг мессаги предполагал на backend 1 запрос в базу MESSAGE - запостил и готово, а теперь 2 запроса - надо ещё удалить эту мессагу из DRAFT.
  2. Если DRAFT упала и там что-то было, а ты уже запостил, то потом внезапно клиенту восстанет из ада старый черновик. Возможно это чем-то хорошо, ну мол лучше данные сохранить, чем потерять, но всё равно странновато.

Потом возникла идея, которую надо обсудить.

  1. Выкинуть базу DRAFT и сохранять черновик в базу MESSAGE в отдельную табличку в той же шарде. Когда юзер постит, сделать хитрее: выполнить в базе особо хитровыдуманную атомарную команду «move» которая атомарно-транзакционно переместит черновик как он есть в таблицу сообщений (тут предполагается, конечно, что мы доводим черновик перед этим до состояния финальной мессаги, то есть досылаем в черновик те изменения, которые юзверь сделал после последнего SAVE_DRAFT и до MSG_SEND). В постгресе такой «move» бы наверно делался как небольшая транзакция вида "BEGIN; вставить в MSG результат подзапроса из DRAFT; delete from DRAFT; COMMIT;). Решается сразу проблемы (1) и (2).

Но тут возникла такая приколюха:

  1. Если раньше база MESSAGE была нагружена на запись только тем, что туда постили финальные мессаги, то теперь каждые 2 секунды туда будет апдейт черновика от каждого кто печатает. То есть, это сразу кратный рост нагрузки в разы. Прям в разы. Потому что для каждого «поста» финального сообщения в чатик, который совершался и раньше, теперь этот пост ещё льётся нам каждые 2 секунды в эту базу в отдельную табличку апдейтом. Теперь если посмотреть на пишущую нагрузку в базу MESSAGE то добавление финальных сообщений в неё - это теперь не основная нагрузка, основная - куча апдейтов черновиков.

Короче как лучше не понятно. Ужирнить MESSAGE и забить болт или всё таки юзать схему с отдельной базуней DRAFT?



Последнее исправление: lesopilorama (всего исправлений: 1)

Во-первых, подумай о том, нельзя ли черновики всё-таки сохранять в клиенте. Потому как сохранять их на сервере можно для двух целей: 1) хочешь смотреть что они там пишут даже неотправленное, 2) хочешь шарить черновики между разными экземплярами клиента одного аккаунта. Тебе нужно что-то из этого? Хорошо, если даже нужно, ты уверен что это нужно каждые две секунды? Можно, например, сохранять локально в клиенте хоть каждые полсекунды, а на сервер отправлять, например, раз в 10 секунд или даже больше. Тогда в случае «умер клиент, а юзер решил переподключиться с другого устройства» у него может что-то потеряться, но в пределах последних 10 (или сколько выберешь) секунд, а ситуация эта редкая - можно в целом не беспокоиться.

Во-вторых, если сохраняем на сервере (всё или часть, уже не важно), синхронизацию после сбоя всё равно можно возложить на клиент. В черновике надо указывать какой-нить серийный номер (или uuid), а после его отправки - сохранять его в таблице сообщений. И если клиент видит uuid своего текущего черновика в логе отправленного - значит черновик уже успели отправить и он не нужен. Останется только предусмотреть разные мелочи про параллельную работу двух клиентов с одним черновиком (если это разрешено), но всё это можно делать на клиенте и дополнительной нагрузки на сервера не создаст.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Лучше нанять на работу программистов и выкинуть менеджеров с нейронкой из проектирования. Раз столько баз на каждый чих, то значит что мессенджер большой. Большой мессенджер в РФ, который думает не над маскировкой трафика только один и мы все его знаем. У вас что ИРЛ нет денег чтоб нанять челиков у которых больше двух извилин?

anonymous
()
Ответ на: комментарий от firkax
  1. Смотреть что пишут, даже не отправленное - нафиг никому не надо. Ничо там сильно отличающееся от финальной версии в 99% случаев не будет. Если я разраб телеграма и хочется шпионить за юзерами, то интереснее личку читать.

  2. Вот это основная причина. Я сидел дома на ноуте печатал, потом у меня пропал интернет. Я пришёл на работу или достал смартфон - а там хоба и можно допечатать где остановился.

Раз в 2, 5, 10 секунд - не сильно важно. Мы тут думали с поцонами, раз в 10 секунд - слишком долго, много слишком удаётся за это время написать уже. Ну так показалось, может неправда. Плюс, ещё посмотрели как сделано в Yandex-Disk когда документ редактируешь. Там ваще звери, только руки убрал с клавы - хоба сохранилось, там прям вообще задержек нет.

Ну да, может и 10 и 15 секунд норм и пофиг, допечатает эти 5 слов.

Вот это вот «uuid в логе отправленного» - сложно-сложно. Нет никакого лога отправленного. Чатик представляет собой список объектов «Message». Он линейный. Индексов никаких нет. Кроме текстового поиска по мессагам, возможно. То есть, из чатика невозможно быстро достать «последнее сообщение от UID=12345», единственное что чатик может быстро вернуть - это «дай подинтервал месаг offset=9876543, limit=150». Месаги чатика можно только все просканировать, чтобы найти там что-то.

lesopilorama
() автор топика
Ответ на: комментарий от anonymous

Лучше нанять на работу программистов и выкинуть менеджеров с нейронкой из проектирования. Раз столько баз на каждый чих, то значит что мессенджер большой. Большой мессенджер в РФ, который думает не над маскировкой трафика только один и мы все его знаем. У вас что ИРЛ нет денег чтоб нанять челиков у которых больше двух извилин?

Наброс пахнет слабостью, меня не триггернуло.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

Нет никакого лога отправленного. Чатик представляет собой список объектов «Message»

Этот список - и есть лог отправленного. Клиент же показывает на экране свои и чужие сообщения, с указанием таймстампов, авторов? Это лог. В эти метаданные можно добавить uuid черновика, рисовать его на экран не нужно, но использовать для выявления ситуации когда нужно затереть неактуальный черновик можно.

Весь лог просматривать не нужно, достаточно только последние. Можно ещё время создания черновика закодировать в этом uuid и не проверять более старые чем он сообщения. Можно ещё индекс последнего увиденного сообщения в логе на момент сохранения черновика на сервер слать - и не проверять более старые чем оно.

последнее сообщение от UID=12345

UID не важен, можно черновики со сквозной нумерацией чата ассоциировать

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)
Ответ на: комментарий от lesopilorama

Я сидел дома на ноуте печатал, потом у меня пропал интернет. Я пришёл на работу или достал смартфон - а там хоба и можно допечатать где остановился.

Как часто эта ситуация будет происходить? Раз в день, раз в месяц, раз в год? По-моему проблема надумана, и перепечатать ну 100 символов проблем не составит, это же мессенджер для коротких сообщений, а не jira и тд. (в которой такого сохранения нет). Если что-то важное - сохрани и отправь на почту.

masa ★★★
()
Ответ на: комментарий от LightDiver

Это чего, зря я все в json-файлах храню? Надо таки бд подключать?

Не зря, современная файловая система есть навороченная БД, ну точнее один или несколько продуманных B+-Tree структур - в общем ничем не отличается от индекса InnoDB условного. В журналируемой ФС считай даже WAL есть, он же «бинлог», он же «Журнал». Я когда-то давно ещё во времена программирования на PHP сайтов, на файловой системе в .txt файлах запилил целую БД, где про этот сайт всё лежало и страницы динамически даже из MS Word можно было добавлять. Там какое-то дерево у меня было. Файлы назывались типа 1.txt, 122.txt и какой-то файл в начале содержал кодовое слово LIST и был перечислятором каки-то других файлов для чего-то, а какие-то файлы были уже DATA файлами с содержимым страниц. Было круто, у меня где-то проект остался в архиве, надо взорвать гитхаб.

lesopilorama
() автор топика
Ответ на: комментарий от masa

Вот этим и отличается удобный успешный продукт от любительской поделки уровня джаббера - в нормальном продукте ты не задумываешься как тебе каждый раз перелогиниваться, перепечатывать. В нормальном продукте все работает, как надо сразу. Без лишних двиений и неудобств.

В этом и беда линуксов на десктопе, что их пилят те, кто «можно, а зачем».

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от masa

Как часто эта ситуация будет происходить? Раз в день, раз в месяц, раз в год? По-моему проблема надумана, и перепечатать ну 100 символов проблем не составит, это же мессенджер для коротких сообщений, а не jira и тд. (в которой такого сохранения нет). Если что-то важное - сохрани и отправь на почту.

Да вообще редко. Причём, сама эта фича «черновик» - эталонное ненужно, если смотреть статистику полезности фичи. В Telegram я например уже не помню, когда мне эта фича понадобилась. Либо она так естественна, что её не замечаешь, но скорее другое - она редко нужна. Иногда, СУПЕР РЕДКО, раз в 2 года бывает так, что у тебя что-то там в поле ввода удивительно вылезло и ты узнал в этом вылезшем что-то, что пытался отправить с компа но отвлёкся. В этом особая ирония - мы засрём журнал базы MESSAGE этими апдейтами черновиков, которых там будет 95% от всей массы происходящего в базе, а основной массе населения 99% времени это нафиг не усралось.

lesopilorama
() автор топика
Ответ на: комментарий от LightDiver

Ну я согласен, что это крутая фича, но скажем так это вообще не обязательно и, например, в телеграмме это только раздржает. Открываешь чат, а там сохранена какая-то ерунда, которую ты и не хотел отправлять и удалил, но она почему-то сохранилась на сервере и теперь мозолит глаза на всех клиентах. Благо для броса сделали отельную кнопку в настройках - удалить все черновики. Потому что она реально плохо работает и ну за 10 лет мне ни разу в жизни не понадобилась.

Может они убрали эту штуку, нез наю, послдение пару лет не встречал.

masa ★★★
()
Ответ на: комментарий от LightDiver

Вот этим и отличается удобный успешный продукт от любительской поделки уровня джаббера - в нормальном продукте ты не задумываешься как тебе каждый раз перелогиниваться, перепечатывать. В нормальном продукте все работает, как надо сразу. Без лишних двиений и неудобств.

В этом и беда линуксов на десктопе, что их пилят те, кто «можно, а зачем».

Это можн заплюсовать. Крутые продукты круты тем, что их авторов не испугали «преждевременные оптимизации» и они их на совесть сделали и не поленились убить кучу времени и денег на мелкую приятную фичу, которую заметит 1% людей.

lesopilorama
() автор топика
Ответ на: комментарий от masa

У меня в телеге так стены текста хранятся в разных чатиках уже годами.. периодически изменяемые… Фича нереально крутая. В телеге вообще много таких фич в свое время меня поразили.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

У меня в телеге так стены текста хранятся в разных чатиках уже годами.. периодически изменяемые… Фича нереально крутая. В телеге вообще много таких фич в свое время меня поразили.

Да, помню этим иногда пользовался. Но не до такой степени. Но вот действительно, только сейчас вспомнил, что видимо воспринимаю это как естественное: пишешь чуваку пост, но чувак важный и деловой и просто так отправлять прямо сейчас стрёмно, надо перечитать и дополнить потом. Оставляешь в поле ввода просто. Потом вренулся доработал, отправил)

lesopilorama
() автор топика
Ответ на: комментарий от masa

Ну, как сказать, для сохраннения на долгосрок есть избранное - пишешь, редактируешь, тегируешь. На мой взгляд боле очевидная фича.

Ну да, часто в избранном мучу пост и потом его редактирую. Про то, что оставлено в поле ввода и не отправилось нет ощущения «надёжности». Но когда оно там таки сохранилось и вылезло на другом клиенте, то ПРИЯТНЕНЬКО - типа, телеграм подумал о тебе, молодец. Но критичное да, психологически тянешься это в избранное себе отправить отдельным постом, чтобы прям отправилось, а не висело в поле ввода.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

А при чём тут наброс то? Это увы действительность. Даже если в дипломном магистерском проекте дипломник не понимает как ему архитектуру крупными мазками делать (даже если его диплом по физике и программа нужна только для проведения расчётов), то это провальный диплом, на троечку натянется, конечно, чтоб выгнать его подальше и вообще преподавателям сильно осуждается гнать людей с диплома, если они хоть что-то сделали. А тут аж работа как я понял.

Вообще если серьёзно, то я бы делал совсем другую архитектуру для масштабирования. Начал бы не со 100500 баз, а с простого вопроса, вот у тебя есть 100500 клиентов, которые вдруг постят что-то массово. Может олимпиада какая-то началась и фотки полетели, может ещё какой-то эвент ИРЛ. А может РКН твой сервер блокнул случайно или хакеры или авария в датацентре. Куда сообщения девать? Выходит что сообщения у тебя должны лететь на разные сервера в разных частях мира, слово такое умное есть для этого CDN, почитайте там на досуге что это и как это готовят. Не смогли улететь на первый, летят на второй и так далее по списку. Твоя внутренняя сеть серверов должна уметь балансить нагрузку между клиентами и в идеале работа с ней должна быть максимально простой, пряча всю внутреннюю кухню за твоё API (клиент вообще не должен замечать изменений внутренностей мессенджера только если это API не меняется, да и меняют его постепенно, делая сначала apiv1, потом apiv2 и только когда почти все клиенты переедут на v2 то v1 можно удалять в помойку). А как уж ты там внутри базы сделаешь и какие костыли подставишь - дело десятое. И уж никак ты не должен из клиента дёргать напрямую разные базы. За такое тебе базы сломают и будешь ты сам себе злобным буратиной. К твоему серверу к которому обращаются клиенты ты сам решаешь как запросы слать два маленьких или один, но с большей нагрузкой (передавать тебе надо тоже только минимально нужную информацию). А внутри своих серверов уже как хочешь, так и делаешь. А то что у тебя вылезла проблема с удвоениями запросов от клиентов говорит лишь о том, что спроектированных серверов обрабатывающих запросы и API к ним у тебя нет. Беда выходит. Вот и встаёт вопрос, проектировал ли это менеджер с нейронкой или у вас разработчики такого уровня.

Если у тебя внутри твоей сети серверов проблемы (тогда зачем вообще клиента поминать), то надо смотреть что тебе по производительности легче - либо куча мелких запросов, либо крупные. Это всё экспериментально на месте узнаётся из логов и тестов, подсказать что лучше на твоём говнокоде нельзя, по причине того что никто на ЛОР-е его не видел и тестов прогнать не может.

anonymous
()

теперь этот пост ещё льётся нам каждые 2 секунды в эту базу в отдельную табличку апдейтом

Вы чё драфт синкаете каждые две секунды? Почему не 1 раз когда клиент закрывает чат/приложение? Посмотрите как на реддите сделано, балбесы.

no-such-file ★★★★★
()

Вот начинаешь с инфраструктуры, конкретных БД и технологий. Сложные проекты ТРУ архитекторы начинают с предметной области она же бизнес логика + EventStorming + DomainDrivenDesign. А про БД, сервера и т.д. как об инфраструктуре думают в последнюю очередь.

fpastush
()
Ответ на: комментарий от no-such-file

Вы чё драфт синкаете каждые две секунды? Почему не 1 раз когда клиент закрывает чат/приложение? Посмотрите как на реддите сделано, балбесы.

Реддит дауны делали похоже. А что если у меня интернет пропал и я при закрытии приложения не смогу ничего отправить…

lesopilorama
() автор топика
Ответ на: комментарий от fpastush

Вот начинаешь с инфраструктуры, конкретных БД и технологий. Сложные проекты ТРУ архитекторы начинают с предметной области она же бизнес логика + EventStorming + DomainDrivenDesign. А про БД, сервера и т.д. как об инфраструктуре думают в последнюю очередь.

Начато уже всё очень давно. О начинаниях речи нет вообще.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

Оно в телеге замечательно глючит, если несколько устройств (как раз тот что в теме обсуждается).

Иногда на устройство прилетает устаревший синк с другого, а иногда отправил с одного, а на другом черновик висит и не удаляется никогда (при удалении воскресает). Поэтому на практике я такие вещи пишу через «отправить отложенное сообщение через месяц» -> редактирование итеративно до готовности -> отправить немедленно

То есть по cути принудительно использую таблицу messages чтоб обойти все глюки.

GPFault ★★★
()
Ответ на: комментарий от lesopilorama

Если не max, могу присоединиться и организовать мит по архитектуре.

А, прочитал, что это старый проект, не, не могу. Вообще, мессенджер не по архитектуре строго Скайпа с супер годами и годами - отстой по определению.

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 1)

Котаны, а я недавно вечером прибухнул и думал, почему в наше сложное время нет мессенждера со скрытой (одной или несколькими) учеткой? К примеру, вход по графическому ключу, ввел один ключ - попал в учетку А, ввел другой ключ - в учетку Б. Ввел «аварийный» ключ - открылась учетка А, учетка Б удалилась в фоне. Нормально же? Или я чето не понимаю в этих ваших мессенджерах?

anonymous
()
Ответ на: комментарий от Shadow

Если не max, могу присоединиться и организовать мит по архитектуре. А, прочитал, что это старый проект, не, не могу. Вообще, мессенджер не по архитектуре строго Скайпа с супер годами и годами - отстой по определению.

Не MAX конечно же. Если бы я работал в MAX и вытащил такое в публичный доступ, меня бы на вилы подняли по причине NDA и кучи всего ещё. По архитектуре мит не надо наверное, мы тут типа сами йоба-архитекторы в пятом поколении ) А вопрос был про черновики только.

lesopilorama
() автор топика
Ответ на: комментарий от GPFault

Оно в телеге замечательно глючит, если несколько устройств (как раз тот что в теме обсуждается).

Иногда на устройство прилетает устаревший синк с другого, а иногда отправил с одного, а на другом черновик висит и не удаляется никогда (при удалении воскресает). Поэтому на практике я такие вещи пишу через «отправить отложенное сообщение через месяц» -> редактирование итеративно до готовности -> отправить немедленно

В общем, телега не во всём идеальна конечно, аспет хранения черновиков я бы не доверял ни телеге, ни кому-то ещё. Черновики - не столько для важного хранения, сколько просто «мелкая приятная фича», когда ты сочинял пост, пыхтел, а потом хоба кернел паник.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

про черновики только.

если решение внутреннее/корпоративное, выглядит так, что для быстрого и удовлетворительного результата идеально добавить флаг «черновик-пост» в бд messages и не париться. Т.е. сообщение сразу отправляется, но видно адресату по кнопке отправить, а до этого видно только автору. Но придётся делать какой-то diff механизм онлайн обновления сообщения (но его так и так придётся).

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 1)
Ответ на: комментарий от Shadow

если решение внутреннее/корпоративное, выглядит так, что для быстрого и удовлетворительного результата идеально добавить флаг «черновик-пост» в бд messages и не париться. Т.е. сообщение сразу отправляется, но видно адресату по кнопке отправить, а до этого видно только автору. Но придётся делать какой-то diff механизм онлайн обновления сообщения (но его так и так придётся).

Решение глобальное, типа телеграма. Какая разница какое оно, хочется сделать одинаково хорошо и там и там.

Это уже обсуждено в стартовом посте - появляется дикий трафик на MESSAGES, пока морально не привык к этому.

lesopilorama
() автор топика
Ответ на: комментарий от Shadow

да хз, я привык к джейсон формату в работе с телегой - там он официально используется у ботов. Так и сделал в джейсоне все. Удобные же таблицы. Формат простой.

Вообще это был временный вариант - заглушка на время до нормальной базы данных. Но потом как то лениво стало подключать бд, да пока и не надо. Если понадобится, можно будет легко все перенести на бд.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от lesopilorama

Ну так в 99,9% случаев всё будет мультиклиентно.

Но вообще, я кажется понял зачем вам драфты понадобились. Эта ваша балалайка не на ивентах и когда чел написал сообщение, а инета в этот момент нет, то ваш мегамессенджер говорит пук-среньк не могу отправить. И какой-то гений решил что нужно просто каждые 2 секунды сохранять драфт, чтобы было не обидно просрать всё напечатанное.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Ничё не понял. Что значит «на евентах». Если инета нет в момент написания, то это тупо зависит от реализации клиента. Клиент может быть какой-то андроидовый и сохранить себе месагу для будущей отправки и нарисовать символ (!) на мессаге красный.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

Да вообще редко. Причём, сама эта фича «черновик» - эталонное ненужно, если смотреть статистику полезности фичи

в целом да, я не ожидаю от IM наличия функции черновиков.
Но дело в том, что некоторые пытаются использовать IM как замену e-mail, т.е. пишут длинные развернутые сообщения. И вот тут черновики становятся весьма и весьма нужными (с веб-форумами кстати похожая проблема).
Однако правильный подход на мой взгляд не пытаться использовать инструмент не по назначению, а взять e-mail, где всё это уже есть из коробки и сделано, как надо.

MirandaUser2 ★★
()
Ответ на: комментарий от cobold

очистка это скорее всего просто флаг, т.е. все оффсеты остаются валидными.
Если таки сообщения удаляются, то значит инвалидируется кука/токен, привязанная к данной серии постраничных запросов.
В общем небольшая проблема.

MirandaUser2 ★★
()
Ответ на: комментарий от MirandaUser2

очистка это скорее всего просто флаг, т.е. все оффсеты остаются валидными. Если таки сообщения удаляются, то значит инвалидируется кука/токен, привязанная к данной серии постраничных запросов. В общем небольшая проблема.

Да, кстати, есть только флаг. Проблема другая: после массового удаления флуда, у нас поток «deleted». На клиенте надо заниматься игнорами таких сообщений, хотя хз как лучше.

lesopilorama
() автор топика

Сохраняй черновики не каждые 2 секунды, а, например, если юзер перестаёт печатать надолго или если он закрывает диалог. Или сохраняй раз в 2 секунды только на клиенте, а на сервер сохраняй только при неактивности или при закрытии диалога.

Риалтайм синхронизация по мере набора черновика между клиентами, как правило не нужна, потому что либо человек будет набирать сообщение целиком на одном устройстве, либо при смене устройств будет большая задержка (например, начал набирать на компе, задумался, закрыл приложение, спустя несколько часов открыл на телефоне и продолжил набирать).

Касательно атомарного удаления черновика можно присваивать сообщениям и черновикам UUID (генерировать прямо на устройстве), при отправке черновика переиспользовать его UUID для сообщения (таблицы же разные, так что конфликта ключей не будет). Если клиент видит в диалоге сообщение с тем же UUID, что и черновик, он игнорирует черновик (а бекэнд когда-нибудь догадается подчистить черновики).

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)