Y說
最近生活方式發(fā)生了一點變化。搬家了,住的地方離公司更近了。
這就讓我多了很多的操作空間,比如早上起來跑個步啥的。跑完步還能有點時間寫博客,所以緊趕慢趕花了幾個早上把這篇很早之前就想寫的文章寫出來了。
平時也會積累一些寫博客的靈感,后面慢慢寫吧。
過段時間打算想試試短視頻的形式聊一些技術(shù)話題或者編程實戰(zhàn),計劃中。。。
一個權(quán)限bug
前不久無意間發(fā)現(xiàn)了一個微信朋友圈的權(quán)限bug。
事情是這樣的,我平時會在微信朋友圈發(fā)點動態(tài)。
因為本人“過于羞澀”,所以很多動態(tài)都會一般會屏蔽公司的領(lǐng)導(dǎo),偶爾也會屏蔽同事。比如偶爾寫的公眾號文章,也會屏蔽他們(防止他們發(fā)現(xiàn)我過于菜的事實)。
微信的朋友圈是支持這種簡單的權(quán)限控制需求的,在發(fā)朋友圈的時候,可以選擇:所有朋友可見、僅自己可見、不給誰看、只給誰看。
這種情況,我一般是設(shè)置不給帶有“領(lǐng)導(dǎo)”和“同事”的標(biāo)簽看。

點擊發(fā)送,沒有任何問題,他們看不到這條動態(tài)。
直到我新加了一個同事的微信(以前沒加過)。。。
我確定在加之前就給他設(shè)置好“同事”的標(biāo)簽,發(fā)現(xiàn)他居然能看到我發(fā)的那條動態(tài)?。?!

這算bug嗎?我覺得當(dāng)然算啊!我明明“處心積慮”地設(shè)置好了權(quán)限不給同事看,結(jié)果新加的朋友可以無視這個設(shè)置,直接看到這條動態(tài)!
這讓我又想起了之前加了一個同事,第二天她說我公眾號文章寫得不錯。我內(nèi)心一頓問號,心想我不是把你們屏蔽了嗎???現(xiàn)在想來也是這個bug的鍋了。
朋友圈的設(shè)計
因為這事,又想起了之前的一個編程設(shè)計題(其實是面試題):如果讓你設(shè)計一個朋友圈,你會怎么設(shè)計?
設(shè)計一個朋友圈的功能不難,難的是如何能夠在微信這么大的日活下維持高性能。常見的設(shè)計有兩種:推模式和拉模式。適用于不同的場景。
所謂推模式,指的是一個用戶發(fā)了一條動態(tài),會把這條動態(tài)推送給所有朋友。這樣每個人在刷朋友圈的時候,只需要把自己收到的動態(tài)按收到的順序展示出來就行了。

所謂拉模式,指的是一個用戶在刷朋友圈的時候,去請求他所有好友最近的動態(tài),然后排序展示。

我們先來看看微信是怎么設(shè)計的。朋友圈目前有兩個入口:
點擊發(fā)現(xiàn)-朋友圈,可以看到自己的好友發(fā)的動態(tài)
點擊某個好友的頭像-朋友圈,可以看到這個好友的動態(tài)
對第一種業(yè)務(wù)場景,使用推模式比拉模式好,如果使用拉模式,我們要同時發(fā)出大量的網(wǎng)絡(luò)請求,要處理某些請求失敗的情況,拿數(shù)據(jù)之前要校驗權(quán)限,拿到數(shù)據(jù)后要處理排序等。
而第二種業(yè)務(wù)場景,顯然拉模式比推模式好。因為是查看一個單獨的好友的動態(tài),所以沒有問題。
權(quán)限的設(shè)計
先來看產(chǎn)品層面的設(shè)計。我們在發(fā)朋友圈的時候,可以選擇誰可見誰不可見。如果使用推模式,就很好控制權(quán)限了,直接把要推的人算出來,推給這些人就行了。其他人接收不到推送,自然也就看不到你發(fā)的這條動態(tài)了。
而眾所周知,朋友圈一旦發(fā)表以后,內(nèi)容是不可以修改的,權(quán)限也是不可修改的。所以也就不會有后續(xù)的權(quán)限變更維護(hù)問題。

按照這個邏輯,如果我在一分鐘前發(fā)了一條朋友圈動態(tài),然后新加了一個好友A,這個時候好友A的朋友圈是看不到我們剛剛發(fā)的這條動態(tài)的(即使他應(yīng)該有權(quán)限),因為我們沒有推給他,除非微信在加好友的時候做了補推的操作,我沒試過,但估計沒有做補推操作,感興趣的讀者可以做個實驗看看有沒有。
而如果好友A點擊我的頭像進(jìn)入我的朋友圈,是能夠看到我剛剛發(fā)的那條動態(tài)的。理論上來說,應(yīng)該在拉的時候做一下權(quán)限校驗,但很明顯微信沒有做。
這個權(quán)限校驗其實并不復(fù)雜,也不需要很高的性能。我們用一個圖來解釋:

所以我理解這個并不是技術(shù)實現(xiàn)的問題,而是單純的產(chǎn)品問題,沒考慮到這個業(yè)務(wù)場景吧。但這個使用場景對于我來說確實是會經(jīng)常遇到。不知道什么時候會修復(fù),多久可以修復(fù),但希望可以早點修復(fù)~
推模式有什么弊端?
最后再討論一下推模式。推模式比較適合好友比較少的業(yè)務(wù)場景。在發(fā)動態(tài)這種業(yè)務(wù)下,一般有兩種業(yè)務(wù)場景:
- 雙向關(guān)注,比如微信好友,A和B是互相關(guān)注的關(guān)系,發(fā)的動態(tài)對方都能看到
- 單向關(guān)注,比如微博,A關(guān)注了B,那B發(fā)的動態(tài)A可以看到,但A發(fā)的動態(tài)B看不到。
如果是單向關(guān)注,那就不適合使用推模式,比如某大V,有好幾千萬粉絲,如果使用推模式,發(fā)一條動態(tài)就給這幾千萬人推送,那對服務(wù)器來說消耗巨大,不劃算。所以這種單向關(guān)注的場景使用拉模式更適合。
但單向關(guān)注有時候也會結(jié)合推模式和拉模式兩種方式來做,設(shè)定一個閾值(比如1萬),如果粉絲量小于這個閾值,就使用推模式,否則使用拉模式。
微信好友上限是5000人,所以全部使用推模式也還好。結(jié)合上面提到的權(quán)限問題,估計應(yīng)該是使用的這種模式。但具體有沒有其它什么實現(xiàn),就不得而知了。
求個支持
我是Yasin,一個堅持技術(shù)原創(chuàng)的博主,我的微信公眾號是:編了個程
都看到這兒了,如果覺得我的文章寫得還行,不妨支持一下。
文章會首發(fā)到公眾號,閱讀體驗最佳,歡迎大家關(guān)注。
你的每一個轉(zhuǎn)發(fā)、關(guān)注、點贊、評論都是對我最大的支持!
還有學(xué)習(xí)資源、和一線互聯(lián)網(wǎng)公司內(nèi)推哦
求個支持
我是Yasin,一個堅持技術(shù)原創(chuàng)的博主,我的微信公眾號是:編了個程
都看到這兒了,如果覺得我的文章寫得還行,不妨支持一下。
文章會首發(fā)到公眾號,閱讀體驗最佳,歡迎大家關(guān)注。
你的每一個轉(zhuǎn)發(fā)、關(guān)注、點贊、評論都是對我最大的支持!
還有學(xué)習(xí)資源、和一線互聯(lián)網(wǎng)公司內(nèi)推哦