Групповое сообщение имеет уведомление о прочтении (этот член), это push или pull?

задняя часть

Всякий раз, когда отправляется сообщение 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) Физически удалять данные о прочтении и регулярно удалять или архивировать неосновные исторические данные;

Толкать или тянуть?Любой архитектурный проект, вышедший из строя, — хулиганство.

Путь архитектора- Делитесь техническими идеями

Если вы что-то получили, пожалуйста, перешлите это.