Проектирование и реализация системы отправки сообщений в весенней загрузке

Spring Boot

Как общий компонент, push-система имеет следующие значения:

  1. Он будет использоваться несколькими бизнес-проектами, а независимое обслуживание системы push может снизить затраты на обслуживание.
  2. Система push обычно вызывает сторонний API для отправки, а сторонний API обычно имеет ограничение на частоту/количество вызовов.Отправленное сообщение должно пройти через очередь, чтобы разумно вызвать сторонний API, и контролировать частоту и количество звонков.
  3. Бизнес не имеет значения, а общие пуш-системы спроектированы так, что им не нужно заботиться о бизнес-логике.

Основные технологии

  1. очередь сообщений
  2. Вызов API стороннего сервиса
    1. Приложение для Android
    2. Приложение Apple push
    3. апплет WeChat
    4. Электронная почта
    5. DingTalk Push
    6. SMS push

Очередь сообщений использует RocketMQ, предоставленный Alibaba Cloud.Официальные документы:help.aliyun.com/document_…

Временная диаграмма push

推送系统交互时序图

Щелкните правой кнопкой мыши, чтобы открыть новое окно для просмотра больших изображений с высоким разрешением.

Видно, что к системе отправки сообщений подключено множество сторонних сервисов, а качество трехсторонней рассылки трудно унифицировать, поэтому необходимо учитывать повторную попытку отправки сообщений.

Мыслительный процесс

Чтобы контролировать параллелизм, все push-уведомления сначала отправляются в очередь RocketMQ, а количество каждого push-уведомления достигается за счет контроля количества клиентов, использующих очередь.

И Android, и Apple могут использовать push-сервис почтового голубя.

Для отправки почтового голубя требуется, чтобы клиент был интегрирован, а ссылка на SDK клиента:Hong Kong.QQ.com/Hong Kong/Natural_in's…

В настоящее время отдельные разработчики почтовых голубей все еще могут подавать заявки.После создания учетной записи создавать проекты andorid и ios

Запишите здесь APP ID и SECRET KEY, эти два параметра требуются, когда сервер отправляет

Обработка исключений push. При отправке исключения вам необходимо повторить попытку. Повторная попытка может использовать механизм повтора самой очереди сообщений, или вы можете реализовать логику повтора самостоятельно.

Приложение для Android

Официальная документация:Hong Kong.QQ.com/docs/и рентабельность инвестиций…

Библиотека кода:GitHub.com/pigeon push/small…

<!-- 信鸽推送客户端 -->
<dependency>
    <groupId>com.github.xingePush</groupId>
    <artifactId>xinge</artifactId>
    <version>1.2.1</version>
</dependency>

Основной код выглядит следующим образом

Map<String, Object> messagePayload = new HashMap<String, Object>(1);
messagePayload.put("user_id", 1);
messagePayload.put("msg_title", "消息标题");
messagePayload.put("msg_content", "消息内容");
messagePayload.put("msg_type", 1);
messagePayload.put("data", Lists.newHashMap("order_id", 1));

XingeApp xinge = new XingeApp(androidAccessId, androidSecretKey);
MessageAndroid message = new MessageAndroid();
ClickAction action = new ClickAction();
action.setActionType(ClickAction.TYPE_ACTIVITY);
message.setAction(action);
message.setContent(JsonUtil.toJsonString(messagePayload));
message.setType(MessageAndroid.TYPE_MESSAGE);
message.setExpireTime(86400);
message.setCustom(new HashMap<String, Object>(1));
JSONObject response = xinge.pushSingleDevice("用户的PushToken", message);
if (response.getInt(RET_CODE) != 0) {
    // 推送异常了,进行日志记录等
}

Приложение Apple push

Push с использованием библиотеки pushy

<!-- IOS推送客户端 -->
<dependency>
    <groupId>com.turo</groupId>
    <artifactId>pushy</artifactId>
    <version>0.13.3</version>
</dependency>
Map<String, Object> aps = new HashMap<String, Object>(1);
aps.put("alert", "推送内容");
aps.put("sound", "default");
aps.put("badge", 1);

Map<String, Object> data = new HashMap<String, Object>(1);
data.put("msgTitle", "推送标题");
data.put("msgContent", "推送内容");
data.put("msgType", "1");
data.put("userId", "13288888888");
data.put("data", Lists.newHashMap("order_id", 1));

Map<String, Object> messagePayload = new HashMap<String, Object>(1);
messagePayload.put("aps", aps);
messagePayload.put("data", data);

ApnsClient apnsClient = new ApnsClientBuilder()
        .setApnsServer(ApnsClientBuilder.PRODUCTION_APNS_HOST)
        .setClientCredentials(this.getClass().getClassLoader().getResourceAsStream("推送证书相对resources目录的路径"), "")
        .build();

String payload = JsonUtil.toJsonString(messagePayload);
String token = TokenUtil.sanitizeTokenString("app用户的pushToken");

SimpleApnsPushNotification pushNotification = new SimpleApnsPushNotification(token, "com.suxiaolin.app1", payload);

PushNotificationFuture<SimpleApnsPushNotification, PushNotificationResponse<SimpleApnsPushNotification>>
        sendNotificationFuture = apnsClient.sendNotification(pushNotification);

final PushNotificationResponse<SimpleApnsPushNotification> pushNotificationResponse =
        sendNotificationFuture.get();

if (pushNotificationResponse.isAccepted()) {
    System.out.println("Push notification accepted by APNs gateway.");
} else {
    System.out.println("Notification rejected by the APNs gateway: " +
            pushNotificationResponse.getRejectionReason());

    if (pushNotificationResponse.getTokenInvalidationTimestamp() != null) {
        System.out.println("\t…and the token is invalid as of " +
                pushNotificationResponse.getTokenInvalidationTimestamp());
    }
}

Push с помощью библиотеки почтовых голубей

Конечно, вы также можете использовать ios push, предоставляемый почтовым голубем, логика аналогична push приложения для Android.

Клиент почтовых голубей iOS можно использовать совместно с клиентом Android, нет необходимости вводить новый пакет jar.

JSONObject messagePayload = new JSONObject();
Map<String, Object> custom = new HashMap<String, Object>();

messagePayload.put("title", "推送标题");
messagePayload.put("body", "推送内容");

messagePayload.put("user_id", 1);
messagePayload.put("msg_type", 1);
messagePayload.put("data", Lists.newArrayList("orderId", 1));

XingeApp xinge = new XingeApp(iosAccessId, iosSecretKey);
MessageIOS message = new MessageIOS();
message.setType(MessageIOS.TYPE_APNS_NOTIFICATION);
message.setExpireTime(86400);
message.setAlert(content);
message.setBadge(1);
message.setCategory("INVITE_CATEGORY");
message.setCustom(messagePayload);

response = xinge.pushSingleDevice("app用户的pushToken", message, XingeApp.IOSENV_PROD);
if (response.getInt(RET_CODE) != 0) {
    // 推送异常了
}

Мини-программа Push

Официальная документация:Билеты.WeChat.QQ.com/wiki?Он = горячая вода...

Вы можете видеть, что push-интерфейс апплета WeChat представляет собой обычный почтовый запрос.

Адрес API мини-программы:API.WeChat.QQ.com/CGI-Bin/В чем дело…

HTTP-запрос, библиотека http-запросов может относиться к:HttpUtil

DingTalk Push

Официальная документация:open-doc. Нравится ему away.com/micro app/color…пример кода

public static boolean send(String content, String title, Set<String> receivers) {
    try {
        HttpUtil.ResponseWrap result = HttpUtil.postWrap(ddUrl,
                "{\n"
                        + "     \"msgtype\": \"text\",\n"
                        + "     \"text\": {\"content\":\"" + title + "\r\n" + content + "\n|"
                        + receivers.stream().map(r -> "@" + r).collect(Collectors.joining(" ")) + "\"},\n"
                        + "    \"at\": {\n"
                        + "        \"atMobiles\": [" + receivers.stream().map(r -> "\"" + r + "\"").collect(Collectors.joining(",")) + "], \n"
                        + "        \"isAtAll\": false\n"
                        + "    }\n"
                        + " }");
        return result.getStatusCode() == 200;
    } catch (Exception e) {
        return false;
    }
}

полная ссылка на кодDingTalkUtil.java

Вы можете запросить с помощью http запроса

Электронная почта

Для отправки почты вы можете использовать javax.mail библиотеку java, smtp протокол для отправки почты

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

Пример ссылки на код:EmailSender.java

SMS push

Существует множество поставщиков услуг SMS, и почта обычно имеет единый протокол smtp, который можно использовать.Протокола для текстовых сообщений не существует, но для отправки текстовых сообщений обычно используется http. Например, следующие поставщики услуг SMS

  1. 253 Облачная связь:Это.253.com/API_doc/Открыть…
  2. SMS-сервис - You Paiyun:woohoo.upcloud.com/products/what…
  3. Обмен сообщениями и SMS_MSGSMS_Облачная связь_SMS — HUAWEI CLOUD:Woohoo. Huawei cloud.com/product/interviewer…

Особенности очередей сообщений

После ненормального использования очереди сообщений она автоматически повторит попытку.

некоторые замечания

Апплет WeChat может генерировать push-код для каждого платежа, который необходимо сохранить в базе данных или кэше, и каждый код может отправлять только 3 сообщения.

Поскольку потребление очереди сообщений имеет определенную задержку при большом количестве сообщений, это дает возможность отменить отправку сообщения.Для каждого сообщения может быть сгенерирован уникальный uuid.При отмене uuid создается в redis и выталкивается .При проверке находится ли этот uuid в редисе решать пушить или нет

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

Количество повторных попыток по умолчанию и время использования очереди сообщений контролировать нельзя. Клиент очереди сообщений можно изменить для поддержки этой функции.GitHub.com/crowded/spr…Основная логика состоит в том, чтобы сначала установить максимальное количество потребления и продолжительность потребления для сообщения, а затем напрямую установить его на успех, когда количество потребления сообщения и продолжительность потребления достигают порогового значения.

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