成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分布式下的區(qū)域問題,讓我們大戰(zhàn)了300回合

開發(fā) 架構(gòu) 分布式
本文的這個地區(qū)問題,咋一看比較簡單。如果一細(xì)想,會發(fā)現(xiàn)里面有點東西。再加上各種外部因素的限制,你會發(fā)現(xiàn)分布式的環(huán)境中保證地區(qū)數(shù)據(jù)一致性,并不是那么好實現(xiàn)。

[[404321]]

本文轉(zhuǎn)載自微信公眾號「蘇三說技術(shù)」,作者蘇三說技術(shù)。轉(zhuǎn)載本文請聯(lián)系蘇三說技術(shù)公眾號。

前言

我最近參與了公司的一個新項目,需要通過openapi接口把接入方的數(shù)據(jù),比如:企業(yè)、訂單、合同、物流等,同步到我們平臺,然后我們平臺給他們提供金融能力。

由于我方跟對接方不在同一個城市,為了提高工作效率,雙方進(jìn)行了多次在線視頻溝通。剛開始比較順利,沒想到在溝通企業(yè)信息上傳接口時,接口文檔中有個非常不起眼的企業(yè)注冊地id字段,讓我們一下子進(jìn)入了僵局。

到底是怎么回事呢?

1.地區(qū)問題

在我們平臺的企業(yè)表中有一個企業(yè)注冊地id字段,是必填的,用戶在注冊企業(yè)的頁面需要選擇一個地區(qū),作為該企業(yè)的注冊地,實際上數(shù)據(jù)庫保存的是地區(qū)的id。

如果該企業(yè)注冊成功了,會在企業(yè)詳情頁面上展示該地區(qū)名稱。當(dāng)然我們系統(tǒng)的后臺邏輯是先通過地區(qū)id到地區(qū)表反查出地區(qū)名稱,然后在用戶界面中展示出來。

為了跟企業(yè)表保持一致,我方在定義接口文檔時,企業(yè)注冊地id字段也做成必填了。

當(dāng)時的情況是這樣的:我方地區(qū)表中有id、地區(qū)名稱、國標(biāo)碼、等級等字段,但這里的id,是我方數(shù)據(jù)庫的主鍵,對接方系統(tǒng)中肯定是沒有的。對接方系統(tǒng)中也有一套地區(qū)表,不過id是他們的數(shù)據(jù)庫id,他們的表中也有地區(qū)名稱、國標(biāo)碼、等級等字段。

所以他們系統(tǒng)內(nèi)部需要經(jīng)過一番轉(zhuǎn)換,才能把我們所需的地區(qū)id傳給我們。

1.1 持久化本地地區(qū)表

其實這個項目我是中途才加入的,之前在處理別的事情,我加入的時候接口文檔已經(jīng)定義好了。

我方跟對接方進(jìn)行第二次在線溝通的時候,雙方一起過接口文檔的細(xì)節(jié),包括:接口的作用、每個參數(shù)的含義,以及他們是否有值傳過來等等。

其中過到企業(yè)信息上傳接口時,接口文檔中有個企業(yè)注冊地id字段,對方?jīng)]法傳值過來。為了解決這個問題,我方第一版的方案是:

 

  1. 對接方調(diào)用我方地區(qū)查詢接口,通過多次分頁查詢,最終能獲取我方所有地區(qū)數(shù)據(jù),落庫到他們本地的地區(qū)表。
  2. 他們在調(diào)用我方企業(yè)信息上傳接口之前,先查詢本地的地區(qū)表,轉(zhuǎn)換成我方所需要的地區(qū)id。

在討論的過程中,對接方覺得他們也是平臺,不應(yīng)該做這些額外的事情。所以在那次會議中,雙方針對這個問題,誰也沒有說服誰,最終也沒能達(dá)成共識。

后來,我思考了一下,確實這個方案太過理想化了,沒有真正站到用戶的角度思考問題,忽略了很多細(xì)節(jié)。可能跟文檔設(shè)計者不對地區(qū)表不太熟悉有關(guān)系。

1.2 按名稱調(diào)用地區(qū)查詢接口

那次會議當(dāng)中,我們這邊的幾位同事,短暫的討論了一下。既然對接方不愿意接受在他們本地持久化地區(qū)表,我們就退而求其次,不要求他們持久化了。這時我們這邊有個同事提出,改成按名稱調(diào)用地區(qū)查詢接口,反查出地區(qū)id,具體方案如下:

這個方案表面上看起來沒有問題,但我之前負(fù)責(zé)過區(qū)域相關(guān)功能,我知道,就怕出現(xiàn)如下情況:

  1. 如果對接方傳的地區(qū)名稱不完整,比如:本來是成都市,實際上傳的成都。這樣,我們地區(qū)查詢接口,需要做模糊匹配,如果并發(fā)調(diào)用接口可能影響接口性能。
  2. 如果輸入關(guān)鍵字北京市,在我們這邊的地區(qū)表中,可以找到兩條數(shù)據(jù),一條是跟省級別一樣的,另一條是跟市級別一樣的。到底對應(yīng)哪條數(shù)據(jù)呢?

所以我當(dāng)時把這兩個問題拋出來了,不建議使用地區(qū)名稱查詢。

1.3 按國標(biāo)碼調(diào)用地區(qū)查詢接口

那個同事聽完之后,也覺得用地區(qū)名稱查詢有點不靠譜。他馬上修改方案,改成使用地區(qū)的國標(biāo)碼查詢地區(qū)id,具體方案如下:

由于當(dāng)時討論時間非常短,我們沒來得及考慮太多,暫且打算用這套方案。

1.4 企業(yè)上傳接口入?yún)鲊鴺?biāo)碼

過了一會兒,雙方繼續(xù)過接口文檔,重新討論企業(yè)信息上傳接口中企業(yè)注冊地id字段傳值問題。

他們在調(diào)企業(yè)信息上傳接口之前,先調(diào)一下我們地區(qū)查詢接口,查出地區(qū)id,入?yún)⑹菄鴺?biāo)碼。然后再將這個地區(qū)id,在企業(yè)信息上傳接口中傳過來。

對接方仔細(xì)聽了我們的方案,猶豫了一下,他們覺得沒有必要再調(diào)一次地區(qū)查詢接口,雙方都使用國標(biāo)碼不就行了?

他們的想法是:在企業(yè)信息上傳接口中,入?yún)⒂善髽I(yè)注冊地id改成企業(yè)注冊地國標(biāo)碼,由于國標(biāo)碼是國家統(tǒng)一的唯一編碼,雙方肯定是一樣,能保證數(shù)據(jù)的一致性。

2.想起了一個問題

說實話,如果你沒接觸過地區(qū)功能的話,大部分人可能會同意這套方案的。

但比較巧合的是我之前正好接觸過類似的功能,當(dāng)時我突然想起了一個問題:雙方數(shù)據(jù)的一致性如何保證?

我們都知道,由于國家的發(fā)展,有些城市可能會改名,比如:襄樊改成了襄陽,另外有時候多個地級市合并成一個市,這樣國標(biāo)碼會變化,所以國家統(tǒng)計網(wǎng)每年都會調(diào)整地區(qū)名稱和國標(biāo)碼。

我方的地區(qū)表是兩年之前創(chuàng)建的,數(shù)據(jù)初始化好之后沒有就更新過。

而對接方不是跟我們在同一時刻初始化的數(shù)據(jù),而且他們會定期更新地區(qū)數(shù)據(jù),這樣就導(dǎo)致了兩邊的數(shù)據(jù)不一致。如果對接方的業(yè)務(wù)表單中使用了新加的城市名和國標(biāo)碼,而這些信息在我方的地區(qū)表中沒有,就無法查詢出我方所需的地區(qū)id。

這種情況該怎么辦?

2.1 雙方同一時刻更新地區(qū)表

顯然上面的問題是一個非常棘手的問題,這時候有些小伙伴可能會說:雙方使用job同一時刻更新地區(qū)表,不就能解決問題了?

我不太贊成這種方案,主要原因如下:

我方僅跟這個對接方有個同步執(zhí)行的job,沒問題。但如果還有其他的對接方,也需要調(diào)用企業(yè)信息上傳接口,是不是也要整一個job,而且還要求大家都同一時刻執(zhí)行,耦合性太大了。

如果我方和對接方同時執(zhí)行job,但萬一有任意一方執(zhí)行失敗了,也會導(dǎo)致數(shù)據(jù)不一致的情況。如果恰好這時候?qū)臃皆谡{(diào)用企業(yè)信息上傳接口,會不會出問題?

2.2 以一方的地區(qū)數(shù)據(jù)為準(zhǔn)?

上面的雙方同一時刻更新地區(qū)表的方案確實有點不靠譜,但有些讀者可能會問,以一方的地區(qū)數(shù)據(jù)為準(zhǔn),另一方把數(shù)據(jù)同步過來不就行了。具體方案如下:

這個方案其實跟之前我方給出的第一個方案很相似,已經(jīng)被對接方拒絕了。站在他們的角度來說,確實沒有必要因為上傳企業(yè)信息,而保存我們的地區(qū)數(shù)據(jù)。

說實話,即使他們同意了,這種跨公司跨系統(tǒng)的數(shù)據(jù)一致性問題,也不好保證,因為如果對接方調(diào)用我們的地區(qū)接口失敗了,此時,正好在上傳企業(yè)信息,是不是也有問題?

3.其他解決方案

其實,我們當(dāng)時為了解決問題,還穿插著討論過這些方案。

3.1 上傳的數(shù)據(jù)存快照

我當(dāng)時提出既然是保存對接方的數(shù)據(jù),為啥不能存快照呢?我們可以把數(shù)據(jù)寫到mongodb,數(shù)據(jù)格式用json,簡單又高效。我的方案是:

我們自己的業(yè)務(wù)數(shù)據(jù)存到mysql的業(yè)務(wù)表,而對接方的數(shù)據(jù)存在mongodb,互不干擾。

看起來,沒有問題。

但是,當(dāng)時產(chǎn)品說:銀行那邊規(guī)定,審查數(shù)據(jù)時只看我們mysql的業(yè)務(wù)表,其他的數(shù)據(jù)源不看。

好吧,不得不承認(rèn)銀行惹不起。

3.2 人工更新數(shù)據(jù)

另外一個同事的想法是,先讓他們調(diào)用企業(yè)信息上傳接口,如果發(fā)現(xiàn)有地區(qū)問題,我們手動幫他們調(diào)整地區(qū)表的數(shù)據(jù)。

具體方案如下:

如果調(diào)用企業(yè)信息上傳接口時,出現(xiàn)地區(qū)不存在的情況,則發(fā)報警郵件給指定人員。然后,指定人員手動新增或修改相關(guān)的地區(qū)數(shù)據(jù)。

這套方案看起來也可以,不過有個比較坑爹的地方就是,就怕在下班或者周末的時候出問題,反正我是不愿意去做這個事情的,你愿意嗎?

3.3 提供更新接口

除此之外,我們還相關(guān)這套方案:對接方在調(diào)我們企業(yè)信息上傳接口之前,先調(diào)我們地區(qū)查詢接口查一下數(shù)據(jù)是否存在,如果不存在,則保存地區(qū)接口(保存包括:新增和修改),如果存在,則正常上傳數(shù)據(jù)。

具體方案如下:

這個方案還可以簡化一下:

將查詢并保存地區(qū)的邏輯可以放到企業(yè)信息上傳接口中,這樣對接方肯定非常高興,對他們來說是透明的,地區(qū)問題不存在了。

但產(chǎn)品覺得地區(qū)是我們的基礎(chǔ)數(shù)據(jù),處于安全考慮,不能提供入口給他們修改,不然以后可能會亂套的。

這樣不行,那也不行。我們一下子進(jìn)入了困境,但為了不影響整體進(jìn)度,只能先記錄一下問題,然后跳過這個問題,繼續(xù)討論其他字段了。

4.如何解決這個問題?

我當(dāng)天晚上思考了良久,第二天早上,發(fā)現(xiàn)跟我們老大的想法不謀而合。得出的結(jié)論是,既然存在差異化,沒辦法避免,我們就要從系統(tǒng)設(shè)計上接受差異化。在企業(yè)信息上傳接口中增加兩個字段:企業(yè)注冊地國標(biāo)碼 和 地區(qū)名稱,對接方改成傳入這兩個字段,具體方案如下:

  1. 在我方的企業(yè)表中增加地區(qū)名稱字段,是非必填的,同時把之前的地區(qū)id字段也改成非必填。
  2. 對接方在調(diào)用我方企業(yè)信息上傳接口時,同時傳入地區(qū)國標(biāo)碼和地區(qū)名稱。
  3. 我方企業(yè)信息上傳接口中判斷,如果通過國標(biāo)碼能夠找到地區(qū)id,則將地區(qū)id寫入db,如果找不到,則將地區(qū)名稱寫入db。

我們評估了一下影響范圍,在企業(yè)表中的地區(qū)字段,只做展示用,沒有修改入口,所以上面的這套方案是可行的。

后來,再次跟對接方在線溝通時,把我們的這套方案告訴他們了,他們非常贊同。

5 總結(jié)

雖說這個地區(qū)問題,在眾多技術(shù)問題中不值得一提。但是我仔細(xì)思考了一下,還是有一些寶貴的經(jīng)驗值得總結(jié)一下的,給有需要的小伙伴一個參考。

5.1 要從用戶的角度設(shè)計接口

在設(shè)計接口文檔時,要真正做到從用戶的角度出發(fā)。

尤其是像這種openapi接口,定義的參數(shù)應(yīng)該盡量選擇通用的,大家都認(rèn)可的參數(shù),避免出現(xiàn)我方定制化的參數(shù),比如:地區(qū)id。

盡量減少用戶的復(fù)雜度,讓他們調(diào)用接口時更簡單一些。

5.2 技術(shù)方案要有包容性

技術(shù)方案要有包容性,不是非黑即白,需要有柔性的思想。在分布式環(huán)境中,如果去一味地追求數(shù)據(jù)的強一致性,不會有太好的結(jié)果。就像高并發(fā)下的商品秒殺系統(tǒng),如果非要用同步方案去實現(xiàn),系統(tǒng)最終可能會掛掉,更好的方案其實是改成異步隊列處理。

我方和對接方都有地區(qū)表,數(shù)據(jù)很難保證完全一致,我們不要為了一致性而一致性,這樣會適得其反。為了工作能夠順利進(jìn)行下去,必然有一方要妥協(xié),我的建議是openapi接口方做妥協(xié),這種技術(shù)方案才夠通用。

5.3 沒有最好的方案,只有最適合的

我方最后的那個方案,其實并沒有完全解決地區(qū)id找不到的問題,但是從業(yè)務(wù)的角度來看,即使沒有地區(qū)id,有地區(qū)名稱也是一樣的。很顯然,最后的方案是非常適合我們實際業(yè)務(wù)場景的。

所以沒有最好的方案,只有最適合業(yè)務(wù)場景的。

5.4 進(jìn)行有效的溝通

在跟對接方在線溝通時,不要因為某個問題卡殼了,而一直僵持下去。如果當(dāng)時沒有好的技術(shù)方案,可以先選擇暫時跳過這個問題,而溝通其他的內(nèi)容。后面我們再私下單獨花時間,仔細(xì)思考當(dāng)時的問題,從而能夠提出更合理的方案。

5.5 技術(shù)是為業(yè)務(wù)服務(wù)的

本文的這個地區(qū)問題,咋一看比較簡單。如果一細(xì)想,會發(fā)現(xiàn)里面有點東西。再加上各種外部因素的限制,你會發(fā)現(xiàn)分布式的環(huán)境中保證地區(qū)數(shù)據(jù)一致性,并不是那么好實現(xiàn)。

整個過程當(dāng)中,我們提出了很多種技術(shù)方案,有些方案看似可以完美解決問題,但都被我們實際的業(yè)務(wù)場景給否定了。

 

技術(shù)是為業(yè)務(wù)服務(wù)的,技術(shù)雖說非常重要,但是如果離開了業(yè)務(wù)都是紙上談兵。

 

責(zé)任編輯:武曉燕 來源: 蘇三說技術(shù)
相關(guān)推薦

2018-01-30 09:07:36

Ceph分布式存儲

2024-11-19 15:55:49

2023-02-21 16:41:41

分布式相機鴻蒙

2023-12-26 08:59:52

分布式場景事務(wù)機制

2019-06-19 15:40:06

分布式鎖RedisJava

2023-06-27 13:47:00

分布式事務(wù)本地事務(wù)

2021-12-01 10:13:48

場景分布式并發(fā)

2018-11-28 16:00:41

2018-12-12 15:20:27

2020-02-17 16:05:17

系統(tǒng)演進(jìn)過程時間問題

2021-12-14 08:19:59

系統(tǒng)分布式網(wǎng)絡(luò)

2021-12-15 07:24:56

分布式系統(tǒng)時鐘

2013-12-20 09:43:13

分布式

2021-08-09 09:39:59

Docker部署鏡像

2018-11-02 14:00:20

2010-08-12 16:01:59

私有云公共云

2009-02-20 10:16:00

路由器設(shè)置圖形界面

2017-09-01 05:35:58

分布式計算存儲

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美中文字幕一区二区三区 | 欧美精品福利视频 | 国产精品99精品久久免费 | 中文精品一区二区 | 精品免费国产一区二区三区 | 男女在线网站 | 欧美精品一区二区三区在线播放 | av片在线观看网站 | 精品久久久久久18免费网站 | 久久久久国产一区二区三区四区 | 99精品99 | 国产剧情一区 | 成人片在线看 | 亚洲美乳中文字幕 | 凹凸日日摸日日碰夜夜 | 99pao成人国产永久免费视频 | 91在线精品视频 | 日韩一二区在线观看 | 国产伦精品一区二区三区精品视频 | 日韩av在线中文字幕 | 日韩在线观看视频一区 | 性色av香蕉一区二区 | 国产99久久久国产精品 | 91久久精品一区二区三区 | 久久久精 | 国产日韩精品视频 | 国产在线精品一区二区三区 | 中文字幕精品视频 | 一区二区三区在线播放 | 久久99精品久久久久久狂牛 | 一区二区三区国产视频 | 欧美三级电影在线播放 | 成人亚洲视频 | 国产精品精品视频一区二区三区 | 欧美精品一区二区三区四区 在线 | 99热国产免费 | www亚洲精品 | 中文字幕在线视频免费视频 | 国产一级大片 | av在线免费不卡 | 国产精品久久久久久久久免费软件 |