面試淘點點的架構問題是怎樣回答的

之前面試淘點點的時候被問倒得一個問題至今牽掛,由於工作環境的限制,我沒能接觸到一些大數據量的併發工作,也沒能有機遇參與複雜系統的設計,而我學習複雜或高併發系統的唯一途徑就是閱讀源碼,慚愧的是,至今也只閱讀了Tomcat的部分源碼,最終確定兩鍾實現思路:

1、具有排序功能的隊列

2、Redis+定時器

思路 1

原理:第一種思路也就是大家推薦的延遲隊列實現的原理,其就是一個按時間排好序的隊列,每次put的時候排序,然後take的時候就計算時間是否過期,如果過期則返回隊列第一個元素,否則當前線程阻塞X秒,這個也是JDK 自帶 DelayQueue 的思路。詳細可看源碼

面試淘點點的架構問題是怎樣回答的

代碼實現:待實現後補充

思路 2

原理:第二種思路需要利用Redis的有序集合,說到使用 Redis 就不得不考慮Score的設計,因為它直接決定你代碼的複雜度,你思路的清晰性,在這我並沒有採用 林中漫步 先生的設計,而是通過精確到秒的時間做Score(去掉毫秒),然後使用線程每一秒掃一次,使用當前時間作為zrangeBysocre命令的Score去查詢。詳細請看代碼。

業務場景:按京東一天500萬的成交量,一天主要成交時間為8小時,計算得出每秒173個訂單,當然實際上訂單不能均勻分佈在每秒,但我們主要為了論證思想的可行性。

面試淘點點的架構問題是怎樣回答的

第二步:同樣利用Spring Scheduled 一秒鐘心跳一次,每次利用當前時間作為Key 從Redis 取數據。

面試淘點點的架構問題是怎樣回答的

經過測試,沒有出現漏單的情況,這只是簡單的實現,很多地方可以優化,在實際中用也可能會出現很多問題,需要不斷完善,此案例只是提供思路,另外我覺得JDK的 DelayQueue 相對於Redis來說沒有那麼好,因為Queue畢竟每次取一個,如果同一時間的比較多可能不能符合當前這種時間嚴謹的需求,另外他是單機的,有時間我去研究下kafka、Rabbit的延遲隊列再來補充。

在此我向大家推薦一個架構學習交流群。交流學習群號: 744642380, 裡面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源

面試淘點點的架構問題是怎樣回答的


分享到:


相關文章: