鍍金池/ 問(wèn)答/Java  GO  iOS/ Golang在接口開(kāi)發(fā)的過(guò)程中,這兩種方式哪一種更好,或者有什么問(wèn)題?

Golang在接口開(kāi)發(fā)的過(guò)程中,這兩種方式哪一種更好,或者有什么問(wèn)題?

大家在寫(xiě)接口的時(shí)候,比如有這樣一個(gè)場(chǎng)景用戶瀏覽,需要給文章增加瀏覽量

  • 方案一:加瀏覽量這個(gè)操作,是有一個(gè)channel監(jiān)聽(tīng),程序一直在跑,如果瀏覽了帖子,新開(kāi)一個(gè)goruntime往這個(gè)channel里面寫(xiě)入數(shù)據(jù)(ps:增加瀏覽量的channel可能阻塞),通知監(jiān)聽(tīng)的channel執(zhí)行
  • 方案二: 在用戶請(qǐng)求接口返回這前的這個(gè)過(guò)程就給帖子的瀏覽量增加了一

這兩種設(shè)計(jì)方式哪一種更好呢?我覺(jué)得第一種會(huì)更好,會(huì)不會(huì)出現(xiàn)什么問(wèn)題呢?

回答
編輯回答
生性

用戶對(duì)文章的瀏覽請(qǐng)求,這個(gè)是讀操作,是可以被Cache緩存(如果有的話)的,并不需要操作數(shù)據(jù)庫(kù)。
增加瀏覽量這個(gè)操作涉及寫(xiě)數(shù)據(jù)庫(kù),而且通常瀏覽量并不要求很強(qiáng)的一致性和實(shí)時(shí)性,可以不必等瀏覽量增加操作執(zhí)行完成(數(shù)據(jù)庫(kù)寫(xiě)成功)就返回。

所以第一種方式把增加瀏覽量的操作異步處理,且不等待處理結(jié)果,可以降低處理用戶瀏覽請(qǐng)求的處理時(shí)間,對(duì)提升性能是有幫助的。
可能需要注意的是,避免惡意或突發(fā)大量請(qǐng)求,導(dǎo)致goroutine泛濫,占用太多內(nèi)存,當(dāng)然這個(gè)應(yīng)該在用戶建立連接時(shí)就做一些流控處理。

2017年10月12日 10:00
編輯回答
逗婦惱
  • 每次都新開(kāi)一個(gè)goroutine的方案我覺(jué)得不太妥,如果是你給的方案中二選一,那我會(huì)選第二種。
  • 再提供一個(gè)我認(rèn)為比較普遍的做法:引入redis,把瀏覽量數(shù)據(jù)放在redis中,異步寫(xiě)入。讀取瀏覽量值時(shí),從redis讀取,顯示時(shí)顯示概數(shù),比如讀取到的值是1234,那就顯示1.2K。
2017年5月22日 05:34