新推送消息幂等设计

目的

针对异步消息业务 参数模板新增token参数做消息唯一性校验。

应用场景:

1.业务方put消息到tqmq进行消息的发送,存在接口请求超时情况(同一个内容消息多次重试推入tqmq),这个情况下推送系统无法感知这是多条内容一样的消息,会自动当作多条消息进行发送。
2.推送系统tqmq在消息处理完成后remove消息发生异常,会导致这条消息重复消费

token参数使用详情

1.建议使用分布式id雪花id,必须保证每条消息的token唯一性
2.非必须;如果传表示业务方需要做校验;如果不传表示业务方无需校验,这条消息直接放行进行消费
3.若传递token参数,则参数应放置在和service&method同一层级

目前的推送消息参数模板(以uuid群组推送为例)


{
        "appcode": "1", 
        "asyncforms": {
                "action": "call", 
                "extraArgs": {
                        "ar": "100", 
                        "at": "60", 
                        "au": "deqvtdpn3i7z", 
                        "av": "https://avatar01.jiaoliuqu.com/avatar/newavatarmale.jpg", 
                        "ci": "922574501", 
                        "ck": "005AQAoADREMzk4MzcwMUI3MkM2NjYwRTEwMTFFQkY5MjZFMjdCQTUyMEI0NDEQAMhPN4h5vkhhtXyJ3BRa0Gdri7BglXDiA+vcsWAAAA==", 
                        "cn": "desmy7kj92vy1k", 
                        "ct": "call", 
                        "cu": "desmy7kj92vy1k", 
                        "ex": "{}", 
                        "mi": 0, 
                        "nk": "菠萝帅哥2号", 
                        "pr": "0.34", 
                        "ri": "565467929", 
                        "ro": "200", 
                        "ru": "chqtq9mb01ua", 
                        "tp": "request", 
                        "ts": "1622182763"
                }, 
                "isHighPriority": true, 
                "message": "菠萝帅哥2号 请求与您语音通话", 
                "motion": "qucall", 
                "offlineExpireTime": 50000, 
                "pushTagCode": "forum_call_request", 
                "smart": 1, 
                "title": "他趣", 
                "uuid": "chqtq9mb01ua", 
                "version": "2"
        }, 
        "method": "pushPopupMessageToSingleByUuid", 
        "mtracer_id": "50321ad4486abc0f6fda69b9b62022b2", 
        "service": "asyncpush" ,
        "token": "雪花id" 
}

业务方:

  • service: asyncpush
  • method: pushPopupMessageToListByUuidArr
  • token: xxx(String;非必须;如果传表示业务方需要做校验;如果不传表示业务方无需校验,这条消息直接放行进行消费)
  • @param motion(String,动作、意向、请求,必须)
  • @param action(String,动作,必须)
  • @param message(String,要推送的消息内容(即文案),必须)
  • @param title(String,标题,必须)
  • @param isPushTitle (Integer, 是否推送标题 0:否; 1:是; 选填,默认为0)
  • @param pushTagCode(String,推送标识符,比如:新用户唤醒。主要是产品统计要用,必须)
  • @param isHighPriority(Boolean,是否高优先级,必须)
  • @param uuidArr(String[],用户uuid数组,最大长度不能超过1000,必须)
  • @param offlineExpireTime(Long,离线消息存储时间,单位ms,必须。如果希望使用系统默认时间,给-1)
  • @param extraArgs(String,额外参数,可以为空,不为空时格式必须是[{"key": "id","value": "138"},{"key": "tl","value": "分类名称123"}])
  • @param groupId(String,组唯一标识,防止重复推送引入的概念)
  • @param appcode(Integer,应用代码 1-他趣 69-配配,可选)
  • @param smart(Integer,是否自动选择 0-否 1-是,默认为0,可选)
  • @param relaction(String,跳转模型,请参照文档:http://10.10.50.205:1234/Basics/Relaction,完整的字符串直接放这个参数,如:m=promotion&a=loualou,可选)

推送系统接收:

public class AsyncRequestParams {

    /******************************************
     *             由客户端传入的参数         *
     ******************************************/
    private String service;
    private String method;
    private String form;
    private String token;
    private JsonNode asyncforms;
}

说明

目前推送系统本身无论是业务系统推送任务亦或是运营推送任务都是不存在消息发送重试策略的。

你可能感兴趣的:(新推送消息幂等设计)