Всякий раз, когда отправляется сообщение WeChat, я надеюсь, что другая сторона увидит его как можно скорее и ответит как можно скорее, но я все еще не знаю, прочитала ли его другая сторона.
Всякий раз, когда я получаю сообщение WeChat, на которое я не могу ответить немедленно, я молча возвращаюсь, делая вид, что не вижу его.
Голос за кадром: Люди, которые не хотят отвечать, увы, вы просто хороший человек.
WeChat используется для личных социальных сетей, дизайна продукта, онлайн-статуса и обязательных уведомлений о прочтении, и все это может раскрыть личную конфиденциальность, поэтому WeChat не имеет связанных функций.
Dingding используется для делового общения, а его функция «обязательное уведомление о прочтении» не позволяет людям на рабочем месте «притворяться, что они не в сети» и «притворяться, что не получают его».
Более того, в группе Dingding есть функция «обязательное уведомление о прочтении», вы можете узнать, кто прочитал сообщение, а кто не прочитал сообщение, которое вы отправляете в группе.
Каков процесс группового обмена сообщениями, как получатель гарантирует получение группового сообщения и как отправитель получает уведомление о прочтении?Тянуть или толкать, является предметом обсуждения сегодня.
1. Процесс доставки группового сообщения и гарантия доступности
Давайте проследим за ритмом арендодателя и посмотрим, как шаг за шагом составлять групповые сообщения.
Основной вопрос 1: Новости группы, только одна копия? Или по одному на каждого члена?
отвечать: Сохраните копию и настройте групповую очередь сообщений для каждого участника, будет много избыточности данных, что не подходит.
Основной вопрос 2: Если есть только одна копия группового сообщения, как узнать, какие сообщения прочитал каждый участник?
отвечать: Вы можете использовать отношение частичного порядка групповых сообщений для записи last_ack_msgid (last_ack_time) каждого члена.Сообщение до этого сообщения было прочитано, а сообщение после этого сообщения не было прочитано. Эта схема означает, что для каждого пользователя в группе необходимо записать только одно значение.
Ответив на два основных вопроса, приведенных выше, легко получить групповые новости.основная структура данных.
таблица групповых сообщений: запись групповых сообщений.
group_msgs(msgid, gid, sender_uid, time, content);
Значение каждого поля: идентификатор сообщения, идентификатор группы, UID отправителя, время отправки, содержимое отправки.
список участников группы: Запишите участников группы и последнее групповое сообщение, полученное каждым участником.
group_users(gid, uid, last_ack_msgid);
Значение каждого поля: идентификатор группы, UID члена группы и идентификатор последнего группового сообщения, полученного членом группы.
После того, как основная структура данных разработана, давайте взглянем на группупроцесс отправки сообщения.
Деловая сцена:
(1) В группе четыре члена A, uid1, uid2 и uid3;
(2) A, uid1, uid2 находятся в сети и ожидают получать онлайн-сообщения в режиме реального времени;
(3) uid3 находится в автономном режиме, ожидая получения автономных сообщений в будущем;
Весь процесс отправки сообщения 1-4 показан выше:\
(1) А отправляет групповое сообщение;
(2) После того, как сервер получит сообщение, во-первых, ему необходимо реализовать групповое сообщение, а во-вторых, ему необходимо запросить, какие члены группы входят в группу, чтобы реализовать push;
(3) Для членов группы запросите онлайн-статус;
(4) Реализовать push для членов онлайн-группы;
В этом процессе, пока второй шаг сообщения завершен, он может гарантировать, что групповое сообщение не будет потеряно.
Основной вопрос 3: Как гарантировать, что получатель должен получить групповое сообщение?
отвечать: после получения каждого сообщения измените last_ack_msgid каждого члена группы, чтобы сообщить системе, что это сообщение было получено.
Модификация last_ack_msgid онлайн-сообщений и офлайн-сообщений отличается.
заонлайн группа друзей, после получения группового сообщения он подтвердит первый раз и изменит last_ack_msgid.
заофлайн группа друзей, он извлечет все непрочитанные групповые офлайн-сообщения и изменит last_ack_msgid на последнее сообщение, когда вы войдете в следующий раз.
Основной вопрос 4: если подтверждение будет потеряно, будут ли друзья из группы получать дубликаты групповых сообщений?
отвечать: Да, согласно msgid, дедупликация может выполняться локально на стороне клиента.Даже если на системном уровне будут получены повторяющиеся сообщения, хорошее взаимодействие с пользователем все равно может быть гарантировано.
Вышеупомянутый процесс может только гарантировать, что получатель получит сообщение, отправитель по-прежнему не знает, кто прочитал сообщение онлайн, а кто не прочитал сообщение в автономном режиме, и не реализует уведомление о прочтении.Как уведомления о прочтении повлияют на дизайн системы?
2. Прочитайте процесс получения
Для любого группового сообщения, отправляемого отправителем, необходимо знать, сколько людей прочитали сообщение и сколько людей его не прочитали, и для записи этой взаимосвязи необходима базовая таблица.
форма получения сообщения: Уведомление о прочтении, используемое для записи сообщения.
msg_acks(sender_uid, msgid, recv_uid, gid,if_ack);
Значение каждого поля: UID отправителя, ID сообщения, UID получения, ID группы и метка получения.
После добавления логики уведомления о прочтении поток групповых сообщений будет немного изменен.
Шаг 2, после того, как сервер получит сообщение, в дополнение к: \
(1) отправить групповое сообщение;
(2) Запросите, какие члены группы входят в группу, чтобы реализовать push;
Кроме того, вам также необходимо:
(3) Вставьте начальный статус получения каждого сообщения;
\
Процесс изменения last_ack_msgid для получателя будет следующим:\
(1) Отправить запрос подтверждения;
(2) Измените last_ack_msgid и измените статус подтверждения чтения if_ack;
(3) Запрос онлайн-статуса отправителя;
(4) Отправьте уведомление о прочтении отправителю в режиме реального времени (если отправитель находится в сети);
Если отправитель не в сети, он войдет в следующий раз:
(5) Извлекать квитанцию о прочтении каждого сообщения из таблицы ассоциаций;
Предварительные выводы здесь таковы:
(1) Еслиотправитель онлайн, уведомление о прочтении будет отправлено в режиме реального времени;
(2) еслиотправитель не в сети, квитанция о прочтении будет извлечена при следующем подключении к сети;
3. План оптимизации процесса
Снова при детальном анализе «коэффициент распространения шторма сообщений» группового сообщения о прочтении предполагает, что каждая группа имеет 200 пользователей, из которых 20% пользователей находятся в сети, то есть 40 пользователей находятся в сети. Каждый раз, когда пользователь группы отправляет групповое сообщение, будет:
(1) 40 сообщений, отправленных друзьям группы;
(2) 40 подтверждений модифицируют last_ack_msgid и отправляют их на сервер;
(3) 40 квитанций о прочтении, уведомленных отправителю;
Видно, что его коэффициент распространения новостного шторма очень велик.
в то же время:
(1) необходимо сохранить 40 записей подтверждения;
После того, как количество групп, групповых друзей и групповых сообщений увеличится, хранение также станет проблемой.
Есть ли план оптимизации?
Можно ли изменить отправку групповых сообщений на опрос и получение получателем?
отвечать: Нет, прием сообщений и производительность в реальном времени являются основными показателями.
за last_ack_msgid Вам действительно нужно подтверждать каждое групповое сообщение?
отвечать: На самом деле не нужно, можно пакетно ack, получить N групповых сообщений (например, 10) всего, отправить на сервер запрос на модификацию last_ack_msgid, и модифицировать квитанции о прочтении всех запросов до этого запроса, чтобы 40 сообщений могли быть отправлены на сервер.Количество запросов подтверждения, отправляемых на сервер, уменьшено до 1/10 от исходного.
Какие побочные эффекты это принесет?
отвечать: Функция last_ack_msgid заключается в записи группового сообщения, недавно полученного получателем. Если оно не обновляется в режиме реального времени, это может привести к тому, что некоторые групповые сообщения не смогут обновить last_ack_msgid при аварийном выходе, поэтому при следующем входе в систему дублирующаяся группа будет извлечена. Но это не проблема, клиент может выполнить дедупликацию по msgid, и на пользовательский опыт это не повлияет.
Когда отправитель находится в сети, вам действительно нужна push-уведомление в реальном времени для отправки уведомлений о прочтении?
отвечать: На самом деле нет, за каждое отправленное сообщение отправитель будет получать 40 квитанций о прочтении.Использование опроса на вытягивание (например, раз в минуту, 60 запросов в час) может сильно уменьшить количество запросов.
Голос за кадром: Или поместите его непосредственно в запрос проверки активности прикладного уровня, чтобы добавить 0 дополнительных запросов.
Какие побочные эффекты это принесет?
отвечать: квитанция о прочтении не обновляется в режиме реального времени, в худшем случае квитанция будет обновлена через 1 минуту. Конечно, это время опроса можно настроить как компромисс между производительностью и качеством продукта.
Как уменьшить количество данных?
Ответ: Полученные данные не являются базовыми данными.
(1) прочитанные сообщения могут быть физически удалены, а не отмечены для удаления;
(2) Поступления, превышающие N в течение длительного времени, должны быть заархивированы или удалены;
4. Резюме
Для уведомлений о прочтении групповых сообщений, как правило:
(1) Если отправительонлайн, уведомление о прочтении будет отправлено в режиме реального времени;
(2) Если отправительне в сети, квитанция о прочтении будет извлечена при следующем подключении к сети;
Если вы хотите оптимизировать его, вы можете:
(1) Получатель кумулятивно получает N групповых сообщений, а затем подтверждает их пакетами;
(2) Отправитель опрашивает получение уведомления о прочтении;
(3) Физически удалять данные о прочтении и регулярно удалять или архивировать неосновные исторические данные;
Толкать или тянуть?Любой архитектурный проект, вышедший из строя, — хулиганство.
Путь архитектора- Делитесь техническими идеями
Если вы что-то получили, пожалуйста, перешлите это.