美文网首页
抖个机灵~

抖个机灵~

作者: jellyb | 来源:发表于2018-12-19 16:22 被阅读19次

消息推送服务数据迁移

1.数据迁移的由来

上一版本的消息服务,由于项目排期时间紧迫&历史模块代码遗留问题,v1版本的消息服务接口直接在内部服务A中添加设计(此坑很大,后来慢慢填了),并且获取用户消息列表等信息也是用的userId直接获取;

v2版本的消息服务接口,由于消息关系数据库做了分表处理,需要根据之前分享数据库分表实现之天衣无缝的分表策略做数据迁移;

v1版本消息列表接口、未读数、消息已读接口需要正常对外提供;

2. 现有的迁移问题
  1. 消息已读接口在v1中直接使用消息关系表的id(单张表)更新操作的,升级到v2后,此路不通了,为啥?
  2. 因为v2版本的消息做了分表处理,分表参数是userId,移动端必须要传给新接口参数userId,(为啥是新接口,老接口不是还保留的吗?因为v1通过feign调用的v2,所以UserId是必须的你明白了吧~~),feign在spring boot中的使用以后会介绍!
  3. 然而,恰恰,but
  4. v1版本的消息已读接口,直接使用的noticeId(int 类型的)
  5. 完全
  6. 不需要,传递 userId
  7. 怎么办 ???
  8. 那就,修改消息列表接口,并想办法把userId返回给移动端,然后移动端在使用noticeId调用v1接口传递给v2的时候,想办法从v2中获取出来,使用userId 定位到分表,作更新操作!
3. 如何解决现有问题
  1. 思索良久,灵光一现,我把之前返回给移动端的消息列表中的noticeId给改装了;
  2. 如何改装能把userIdnoticeId作为之前的noticeId给移动端,并且不保证溢出?
3.1 方案1,使用特殊字符隔开并保证是(number类型)

中间使用特殊字母如00分隔userIdnoticeId

后来发现和麻烦,因为本身userId也会有0结尾的数字,此方案实验几次,没有找到合适的数字
遂放弃!

3.2 方案2,把现有的10进制数转化为8进制,中间放一个9隔开

Beautiful
完美解决
放一下当时实现组合id以及从组合id中拆分userIdnoticeId的代码

  1. 组合id
private static final String NOTICE_PANDORA_SEPARATOR = "9";
/**
 * userId + 00 + noticeId装成复合id
 */
public static long buildComplexNoticeId(long userId, long noticeId){
    String complexId = Joiner.on(NOTICE_PANDORA_SEPARATOR).join(Long.toOctalString(userId), Long.toOctalString(noticeId));
    log.debug("complexId:{}", complexId);
    return Long.valueOf(complexId);
}
  1. 拆分
private static final String NOTICE_PANDORA_SEPARATOR = "9";

/**
 * noticeId 转 userId 和 noticeId array
 * @param noticeId
 * @return
 */
public static long[] obtainSplitArray(long noticeId){
    log.debug("noticeId:{}", noticeId);
    String noticeIdStr = String.valueOf(noticeId);
    if(!noticeIdStr.contains(NOTICE_PANDORA_SEPARATOR)){
        throw new BizException(NoticePushErrors.REMOVE_CALL_PARAM_ERROR);
    }
    String[] noticeArray = noticeIdStr.split(NOTICE_PANDORA_SEPARATOR);
    long[] noticeLongArray = new long[2];
    long usrId10 = Long.valueOf(noticeArray[0], 8);
    long noticeId10 = Long.valueOf(noticeArray[1], 8);
    noticeLongArray[0] = usrId10;
    noticeLongArray[1] = noticeId10;
    return noticeLongArray;
}
4. 反思总结

融汇贯通啊~~

相关文章

  • 抖个机灵~

    消息推送服务数据迁移 1.数据迁移的由来 上一版本的消息服务,由于项目排期时间紧迫&历史模块代码遗留问题,v1版本...

  • 抖什么,别抖机灵

    用抖字可以组的词很多,抖落、抖擞、抖动、抖包袱、抖音......但抖什么都好,就是别抖机灵。 杨修就是个喜欢抖机灵...

  • 抖机灵

    1. 如果说我认真准备基金考试,是源于“智力密集型”的工作性质描述,是不是显得很肤浅,哈哈哈

  • 抖机灵

    【抖机灵】 我不怎么吃早饭。 好好的孩子被你虐待成啥样了?就仗着不犯法可劲虐! 都说付出没有回报的事不要去做。 吵...

  • 抖机灵

    今天在车站看见一妹子,那个水灵啊!我心头一震,视线再也无法从她身上离开,我看着她独自拖着笨重的行李张望远方,满面茫...

  • 抖机灵

    喧嚣机灵,浮躁幽默 撩起心底尘埃,更寂寥 震天尬响的欢乐 只为博君一笑 真的很好笑呢 真的很机灵 这么多的机灵 寂...

  • 抖机灵

    关于太空笔,有一个流传甚广的故事:美国科学家们想研制一种在太空失重情况下使用的太空笔,可研究了好长时间都没有成功,...

  • 抖机灵

    自从三年前迷上知乎后,就频繁接触“抖机灵”这个词,初始还不知其为何意,因为网络新词生成太快,时不时蹦出几个,我等愚...

  • 恶心

    脸上挂着玩世不恭的笑 嘴里吐着应时应景的词 抖着机灵,抖着机灵,抖着机灵 机灵快将我埋葬 埋葬不愿见人的尴尬与彷徨...

  • 七夕怎么过,猫猫给你答案

    难过 抖个机灵 点个赞呗

网友评论

      本文标题:抖个机灵~

      本文链接:https://www.haomeiwen.com/subject/iwbjkqtx.html