記最近的坑

    來tn後,一直在寫業務代碼,感受不會遇到難點。然而最近的需求雖然還是業務,但坑頗多,記下。程序員

    背景:CEO&董事長想在首頁產品列表看到精華點評,很久以前就和產品說過。產品一直沒有提上日程,老總心血來潮,讓上這個功能。產品終於放在了心上,提了一個需求——苦了研發(me)redis

    講一下最初的狀況:點評系統支持查詢金華點評,但不支持批量(根據產品ID)查(由於之前點評都是在詳情頁,用戶須要先點進產品詳情頁,再點擊點評,纔會看到點評,併發量不是很大,沒有批量的必要)。然而,首頁的產品列表是用戶一打開app就會直接加載的,並且是產品列表,不是單個產品。另外,點評系統不穩定,性能很差,對方說,瓶頸在DB,不在IO,對方還說,只要老闆加機器,就沒有瓶頸。。。spring

    而後我只能在for循環裏一次調用點評系統。緩存

    研發經理知道這個需求很坑,可是是老大的需求,創造條件也得上!讓我異步的調用後臺,並在用戶請求第一頁的時候,異步調用下一頁的點評。這裏,會用到緩存(redis)。說道緩存,讓人又愛又恨——它即提升了服務端響應速度(不用每次都查庫||調接口),又增長了邏輯、程序複雜度(後面再講)併發

    首先講經理的思路:app

    方案一:服務端每頁十條數據,併發調用點評接口異步

    方案二:客戶端異步調用點評信息,可是app拒絕(頗有道理,若是app本身調用,那還要咱們幹什麼?另外,那一天老總明白過來,不想要點評了,已經發出去的app是收不回來的,服務端則能夠自由的上功能、下功能)函數

    最終選擇了方案一,並決定v906纔開始支持點評,v905及以前不用支持(坑1)。指定城市支持點評,其他不支持(坑2)性能

    緩存方案:1 以十條產品爲一個單位,存儲下他們的全部點評線程

                     2 這十條產品分別存入緩存(由於1種的不一樣單位可能含有相同產品)

                     3 請求第一頁時,異步請求下一頁(該頁放入緩存,該頁每條產品也放入緩存) 

    個人解決方式:先從緩存裏取1單位,若是有,皆大歡喜。若是沒有,依次從緩存裏取,並把緩存未命中的存到list裏,最後異步從後臺獲取,並按緩存方案1,2設置緩存。

    緩存是redis,異步方案採用spring rest + http client + hystrix(熔斷、併發、降級)

    異步下一頁的方案是,構造一個事件,扔到阻塞隊列裏,開一個線程池,從隊列裏消費事件。消費的邏輯:判斷緩存key是否存在,存在什麼都不作,不存在,按「個人解決方式」來。

 

    其實,仍是有更好的方案的,點評後臺提了兩個:

    1 他們把精華點評塞入redis,天天更新。缺點是萬一緩存地址變了,咱們這邊除了該配置,重啓,沒有別的方法更改緩存地址(其實,可使用jmx)

    2 他們把點評塞入mq,及時性高。

    但最終,點評後臺仍是選擇了在規定時間內,提供批量查詢的接口給我

 

    關於點評,有關聯線路點評這一說法,詳情頁都會取關聯點評(即,點評不必定是該產品的點評。。。)。關聯線路點評的productId與產品自己的productId不同(坑3)

 

    先說坑3:剛開始不支持批量時,我會從後臺獲取產品的第一條精華點評(該產品、關聯線路,都會取),因爲可能會是關聯線路的,因爲productId不同,會讓程序(實際上是程序員-我)覺得該產品沒取到點評。在經理的提醒下,我手動把關聯線路點評的productId設爲該產品的productId。

                    後臺提供批量查詢接口的時候,也犯了這個錯,他門也手動改了id(我這邊就不改了)

  坑2:因爲預訂城市是我這邊能夠獲得的,可是是在  fun1(request)  函數裏獲得的,而我在fun2裏作點評,調用fun1時,它並無把cityCode返回,因此我把cityCode放入request中。因爲先讀緩存,緩存裏有,就不會調用fun1,從而request.cityCode==0,即該城市不支持點評。最後,我把cityCode也存入了緩存(這個坑的原因的發現也是經理,我發現了現象,可是本地寫死了是1602(南京),因此本地始終沒問題。)

    坑3:版本控制。在預發佈測時,因爲是906(還未推向市場)的包,沒有問題。可是到了線上,大量版本<906的請求過來,致使緩存裏全是沒有點評的產品信息,從而906版本讀緩存時,沒有點評!最後,按照是否須要點評分別緩存(這個坑的原因的發現是我師傅達先生,寫代碼的我2個鐘頭沒想到,他3分鐘內想到了,姜仍是老的辣)

 

    因爲今天是週五,想上線只能等到下週一,或者緊急上線。app今天封包,下週1,2,3迴歸,周3下班發包。想緊急上線,同事建議拖到週一夜上線,由於緊急上線是記名的(你懂得)。但睡完午覺後,同事又提醒,下週一是會員日(每個月16號), 不許上線,因此只能緊急。

相關文章
相關標籤/搜索