предисловие
Поиск в WeChat【Java3y】Следуйте за этим человеком с мечтами, ставьте лайки и подписывайтесь - это самая большая поддержка для меня!
Текст был включен в мой GitHub:GitHub.com/Zhongf UC очень…, с более чем 300 оригинальными статьями, недавно опубликованнымиИнтервью и проектыряд!
Я, Санвэй, недавно начну писать серию статей о проекте. Я дал этому сериалу название "раскрыть》
Да, я снова вырыл себе яму.
Почему вы хотите писать статьи, связанные с проектом? Причины следующие:
- Когда я официально не приступаю к работе, я часто думаю: «Я видел видеопроекты в Интернете, нореальный бизнес-проектНа что это похоже? Будет ли это сложно? «Мне любопытно узнать, в чем разница между реальным бизнес-проектом и проектом, которым я занимаюсь.оценитьСтуденты, которые еще не работали, должны иметь похожие на меня мысли, верно?
- Замаскировавшись, подтолкните себя к тому, чтобы продолжать работать, учиться и расти в процессе. Следуйте за мной.Могут быть новички, или могут быть большие шишки в той же области, что и я. Я записал то, что знал: возможно, план внедрения с моей стороны был отвергнут крупными парнями После общения и обучения план внедрения моей системы был улучшен. Это также может дать некоторое справочное значение для студентов, которые готовятся выйти на поле.Разве это не красиво?
Эта серия начинается словами "Платформа управления сообщениями«Давайте сделаем образец, это система, которую я поддерживал почти год. Эта статья может занять васВсестороннее пониманиеКак спроектирована и реализована «платформа управления сообщениями» Заинтересованные студенты могут оставлять сообщения и общаться в области комментариев.
Эта статья может быть немного длинной, я намеренодинЧетко объясните систему. Принцип «платформы управления сообщениями» не сложен, профессиональных терминов не так много, и реализовать его будет несложно.Если вы думаете, что узнали что-то, пожалуйста, дайте мне большой палец вверх👍
Простое понимание «Платформы управления сообщениями»
"Платформа управления сообщениями" может иметь разные названия в разных компаниях. Иногда я называю ее "Push System", иногда я называю ее "Платформой управления сообщениями", а некоторые коллеги называют ее "Touch Touch" Platform, даже если это преувеличение, Я могу назвать это «Информационным центром».
Но в любом случае его функциясообщение пользователю. Как он позиционируется в компании? если тольков официальном названииОтправленные сообщения проходят через платформу управления сообщениями.
Обычно вы подписываетесь наAPP/网站
, вы можете получить该APP/网站
Какое сообщение я вам посылаю? Вообще ниже, да?
- Письмо на месте (IM): На самом деле, этоВнутри приложениясообщение в чате
- Сообщение панели уведомлений (PUSH): системное всплывающее сообщение
- Электронная почта (электронная почта) сообщение
- смс (смс) сообщение
- Сообщение об учетной записи службы WeChat
- Сообщение апплета WeChat (служебное уведомление)
хорошо, я доверяю тебеуже зналиДля чего используется эта система? Так зачем эта система?
Зачем нужна платформа управления сообщениями?
Можно сказать, что почти все компании, производящие приложения, имеют платформу управления сообщениями.
Много раз мы хотим отправить сообщение пользователю:
- Возможно, пользователю нужна такая функция (напоминание о записи на прием)
- Также возможно, что мы хотим «разбудить»/«уведомить» и другие операции, отправив сообщение, чтобы сообщить пользователю, что мы все еще там (дядя пришел поиграть)
Итак, вопрос в том, трудно ли отправить сообщение? Сложно отправить сообщение?
Очевидно, что отправить сообщение очень просто и совсем не сложно.
Отправка текстовых сообщений — это не что иное, как вызов стороннего SMS API, отправка электронных писем — это не что иное, как вызов API для электронных писем, а отправка сообщений, подобных WeChat (мобильный QQ/мини-программа/учетная запись службы WeChat), — это не что иное, как вызов WeChat API и отправка сообщений панели уведомлений (Push) Это не что иное, как настройка API производителей APNS/мобильных телефонов, отправка IM-сообщений, вы также можете использовать облачные сервисы и настройка API облачных сервисов...
Может быть, проекты многих людей делают это,Это не что иное, как сообщение, и его можно реализовать самостоятельно..
Но проблема, которую это принесет, заключается в том, что внутри компании будет много проектов, которые будут иметь реализации кода для «отправки сообщений». Если есть проблема с отправкой сообщения, вам придется решать ее самостоятельно.
Во-первых, систему непросто поддерживать, а во-вторых, она не нужна.Я рекламщик, хоть и хочу отправить сообщение, зачем мне это делать самому?
Когда мы пишем код, мы можем извлечь общий код в методы для повторных вызовов текущим проектом. Если общий код используется несколькими проектами, мы можем взять еще одну долюпакет компонентов, используемый несколькими проектами. покаобщедоступный кодИспользуемый достаточным количеством людей, он, вероятно, вырастет из компонента вПлатформа(системный) уровень вещи.
Как внедрить платформу управления сообщениями?
Вернемся к сути платформы управления сообщениями.Отправить сообщениесистема. Как спроектировать и реализовать? мы начинаем синтерфейсДавайте начнем.
дизайн интерфейса
Платформа управления сообщениями представляет собойслужба обмена сообщениямиплатформу, если бы я реализовал ее, моя идея могла бы заключаться в том, чтобы поставитьНапишите интерфейс для каждого типа сообщений, а затем открыть эти интерфейсы для внешнего мира.
Итак, могут быть следующие интерфейсы:
/**
* content:发送的文案
* receiver:接收者
*/
sendSms(String content,String receiver);
sendIm(String content,String receiver);
sendPush(String content,String receiver);
sendEmail(String content,String receiver);
sendTencent(String content,String receiver);
//....
Кажется, что это не невозможно реализовать таким образом.В любом случае, каждый интерфейс вполне понятен.Какое сообщение должно быть отправлено, какой интерфейс вы вызываете, все в порядке.
Предположим, мы определили вышеуказанный интерфейс, и теперь мы хотим отправить сообщение, у нас будут следующие сценарии:
- Копия: «Здравствуйте, я Санвай», получатель: «восисанвай» (Отправлять только одному человеку за раз)
- Копия: «Здравствуйте, я Санвэй», получатель: «woshisanwai,java3y,javayyy» (Отправка одной и той же копии нескольким людям)
Если вы новичок, вы можете подумать: это просто, я разделяю два интерфейса для каждого типа, one-shot и пакетный интерфейс.
sendSingleSms();
sendBatchSms();
//...
Нужен ли приведенный выше дизайн? На самом деле это не обязательно. Я определяю получателя какArray
Разве ты не должен?Array
изsize==1
, то я отправлю копию этому человеку,Array
изsize>1
, то я отправлю эту копиюArray
все внутри.
Итак, у нас все еще есть только один интерфейс:
/**
* content:发送的文案
* receiver:接收者(可多个,可单个)
*/
sendSms(String content,Set<String> receiver);
На самом деле это не определение для насArray
, мой интерфейсreceiver
все ещеString
, если их несколько,
Достаточно разделить числа.
/**
* content:发送的文案
* receiver:接收者(可多个,可单个),多个用逗号分隔开
*/
sendSms(String content,String receiver);
Теперь другая сцена,Разные копии для разных людейчто делать? Некоторые люди говорят, разве это уже не достигнуто? Просто вызовите вышеупомянутый интерфейс напрямую, и все готово. дело не в том, что ты не можешьповторные звонки, Например:
- Копия: «Здравствуйте, я Java3y», получатель: «woshisanwai»
- Копия: «Здравствуйте, я Санвэй», получатель: «3y»
- Копия: «Здравствуйте, восисанвай», получатель: «Три криво».
- .....
Действительно, это можно было сделать.но недостаточно хорошо
Давайте возьмем реальный сценарий: теперь, когда якорь в эфире, нужно отправить сообщение, чтобы люди, подписавшиеся на якоря, посмотрели его как можно быстрее. Чтобы улучшить эффект этого уведомления, мы разработали текст следующим образом:{User Nickname}, ведущий Санвай, на которого вы подписаны, уже начал трансляцию, поторопитесь и смотрите его!
Мы должны просить такие новостив реальном времени(Если предположить, что скорость отправки сообщений слишком низкая, когда пользователь получает сообщение и все якоря прекращают трансляцию, то пользователь не должен забивать вас до смерти?)
Голос за кадром: Видимо, так оно и есть.Разные копии для разных людей
Как это сообщение делается на бизнес-уровне? Это может быть сканирование таблицы БД, обход поклонников, которые подписываются на якорь, а затем отправка им сообщений.
Теперь мы можем толькоКаждый раз, когда вы сканируете фаната, который подписывается на ведущего, вам нужно звонитьsend()
интерфейс отправить сообщение. Если якорь имеет500W
фанаты, вы должны позвонить500W
второсортныйsend
Интерфейс, не страшно? Количество звонков, накладные расходы на сеть...
Поэтому мы должны предоставить "партияинтерфейс, который позволяет вызывающему абонентуодин проходРазные экземпляры несут разные люди. Как это сделать? Это также очень просто.На самом деле вышеприведенный интерфейс инкапсулирован другим уровнем, так что вызывающая сторона может "партия" просто передается. Таким образом, код может быть примерно таким:
/**
* 一次传入多个(文案以及发送者)的“组”进来
* List<SendParam>
* SendParam 里边 定义了 content 和receiver
*/
sendBatchSms(List<SendParam> sendParam);
Теперь интерфейс "прототип«Появилось, и вот мы внедрили платформу управления сообщениямисамый простойфункция:Отправить сообщение
Нам все равно, какая внутренняя реализация, предполагая, что мы адаптировали соответствующий API, и теперь наш интерфейс находится вОтправить сообщениеНа уровне уже есть достаточные и необходимые условия: пока вы проходите в接收者和发送内容
, я могу отправить вам сообщение.
Но мы называем это платформой, как мы можем сделать так, чтобы она выглядела так, как будто она инкапсулирует лишь несколько методов, платформа должна иметь вид платформы.
Позвольте мне привести пример самой простой функции в повседневной жизни: кто-то позвонил в мой интерфейс и отправил текстовое сообщение. Текст текстового сообщения был типом кода подтверждения. Он спросил меня, было ли текстовое сообщение доставлено пользователю. .
Если у вас есть доступ к SMS, вы будете знать: отправка текстового сообщения пользователю для его полученияасинхронныйпроцесс
- Позвоните в API провайдера SMS, предполагая, что ваши входные параметры в порядке, он сообщит вам, что «вызов» прошел успешно. ты думаешьнастоящийЧтобы узнать, был ли этот контент доставлен пользователю, у вас есть два способа: во-первых, предоставить интерфейс для звонка поставщику услуг SMS, а когда процесс будет завершен, поставщик услуг SMS вызовет ваш интерфейс и сообщит вам окончательный вариант. результат что есть. Во-вторых, вы идете на опрос интерфейса поставщика услуг SMS, чтобы получить окончательный результат.
Возвращаясь к вопросу, он хочет, чтобы он позвонил в мой интерфейс и успешно отправил текстовое сообщение, тогда я просто прошу его получить его.Номер телефона и копирайтинг, а затем выполните следующие действия:
- Определите, есть ли номер телефона и копия вКогда выпущеноЭто нормально (есть реальный интерфейс для отправки смс)
- Предполагая, что вызов интерфейса SMS прошел успешно, посмотрите на возвращаемыйквитанция(результат доставки) это нормально?
В настоящее время наш существующий интерфейс по-прежнему прекрасно поддерживает вышеуказанные проблемы, верно? Пока мы записываем результаты и информацию о получении, мы можем сказать, были ли предоставлены пользователю номер мобильного телефона и его копия.
Потом сегодня он подошел и спросил: Сегодня многие люди пришли сообщить, что не могут получить код подтверждения по смс (не все, но большинство), я хочу узнать больше о сегодняшнем днеУспешность доставки СМС с проверочным кодомКак много.
В это время я могу только пойтисовпадение(like %%
) Сколько людей его копия вызвала мой API для отправки, сколько людей успешно отправили сообщение в API поставщика услуг SMS, и сколько людей получили успешную квитанцию (результат).
пройти черезсовпадающая копияВ конце концов, можно сообщить ему результат, но это очень глупый X-подход. В конечном счете, это связано с тем, что услуги, предоставляемые системой, все еще слишком слабы.
Итак, как решить проблему, упомянутую выше? Это на самом деле очень просто, совпадающая копия - тупой Х, тогда я дам ему этопартияСМС код подтвержденияуникальный идентификаторРазве этого не будет достаточно?
Как мы идем для доступа к поставщику услуг SMS, нам нужно создать новыйШаблон SMS, этот шаблон представляет содержимое, которое вы хотите отправить. После создания нового шаблона вам будет присвоен идентификатор шаблона. Вы можете указать этот идентификатор шаблона при отправке.
Тогда наша платформа также может играть так, вы хотите отправить сообщение, верно? Хорошо, сначала зайдите на мою платформу и создайте новую"шаблон«Просто пришлите мне идентификатор шаблона в это время.
Таким образом, мы отлично решаем проблемы, указанные выше.
Давайте поговорим об этом сейчасНужно ли разделять разные интерфейсы для разных типов сообщений (SMS, Email, IM и т.д.), на самом деле это не нужно. Поскольку до тех пор, пока понятие «шаблон» абстрагируется, тип сообщения может естественным образом использоваться в шаблоне.лечениеБросьте, пока вы передаете идентификатор шаблона, я буду знать, какой тип сообщения вы отправляете.
Таким образом, мынаконец-тоБудет два интерфейса:партияине замужемОтправить интерфейс.
/**
* 发送消息接口
* @author java3y
*/
public interface SendService {
/**
* 相同文案,发给0~N 人
* @param sendParam
*/
void send(SendParam sendParam);
/**
* 不同文案,发给不同人,一次可接收多组
* @param sendParam
*/
void batchSend(BatchSendParam sendParam);
}
public class SendParam {
/**
* 模板Id
*/
private String templateId;
/**
* 消息参数
*/
private MsgParam msgParam;
}
public class MsgParam {
/**
* 接收者:假设有多个,则用「,」分隔开
*/
private String receiver;
/**
* 自定义参数(文案)
*/
private Map<String, String> variables;
}
Единый интерфейс означает:1~N
люди отправляют сообщение, то, что эта группа людей получает,такой жекопия
Пакетный интерфейс означает: отправку одной копии одному человеку за раз, ноодин звонокВы можете передать N человек и соответствующую копию
Здесь сингл и партии не начинаются сотправительдля определения размеров , нокопия сообщения для человека.
Приведу еще один пример. Сейчас я отправляю сообщение всем одноклассникам, которые подписаны на меня: «С Новым годом, старший брат и невестка». В этом случае мне достаточно использоватьsend
Метод отличный, я отправляю одну и ту же копию группе людей, и эти люди получают точно такую же копию.
однаждыЕдиный push-интерфейсПараметры вызываемого запроса:
{
"templateId": 12345,
"msgParam":
{
"receivers": "三歪,敖丙,鸡蛋,米豆",
"variables": {
"content": "大哥大哥新年好",
"title": "来个赞吧,亲"
}
}
}
Если я хочу отправить сообщение всем одноклассникам, которые подписаны на меня: «{имя пользователя WeChat}, с Новым годом, старший брат», в этом случае я обычно используюbatchSend
способ перед отправкойкомбинацияСоответствующая копия лица упакована вList
, вызов интерфейса — это одиночный вызов вызывающегоList.size()
Компания людей.
однаждыМассовый интерфейсПараметры вызываемого запроса:
{
"templateId": 12345,
"msgParam": [
{
"receivers": "敖丙",
"variables": {
"content": "敖丙,大哥大哥新年好",
"title": "来个赞吧,亲"
}
},
{
"receivers": "鸡蛋",
"variables": {
"content": "鸡蛋,大哥大哥新年好",
"title": "来个赞吧,亲"
}
}
]
}
Я не ожидал, что буду писать такую длинную статью только об интерфейсе, в основном, чтобы позаботиться о неопытных учениках~
Обзор идеи дизайна интерфейса:
- Сначала я хотел разделить разные интерфейсы для каждого типа сообщений.
- учитываяОдна и та же копия будет распространена среди нескольких человек, поэтому параметр получателя должен поддерживать "пакетный" входящий
- учитывая что будетпартияСцена вызова интерфейса, поэтому требуется пакетный интерфейс
- с учетом необходимостистатистикаСценарий отправки сообщения, поэтому необходимо абстрагировать «шаблон», а сообщение, отправляемое на платформе, должно иметь «шаблон»
- С помощью «шаблонов» можно хранить большое количество информации.лечениев шаблон, так что в итоге мы абстрагируем два интерфейса: одиночный push и пакетный.
Поговорим о шаблонах
Мы определили интерфейс в начале, и давайте поговорим о функции отправки сообщений, которую вы реализовали.Основное отличиепросто более"шаблон"Концепция чего-либо.
Один момент, упомянутый выше:С помощью «шаблона» в шаблон можно закрепить большое количество информации.. Так что же мы закрепляем в шаблоне?
-
типы сообщений, которые можно отправлять. Платформа управления сообщениями может отправлять различные типы сообщений, поэтому в нашем шаблоне должны быть поля.Различать разные типы сообщений. Не думайте так много, на самом деле, мы используем
1
означает СМС,2
значит почта... - Информация о создателе шаблона(номер мобильного телефона, имя), это не имеет никакого отношения к сути сообщения, но если есть какая-то неописуемая проблема с шаблоном, предъявитель должен это выяснить, а если создатель шаблона уйдет? Ничего, найду отдел по создателю, потом найду отдел виноватый (хе-хе)
-
текст сообщения. Комбинируя сообщения, показанные выше, мы видим, что сообщение состоит из следующих частей: содержание, заголовок, изображение, ссылка, видео... Различные сообщения могут отправлять разные тексты, например текстовые сообщения.в большинствеЕсть только содержимое и ссылки, а сообщение панели уведомлений (Push) может иметь заголовки, содержимое, изображения и ссылки. Итак, мы будем использовать копию сообщения как
json
формат хранится вполесередина. - бизнес-правила для сообщений. Упомянутые здесь бизнес-правила на самом деле не являются подробным бизнес-правилом, но относятся к разным типам сообщений.ограничения платформы. Например, впродуктНа уровне, я надеюсь, что пользователи не будут получать пуши панели уведомлений ночью (ведь это будет мешать пользователям); я надеюсь, что пользователи не будут получать два пуша панели уведомлений в течение часа, а максимум N пушей панели уведомлений в день ( также для пользовательского опыта). Этиограничения платформыЭто можно сделать на платформе управления сообщениями, вы можете понимать это какраскрыть все деталифункция.
- отправить аккаунт. Какие? Отправка сообщения и концепция учетной записи? Вы ошиблись, три криво? . На самом деле он существует.Вы можете выбирать разные учетные записи электронной почты при отправке электронных писем, вы можете выбирать разные общедоступные учетные записи WeChat при отправке сообщений официальной учетной записи WeChat (аналогично небольшим программам), и вы можете использовать разные учетные записи при отправке мгновенных сообщений. При доступе к текстовым сообщениям на самом деле есть два типа: уведомление и маркетинг. Мы абстрагируем все это какСчет.
-
Тип идентификатора получателя. IM-сообщение на станции использует внутристанционное IM-сообщение.
userId
, используется сообщение панели уведомлений (PUSH)did
, номер мобильного телефона используется для отправки текстовых сообщений, а номер, используемый для отправки сообщений WeChat,openId
. Укажите тип идентификатора получателя, указав, какой тип шаблона вы хотите передать.id
. Предположим, вы указываете, чтоuserId
, но если вы хотите отправлять текстовые сообщения, платформа управления сообщениями должнаuserId
Преобразование в номер телефона. Здесь также идентифицируется полем,1
выражатьuserId
,2
выражатьdid
...
Что можно обнаружить, так это то, что мы запихнули всю информацию (или даже ненужную информацию), необходимую для сообщения, в шаблон, и когда вызывающая сторона передает идентификатор шаблона, я могу получить то, что хочу.всеИнформация.
Это все, что нужно для шаблона? Конечно, нет. Вышеупомянутый шаблонобщностьсодержание, мы нажимаемСценарии использования шаблонаТакже есть два вида:
-
ОперацияШаблон: операция датьобозначать группу людейсуществуеткогда-тоотправлять сообщения. (Эта группа людей
T+1
не в сети). Пример: если пользователь регистрируется и входит в приложение, он можетВ любой другой день(или даже дольше) сообщение пользователю. Это пуш не в реальном времени (офлайн), который не требует технологии для проведения, после выбора толпыУстановите соответствующее времяможно толкнуть. - ТехнологииШаблон: система согласноделовые условияПакет сообщений запускается автоматически, и список получателей также зависит от бизнес-сценария (эта группа людей обычно работает в режиме реального времени). Пример: если пользователь регистрируется и входит в приложение, необходимо немедленно отправить сообщение пользователю. Это толчок в реальном времени, который требует соответствующей технологии.
С развитием систем и услуг,Операцияшаблоны иТехнологииГраницы шаблона размываются. По сути, он предоставляет два способа отправки сообщений:
- Определить группу людей с помощью задач на времяЗапускается вызовом интерфейса в точке (получатель, время копирования и отправки все ясно).
- технический вызовИнтерфейс отправляет сообщение (получатель, копия и время отправки генерируются бизнес-логикой). Пример: Добро пожаловать в Sanwai, ваш код подтверждения: 888. Возникает внутренний призрак, и транзакция завершается. (Когда вы следуете за Санваем, система выдает сообщение. Время отправки, значение проверочного кода и персонал неизвестны)
Когда пользователи создают шаблоны на платформе,Разные типы шаблонов требуют заполнения разных полей: Необходимо заполнить шаблон операцииТолпа и время запуска задачи, а в техническом шаблоне не нужно указывать время срабатывания толпы и задачи, поэтому в нашем шаблоне будет поле для определения того, является ли шаблон типом операции или типом технологии.1
Указывает тип операции,2
Указывает тип техники...
Как вы думаете, все кончено? нено, еще нет. мы такжеРазличать тип сообщения, в настоящее время в основном состоит из трех категорий: уведомление, маркетинговый и проверочный код.
Вопрос в том, почему мы различаем типы сообщений? Для статистики? Конечно нет, для таких типов детализации есть неплохая статистика.
Поясню на примере:2020-02-30
В день операции одноклассники кружок выбрали одного5000W
людей решили отправить текстовое сообщение в 8 часов вечера, грубо сообщая пользователюОбновили три кривые статьи, не смотрите на кровопотери. система в晚上8点
Выполните задание вовремя, прочитайте информацию о шаблоне шаблона и доставьте его.5000W
Человек, может система отправить в секундах? Очевидно нет
Голос за кадром: В дополнение к рассмотрению возможностей собственной системы необходимо также учитывать возможности нисходящего потока.Ты дурачишься, люди не позволят тебе играть.
Итак, это5000W
Должно пройти определенное время, чтобы люди полностью выдали себя, и теперь мы предполагаем, что это15分钟
Полностью отправьте его. существует8点2分
Сработало смс с проверочным кодом, и результат был из-за этого5000W
Разумно ли, что сообщение кода подтверждения задерживается из-за толпы Явно неразумно.
Как это произошло? Причина в этом5000W
Сообщение и сообщение с кодом подтверждения совпадают.ряд, в результате чего сообщение с кодом подтверждения будет заблокировано. Мы можем решить вышеуказанные проблемы, используя разные каналы для разных типов сообщений.
Поэтому наша система использует шаблон операции на уровне проектирования.настройки по умолчаниюявляется сообщением маркетингового типа, а тип сообщения технического шаблона выбирается вызывающим абонентом. В реальных сценариях можно заблокировать только маркетинговые сообщения.
Голос за кадром: Упомянутые выше практики связаны со сценариями использования и конкретным бизнесом, и, конечно же, не все из них можно обдумать за одну ночь.
Шаблон тоже обсуждался, и я не буду вдаваться в некоторые подробности. Позвольте мне кратко резюмировать:
- мы отправляем сообщениенеобходимыйинформация (копирайтинг, номер счета отправки, тип идентификатора входящего получателя, тип сообщения: уведомление, маркетинговый и проверочный код),информация о платформе(Бизнес-правила: дедуплицировать, блокировать, отображать логику и т. д.) и основная информация (информация о деловой стороне, имя сообщения) — все это вставляется в шаблон.
- В зависимости от сценариев использования шаблоны делятся на операционные шаблоны и технические шаблоны. Основная особенность шаблона операции заключается в том, что в нем необходимо заполнить информацию о толпе и время отправки.Шаблон операции состоит изСама платформа управления сообщениямиРасписание отправки сообщений.
реализация интерфейса
Прошло много времени с ББ, может многие просто хотят зайти и посмотреть: Санвэй смеет писать секрет в заголовке, кто не может отправить сообщение, почему бы вам просто не вызвать API, и вы все еще можете играть с этим?
Не волнуйтесь, напишите сейчас. Дизайн и шаблон интерфейса выкладывали ранее, а теперь вернемся к реализации интерфейса.
Во-первых, давайте кратко рассмотрим диаграмму связей системной архитектуры платформы управления сообщениями:
Голос за кадром: интерфейс, о котором мы упоминали выше, определен вЕдиный уровень вызовов(уровень доступа)
Звонящий звонит нашемуsend/batchSend
метод, будет ли он напрямую вызывать нижестоящий API для отправки сообщения?Не буду
Слишком рискованно напрямую вызывать нижестоящий API для отправки сообщений.1W+QPS
Это нормально, поэтому, когда мы получаем сообщение, мы просто делаем простойОбработка проверки параметров и заполнение информацииотправить сообщениеочередь сообщенийначальство. Преимущество этого в том, чтоуровень доступа к интерфейсуочень легкий, покаКафка это выдержит, и запрос не проблема.
При отправке в очередь сообщений оно будет отправлено в разные типы сообщений в соответствии с разными типами сообщений.topic
выше, отправляющий уровень слушаетtopic
Просто потребляйте это. Структура примерно такая:
Отправить расход слояtopic
, сообщение будет помещено всоответствующийВ очереди памяти несколько потоков используют сообщения очереди памяти для доставки сообщений.
Видно, что: от слоя доступа к очереди сообщений мы уже сделали анализtopic
Для достижения бизнес-изоляции мы также помещаем их в собственные очереди памяти для использования при использовании. Это достигается:Разные каналы и разные типы сообщений на одном канале не мешают друг другу.
Увидев приведенную выше картинку, задумавшиеся над этим студенты обязательно спросят: Что делает эта очередь памяти? Во всяком случае, вы уже разделены наверхуtopic
Теперь вы можете достичь того, что вы называете «бизнес-изоляцией», без использования очереди памяти.
Действительно, основная причина использования здесь очередей памяти заключается в улучшениипараллелизм. Параллелизм улучшен, что означает, что скорость доставки может быть выше (в процессе доставки сообщений сетевое взаимодействие занимает больше всего времени, и для потребления может быть открыто больше потоков, таких как текстовые сообщения).
Упомянутые выше бизнес-правила выполняются на уровне доставки, включая ночную блокировку, 1-часовую дедупликацию, преобразование идентификаторов и т. д.
- Ночная блокировка, чтобы определить, ночью ли это.Если вы проверяете ночную блокировку и ночью, просто отфильтруйте это.
- 1 час взвешивания занимает
userId+消息渠道
Как ключ, посмотрите, существует ли он в Redis, если он существует, отфильтруйте -
id转换
Мы сделали систему для этой функции, я кратко расскажу об этой части ниже, поэтому не буду вдаваться в подробности.
Голос за кадром: Эту сцену лучше всего использоватьPipelineчитать и писать Redis
с последующимприспособлениеИнтерфейс каждого канала, вызовAPI
Сообщение отправлено, и оно мало чем отличается от вашей единственной реализации.Может ли вызов интерфейса доставить вам удовольствие? (Стиль кода будет немного лучше, шаблон метода шаблона, цепочка ответственности, шаблоны производителя и потребителя и т. д. имеют соответствующие приложения в проекте)
Подводя итог реализации интерфейса:
- Когда вызывающая сторона вызывает интерфейс, интерфейс неСинхронизироватьнапрямую звонить нижестоящему
API
Отправляйте сообщения, но помещайте их в очередь сообщений (поддержка высокого параллелизма) - При помещении в очередь оно будет классифицироваться по разным каналам и разным типам сообщений и помещаться в разные темы (деловая изоляция).
- При использовании очереди блокирующая очередь используется локально для улучшения параллелизма (ускорения потребления).
Преобразование идентификатора (расширенное)
Как упоминалось ранее, для отправки разных типов сообщений потребуются разныеid
Тип: потребности класса WeChatopenId
, SMS нужен номер мобильного телефона, панель push-уведомлений требует push-уведомленийdid
.
В большинстве случаев общий вызывающий абонент будет проходить вuserId
Дайте мне это, мне нужно сопоставить разные типы сообщений на моей сторонеuserId
для преобразования.
Итак, как мы реализуем эту систему на нашей стороне? Основные шаги и логика следующие:
- Отслеживайте изменения пользователей и подписки/отключения общедоступных учетных записей WeChat
topic
,существуетFlink
Очистить единую модель данных и записать очищенные данные в другуюtopic
. - Монитор системы сопоставления идентификаторов
Flink
вычистилиtopic
, запись в источник данных в режиме реального времени (здесь мы используем поисковик)
Было бы не сложно посмотреть, не так ли?
Задумывались ли вы когда-нибудь над вопросом, зачем использовать систему сопоставления идентификаторов для мониторингаFlink
вымываютсяtopic
, вместоFlink
Как насчет записи непосредственно в источник данных?
На самом деле совершенно не проблема писать напрямую в источник данных через Flink, а инкапсуляция системы сопоставления идентификаторов может сделать эту работу еще более сложной.дотошный.
Что можно узнать из описания, так это: в приведенном выше реализовано толькоприращение в реальном времени. Много раз мы будем беспокоиться о проблеме увеличения, что приводит к неточности или потере некоторых данных, и мы напишем полную копию, и то же самое верно для сопоставления идентификаторов.
Как выполняется полное сопоставление идентификаторов? Данные пользователя будут храниться вHive
Формируется таблица, и на ее основе строится полный объем отображения Id.Hive
стол для достижения полного объема (ежедневнораннее утроОн прочитает информацию таблицы Hive и снова запишет источник данных).
Исходя из вышеописанной логики, я сделал специальное сопоставление для IdЗакулисное управление(Вы можете вручную активировать полную сумму, включить ли добавочную/полную сумму и изменить время триггера полной суммы)
Статистика
Я думаю, что это платформа управления сообщениямисамый изысканныйчасть.
Возвращаясь к нашей оригинальной ссылке на дизайн интерфейса, мы представили ее из-за необходимости «статистики данных».шаблонКонцепция чего-либо. Теперь у нас есть模板Id
Теперь, как мы можем получить статистику данных на нашей стороне? Наша статистика по новостямРазмеры на основе шаблонабыть реализованным.
При создании шаблона генерируется идентификатор шаблона.На основе этого идентификатора шаблона мы создаем шаблон с именемumpId
Значение: первая цифра — технический/операционный толчок, последние восемь цифр — дата, а средние шесть цифр — идентификатор шаблона.
Потому что все сообщения проходятуровень доступа, если в сообщении есть ссылка, мы добавим ссылкуumpid
параметры, ссылка будет отправляться постояннопроникнуть, пока пользователь не нажмет
Когда каждая система выполняет сообщение, это может привести к тому, что сообщение не будет отправлено (возможно, сообщение дедуплицировано, номер мобильного телефона пользователя может быть неправильным, или пользователь долгое время не входил в систему и т. д.). Мы в этих "ключевая позиция' отмечены журналом, который нам удобно исследовать.
Мы даем ему все эти «ключевые позиции»имя с простыми цифрами. Например: мы используем «11», чтобы обозначить, что у пользователя нет привязанного к нему номера мобильного телефона, «12», чтобы обозначить, что пользователь получил точно такое же сообщение 10 минут назад, и «13», чтобы обозначить, что пользователь заблокировал сообщение... ..
«11», «12», «13», «14», «15», «16», они называются «точка», и записывать эти точки в ключевые позиции, это называется «Похороненный"
С закопанными точками все, что нам нужно сделать, это поставить этисбор очковвверх, а затем единообразно обработать его в наш формат данных и вывести в источник данных.
- Собирать журналы
- журнал очистки
- вывод в источник данных
Существует logAgent, который помогает нам собирать журналы дляKafka, журнал очистки в реальном времени, который мы используем,Flink, после очистки выводим вRedis (в режиме реального времени)/Hive (офлайн).
Пример данных таблицы Hive (в основном используется для статистики автономного отчета):
Redis начнет смногомерныйдля хранения для поддержки наших бизнес-потребностей. Например, чтобы узнать, почему не удалось отправить сообщение, введитеuserId
Найдите его и закончите сразу (все записи в реальном времени записываются в Redis, поэтому данные Redis читаются здесь)
Например, используйте идентификатор шаблона для проверки общей доставки сообщения:
Почему я говорю, что это самая типичная платформа для управления сообщениями?umpId
Он проходит через все системы, через которые проходит платформа управления сообщениями., пока сообщение отправляется на платформе управления сообщениями, оно будет записано и отправлено.точкаПриходитьбыстрый трекРаспространение сообщения.
Подведем итоги статистики:
- дизайн для бизнеса
umpid
, добавить все пуш-ссылки в новостиumpdId
параметр - Откройте восходящий и нисходящий потоки, совместно разработайте и поддерживайте ключевые точки,Единый формат журналадля достижения кросс-платформенного сбора и очистки
- Принимая во внимание требования в режиме реального времени и в автономном режиме, записывайте в различные источники данных и быстро обнаруживайте проблемы с многомерной статистикой в режиме реального времени.
Расскажите об операционном уровне
Как упоминалось ранее, действующий шаблон должен обвести группу людей, а затем отправить сообщение Откуда приходят эти люди?
Давным-давно платформа управления сообщениями также устранила толпу.Общая идея заключается в том, что она может поддерживать文件上传
иhivesql
Есть два способа загрузки, чтобы обвести толпу, обвести их и загрузить вhdfs
читать, поддержка населенияобновить/разделить/экспортироватьи другие функции.
С концепцией толпы вы найдетеСообщения, которые вы получаете, на самом деле связаны с вами(Я вам его не вслепую подсовывал, вас можно обвести только тогда, когда вы в нем находитесь). Может быть, это потому, что вы несколько дней присматривались к платьям, поэтому я отправил вам новости о платьях и привлек вас к их покупке.
Позднее из-за внутреннегоDMP
Подъем системы, толпа будет переданаDMP
к управлению. Но идеи реализации тоже похожи, но все равно то же самое: то, что делают другие, — это платформа, и функции определенно лучше, чем писать несколько интерфейсов сами по себе.
Пуш неизбежно будет посылать неверные сообщения, особенно на стороне операции (десятки миллионов людей отправляются за минуты). Какие меры предприняла наша платформа, чтобы максимально избежать этой проблемы?
После операции по разграничению толпы у нас будет отдельная тестовая функция для "тестирования"не замужем"Пользователь" может нормально отправлять сообщения, и нет ли проблем с копированием ссылки.
Этот шаг необходимо выполнить.Сообщение, отправленное пользователю, должно сначала пройти собственную проверку. Если вы подтвердите, что ссылка и копия верны, отправьте задачу,Утверждение заказа на работуможно отправить позже.
Если вы обнаружите, что после запуска возникла проблема с копированием/ссылкой, вы также можетеЗаблокировать оставшиеся неотправленнымиНовости.
Для (технического толчка) мы настроили "белый список", чтобы получить сообщение.
Онлайн-сообщения имеют логику «дедупликации»:
- Отфильтровывайте повторяющиеся сообщения в течение определенного периода времени
- Оперативный push сообщений (способ разграничения толпы для отправки сообщений) одному и тому же пользователю нужно отправить один раз через определенный промежуток времени.
Хотя мы сформулировали множество правил, чтобы попытаться избежать несчастных случаев, следует сказать, что толчок по-прежнему остаетсясклонный к несчастным случаямфункция.Мой блеск взорвался, если однажды я обнаружу, что в моем толчке произошла авария, не @меня, все в порядке, если вы не видели эту статью.
Суммировать
Я не знаю, считаете ли вы платформу управления сообщениями сложной после прочтения.Система должна быть хорошо понята, не смешанный с большим количеством бизнеса, все материалы связаны с платформой.
Эта система может поддерживать несколько ватт QPS и пропускать миллиарды трафика каждый день.В статье невозможно охватить все функциональные моменты платформы управления сообщениями, и содержание не ограничивается вышеперечисленным, но я должен был объяснить суть ядро четко.
Отправка сообщений может быть настолько же простой, насколько и платформенной. Если вы думаете, что чему-то научились, я надеюсь, что вы можете написать мнесмотрим и пересылаемВолна. Если у вас есть какие-либо вопросы по поводу того, что я написал, пожалуйста, не стесняйтесь делиться ими в комментариях.
Может напишу больше в будущемРекламная системаСопутствующий контент будет обрезан с некоторыми небольшими вопросами.Следует сказать, что рекламная система намного сложнее и интереснее, чем платформа управления сообщениями. Следите за обновлениями, чтобы бронировать свежие статьи заранее, это не оставит вас равнодушными!
Я три кривых, следующий выпускДемистификация – рекламная системадо свидания
Санвай организовал все [Точки знаний на собеседовании в Дачане], [Шаблон резюме] и [Оригинальную статью] в электронную книгу, содержащую в общей сложности 1263 страницы! нажмите нижеСсылка на сайтПросто возьмите это прямо
Содержимое PDF-документоввсе вручную, если вы ничего не понимаете, вы можете напрямуюспросите меня