spring boot 에서 메시지 푸 시 시스템 디자인 및 구현

푸 시 시스템 은 통용 되 는 구성 요소 로 서 존재 하 는 가 치 는 주로 다음 과 같은 몇 가지 가 있다.
  • 여러 업무 항목 에 의 해 사용 되 고 푸 시 시스템 의 독립 적 인 유 지 는 유지 비용 을 낮 출 수 있다
  • .
  • 푸 시 시스템 은 보통 3 자 api 를 호출 하여 푸 시 합 니 다.3 자 api 는 보통 호출 빈도/횟수 제한 이 있 습 니 다.푸 시 된 메 시 지 는 대열 을 통 해 3 자 api 를 합 리 적 으로 호출 하고 호출 빈도 와 횟수 를 제어 해 야 합 니 다
  • .
  • 업무 와 상 관 없 이 일반 푸 시 시스템 은 업무 논리 에 관심 이 없 도록 설계 되 었 다
  • .
    핵심 기술
  • 메시지 큐
  • 3 자 서비스 api 호출
  • 안 드 로 이 드 앱 푸 시
  • 애플 앱 푸 시
  • 위 챗 애플 릿 푸 시
  • 메 일 푸 시
  • 못 박 기 푸 시
  • 문자 푸 시
  • 메시지 큐 는 아 리 클 라 우 드 가 제공 하 는 rocketmq,공식 문서:https://help.aliyun.com/document_detail/55385.html
    푸 시 순서 도

    새 창 을 우 클릭 하여 열 면 고 화질 큰 그림 을 볼 수 있 습 니 다.
    정보 푸 시 시스템 이 접속 하 는 제3자 서비스 가 비교적 많 고 제3자 푸 시 의 질 이 통일 되 기 어렵 기 때문에 소식 의 푸 시 재 시도 도 고려 해 야 한다.
    사고의 흐름
    동시 다발 을 제어 하기 위해 모든 푸 시 는 rocketmq 대기 열 에 먼저 보 내 고 매번 푸 시 하 는 개 수 는 대기 열 소 비 를 제어 하 는 클 라 이언 트 의 수량 을 통 해 이 루어 집 니 다.
    안 드 로 이 드 와 사 과 는 모두 전서구 의 푸 시 서 비 스 를 이용 할 수 있다.

    전서구 푸 시 는 클 라 이언 트 가 통합 되 어야 합 니 다.클 라 이언 트 sdk 참조:https://xg.qq.com/xg/ctr_index/download
    현재 비둘기 개인 개발 자 는 여전히 신청 할 수 있 습 니 다.계 정 이 만들어 진 후에 andorid 와 ios 프로젝트 를 만 듭 니 다.

    여기 있 는 APP ID 와 SECRET KEY 를 기록 하고 서버 에서 푸 시 할 때 이 두 개의 인자 가 필요 합 니 다.
    푸 시 이상 처리,푸 시 이상 시 다시 시도 해 야 합 니 다.다시 시도 하면 메시지 큐 자체 의 재 시도 체 제 를 이용 할 수 있 고 스스로 재 시도 논 리 를 실현 할 수 있 습 니 다.
    안 드 로 이 드 앱 푸 시
    공식 문서:https://xg.qq.com/docs/android_access/jcenter.html
    코드 라 이브 러 리:https://github.com/xingePush/xinge-api-java
    
    <!--         -->
    <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) {
      //      ,       
    }
    애플 앱 푸 시
    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());
      }
    }
    전서구 창고 로 푸 시
    물론 전서구 가 제공 하 는 ios 푸 시 를 사용 할 수도 있 습 니 다.논리 와 안 드 로 이 드 app 의 푸 시 차이 가 많 지 않 습 니 다.
    ios 의 비둘기 클 라 이언 트 는 안 드 로 이 드 클 라 이언 트 와 공유 할 수 있 습 니 다.새로운 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) {
      //      
    }
    애플 릿 푸 시
    공식 문서:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

    위 챗 애플 릿 푸 시 인터페이스 가 일반적인 post 요청 임 을 볼 수 있 습 니 다.
    애플 릿 api 주소:https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send
    http 요청,http 요청 라 이브 러 리 참고 가능:HttpUtil
    압송 하 다
    공식 문서:https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq#-2코드 예시
    
    public static boolean send(String content, String title, Set<String> receivers) {
      try {
        HttpUtil.ResponseWrap result = HttpUtil.postWrap(ddUrl,
            "{
    " + " \"msgtype\": \"text\",
    " + " \"text\": {\"content\":\"" + title + "\r
    " + content + "
    |" + receivers.stream().map(r -> "@" + r).collect(Collectors.joining(" ")) + "\"},
    " + " \"at\": {
    " + " \"atMobiles\": [" + receivers.stream().map(r -> "\"" + r + "\"").collect(Collectors.joining(",")) + "],
    " + " \"isAtAll\": false
    " + " }
    " + " }"); return result.getStatusCode() == 200; } catch (Exception e) { return false; } }
    전체 코드 참조DingTalkUtil.java
    http 요청 을 사용 하면 요청 할 수 있 습 니 다.
    메 일 푸 시
    메 일 을 보 내 면 자바 의 자바 x.mail 라 이브 러 리,smtp 프로 토 콜 로 메 일 을 보 낼 수 있 습 니 다.
    
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>1.4.7</version>
    </dependency>
    예시 코드 참조:EmailSender.java
    문자 푸 시
    문자 서비스 업 체 가 많 고 메 일 은 일반적으로 통 일 된 smtp 프로 토 콜 을 사용 할 수 있 으 며 문자 메 시 지 는 협의 가 없 지만 보통 http 로 문자 메 시 지 를 보 냅 니 다.예 를 들 어 다음 과 같은 문자 서비스 업 체 입 니 다.
    253 클 라 우 드 통신:zz.253.com/api_doc/kai…
    문자 서비스-또 찍 기 클 라 우 드:https://www.upyun.com/products/sms
    메시지&문자MSGSMS_구름 통신문자-화 웨 이 윈:https://www.huaweicloud.com/product/msgsms.html
    메시지 큐 의 특성
    메시지 큐 소비 이상 후 자동 으로 재 시도
    약간의 주의 점
    위 챗 애플 릿 은 매번 지불 할 때마다 하나의 푸 시 코드 를 생 성 할 수 있 으 며,데이터베이스 나 캐 시 에 저장 해 야 하 며,코드 당 3 개의 메 시 지 를 푸 시 할 수 있 습 니 다.
    메시지 큐 의 소 비 는 메시지 양 이 많 을 때 일정한 지연 이 있 기 때문에 메시지 푸 시 를 취소 하 는 데 가능 합 니 다.모든 메시지 에 유일한 uid 를 만 들 수 있 습 니 다.취소 할 때 이 uid 를 redis 에 디자인 하여 푸 시 할 때 이 uid 가 redis 에서 푸 시 여 부 를 결정 하 는 지 확인 할 수 있 습 니 다.
    푸 시 에 제어 할 수 없 는 이상 이 존재 합 니 다.예 를 들 어 3 자 푸 시 서비스 에 이상 이 생 겼 지만 호출 자가 전달 하 는 매개 변수 이상 도 존재 합 니 다.푸 시 인터페이스 호출 의 반환 값 은 푸 시 시스템 호출 성공 여 부 를 판단 할 수 있 고 로그 에 기록 할 수 있 습 니 다.그러면 이상 원인 을 조사 할 때 비교적 쉽 습 니 다.
    메시지 큐 의 기본 재 시도 횟수 는 소비 시간 을 제어 할 수 없습니다.메시지 큐 의 클 라 이언 트 를 수정 하여 이 기능 을 지원 할 수 있 습 니 다.참고:https://github.com/jibaole/spring-boot-starter-alimq/pull/6/files핵심 논 리 는 먼저 메시지 에 최대 소비 횟수 와 소비 시간 을 설정 한 다음 에 메시지 소비 횟수 와 소비 시간 이 한도 값 에 이 르 렀 을 때 직접 성공 으로 설정 하 는 것 입 니 다.
    ios 비둘기 푸 시 를 사용 할 때 개발 인증서 와 생산 인증 서 를 올 려 야 합 니 다.이 두 인증 서 는 적어도 하 나 를 올 려 야 합 니 다.

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기