消息推送服務(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)題
- 消息已讀接口在v1中直接使用消息關(guān)系表的
id
(單張表)更新操作的,升級(jí)到v2
后瘩扼,此路不通了睛藻,為啥? - 因?yàn)?strong>v2版本的消息做了分表處理邢隧,分表參數(shù)是
userId
,移動(dòng)端必須要傳給新接口參數(shù)userId
冈在,(為啥是新接口倒慧,老接口不是還保留的嗎?因?yàn)関1通過(guò)feign調(diào)用的v2包券,所以UserId是必須的你明白了吧~~)纫谅,feign在spring boot中的使用以后會(huì)介紹浇辜! - 然而疆栏,恰恰躯保,but
-
v1
版本的消息已讀接口眶俩,直接使用的noticeId
(int 類型的) - 完全
- 不需要洞拨,傳遞 userId
- 怎么辦 鸠珠?杯矩?沽损?
- 那就亮元,修改消息列表接口猛计,并想辦法把
userId
返回給移動(dòng)端,然后移動(dòng)端在使用noticeId
調(diào)用v1接口傳遞給v2的時(shí)候爆捞,想辦法從v2中獲取出來(lái)奉瘤,使用userId 定位到分表,作更新操作煮甥!
3. 如何解決現(xiàn)有問(wèn)題
- 思索良久盗温,靈光一現(xiàn)藕赞,我把之前返回給移動(dòng)端的消息列表中的
noticeId
給改裝了; - 如何改裝能把
userId
和noticeId
作為之前的noticeId
給移動(dòng)端卖局,并且不保證溢出斧蜕?
3.1 方案1,使用特殊字符隔開(kāi)并保證是(number類型)
中間使用特殊字母如
00
分隔userId
和noticeId
后來(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中拆分userId
和noticeId
的代碼
- 組合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);
}
- 拆分
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é)
融匯貫通啊~~