抖個(gè)機(jī)靈~

消息推送服務(wù)數(shù)據(jù)遷移

1.數(shù)據(jù)遷移的由來(lái)

上一版本的消息服務(wù),由于項(xiàng)目排期時(shí)間緊迫&歷史模塊代碼遺留問(wèn)題,v1版本的消息服務(wù)接口直接在內(nèi)部服務(wù)A中添加設(shè)計(jì)(此坑很大,后來(lái)慢慢填了),并且獲取用戶消息列表等信息也是用的userId直接獲??;

v2版本的消息服務(wù)接口,由于消息關(guān)系數(shù)據(jù)庫(kù)做了分表處理,需要根據(jù)之前分享數(shù)據(jù)庫(kù)分表實(shí)現(xiàn)之天衣無(wú)縫的分表策略做數(shù)據(jù)遷移;

v1版本消息列表接口、未讀數(shù)、消息已讀接口需要正常對(duì)外提供;

2. 現(xiàn)有的遷移問(wèn)題
  1. 消息已讀接口在v1中直接使用消息關(guān)系表的id(單張表)更新操作的,升級(jí)到v2后,此路不通了,為啥?
  2. 因?yàn)?strong>v2版本的消息做了分表處理,分表參數(shù)是userId,移動(dòng)端必須要傳給新接口參數(shù)userId,(為啥是新接口,老接口不是還保留的嗎?因?yàn)関1通過(guò)feign調(diào)用的v2,所以UserId是必須的你明白了吧~~),feign在spring boot中的使用以后會(huì)介紹!
  3. 然而,恰恰,but
  4. v1版本的消息已讀接口,直接使用的noticeId(int 類型的)
  5. 完全
  6. 不需要,傳遞 userId
  7. 怎么辦 ???
  8. 那就,修改消息列表接口,并想辦法把userId返回給移動(dòng)端,然后移動(dòng)端在使用noticeId調(diào)用v1接口傳遞給v2的時(shí)候,想辦法從v2中獲取出來(lái),使用userId 定位到分表,作更新操作!
3. 如何解決現(xiàn)有問(wèn)題
  1. 思索良久,靈光一現(xiàn),我把之前返回給移動(dòng)端的消息列表中的noticeId給改裝了;
  2. 如何改裝能把userIdnoticeId作為之前的noticeId給移動(dòng)端,并且不保證溢出?
3.1 方案1,使用特殊字符隔開(kāi)并保證是(number類型)

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

后來(lái)發(fā)現(xiàn)和麻煩,因?yàn)楸旧?code>userId也會(huì)有0結(jié)尾的數(shù)字,此方案實(shí)驗(yàn)幾次,沒(méi)有找到合適的數(shù)字
遂放棄!

3.2 方案2,把現(xiàn)有的10進(jìn)制數(shù)轉(zhuǎn)化為8進(jìn)制,中間放一個(gè)9隔開(kāi)

Beautiful
完美解決
放一下當(dāng)時(shí)實(shí)現(xiàn)組合id以及從組合id中拆分userIdnoticeId的代碼

  1. 組合id
private static final String NOTICE_PANDORA_SEPARATOR = "9";
/**
 * userId + 00 + noticeId裝成復(fù)合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 轉(zhuǎn) 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. 反思總結(jié)

融匯貫通啊~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容