一個通知中心中臺系統設計簡介

       本文在介紹一箇中臺系統——通知中心的設計。上一篇文章《一個廣告資源運營管理中臺系統簡介》其實已經講了一些,關於中臺這裏就不在贅述了。把通知中心做成中臺系統,優點顯而易見,任何部門涉及發送消息相關業務時,都可以接入進來。業務部門負責發送內容的填充,通知中心負責把消息發送出去。因爲要發送的消息類型很多:短信、push消息、app站內信、微信公衆號推送、企業微信通知推送、郵件等等,顯然這是一個挺複雜的事。

       基本概念:

       應用:就是接入通知中心的工程。接入時需要填寫應用名,然後管理後臺會生成相應的app key及app secret。發送時需要傳入這些參數,以驗證接入方的合法性。

       節點:也可以理解爲發送事件,一個工程可能做好幾件事,那麼不同業務發送的消息就需要建不同發送節點。所以一個應用下面可以建很多節點。

       規則:根據不同入參選擇不同模板。爲了做的儘可能靈活可配置,規則實際上就是把本來接入方的if…else…邏輯移到了通知中心後臺,比如:根據新老用戶發送不同消息,有了規則配置,接入方只需要定義一個變量,並賦值即可,然後在後臺配置規則。如果是新用戶,使用A模板,如果是老用戶,使用B模板,點點鼠標就完成了。

       模板:主要包含公衆號模板、站內信模板、Push消息模板、短信模板等等,這些都是發送量比較多的消息了。定義模板時可以放佔位符,接入方只需做做佔位符填空題就可以了。發送時通知中心會自動完成信息組裝。

       下面是一些頁面截圖。

       1. 新建節點

       2. 新建模板

       3. 新建規則

       那麼怎麼使用呢?比如有一個業務場景是給用戶發push通知,告訴用戶系統送他一張100元代金券。針對這個場景,就可以建一個發送節點,然後新建模板:“尊敬的用戶,系統送您一張${amount}元代金券,請及時使用”,然後新建規則並關聯模板。作爲業務方,接入成本比較低,代碼量比較少,因爲大部分工作通知中心已經做了,業務方只需要做一些參數的填充即可,比如上面模板,代碼裏面設置amount爲100,就是發100元的代金券;amount爲50,就是發50元的代金券。如果運營人員覺得文案不妥,可以在管理後臺隨時修改。下面是代碼示例:

private McRequest genMcRequest(MessageBody msg) {
    McRequest mcRequest = new McRequest();
    mcRequest.setAppKey(msg.getAppKey());
    mcRequest.setAppSecret(msg.getAppSecret());

    // 配置事件
    mcRequest.setEventKey(msg.getAppEventKey());
    Map<String, String> eventParamMap = Maps.newHashMap();
    List<MessageParam> eventParams = msg.getEventParams();
    for (MessageParam param : eventParams) {
        eventParamMap.put(param.getParamKey(), param.getParamValue());
    }
    mcRequest.setEventParams(eventParamMap);

    // 配置模板
    Map<String, String> contentParamMap = Maps.newHashMap();
    List<MessageParam> contentParams = msg.getContentParams();
    for (MessageParam param : contentParams) {
        contentParamMap.put(param.getParamKey(), param.getParamValue());
    }
    mcRequest.setContentParams(contentParamMap);

    mcRequest.setUid(msg.getReceiverId());
    mcRequest.setCreator(MSG_CREATOR);

    return mcRequest;
}

@Override
public void sendMessage(MessageBody msg) throws ServiceException {
    McRequest mcRequest = genMcRequest(msg);

    RequestResult requestResult = mcService.postEvent(mcRequest);
    LOGGER.info("result is : " + JSONObject.toJSONString(requestResult));
}

       引用上篇文章結尾那句話,這樣的系統複雜歸複雜,但是要相信自己能做的更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章