1. 程式人生 > >day82_宜立方商城專案_專案中的問題_匠心筆記【借鑑】

day82_宜立方商城專案_專案中的問題_匠心筆記【借鑑】

  黑馬程式設計師最新專案《宜立方商城》與經典的《淘淘商城》有很多地方都是一樣的,只是用了一些更新的技術而已,這裡我們借鑑一下《宜立方商城》面試時要問到的問題。該商城以後博主和大家一起做一做。

1、描述一下你的專案

  網上商城是一個綜合性的B2B2C平臺,類似京東商城。商家可以申請入駐到平臺進行商品的銷售,會員可以在商城瀏覽商品、搜尋商品、使用購物車、購買商品下訂單,以及參加秒殺團購等各種活動。網站前臺共分為門戶搜尋商品詳情頁購物車秒殺使用者中心單點登陸系統等7個模組。
  系統有兩個管理後臺:商家管理後臺運營商管理後臺。商家申請入駐後,即可獲得商家管理後臺的使用許可權,在商家管理後臺可以提交商品資訊、品牌申請、規格申請等。商家提交的商品資訊必須經過管理員在運營商管理後臺進行稽核方可正式銷售。管理員、運營人員可以在運營商後臺管理系統中稽核商家入駐申請、稽核商品提交申請、管理訂單、會員、商家結算、統計分析等,客服可以在運營商後臺管理系統中處理使用者的詢問以及投訴。

2、描述一下你的系統架構

  網上商城採用當前最流行的SSM(springmvc+spring+mybatis)框架開發,是當前電商網站首選的技術架構。系統是基於SOA架構設計,採用噹噹的dubbox作為服務中介軟體,前端採用angularJS + Bootstrap,操作簡便使用者體驗好。商品詳細頁使用freemarker做靜態化頁面來提高系統的效能,使用nginx做負載均衡伺服器以應對大規模的使用者量的併發。電商搜尋系統採用當前最流行的全文檢索技術solr叢集實現。系統中使用redis叢集做快取,使用Activemq做訊息中介軟體。後臺資料庫使用mysql資料庫,使用mycat做讀寫分離。

3、說一下dubbox的使用方法

  dubbox是一個分散式服務框架,提供了統一的高效能的遠端服務呼叫平臺。所有的業務邏輯都使用dubbox釋出供表現層工程呼叫。釋出dubbox服務需要使用spring容器的支援來發布服務,呼叫服務同樣使用spring容器來應用服務。其中服務的釋出和服務的發現都是通過註冊中心來實現,我們使用Zookeeper作為註冊中心。

4、持久層框架為什麼選擇mybatis?

  網際網路專案追求的是高效能,尤其是資料庫查詢的時候,在併發量高的情況下需要對sql語句進行調優。mybatis就是面向sql語句的,所以操作起來筆記容易入手。所以一般網際網路專案中大多采用mybatis作為持久層框架

5、電商專案中會有很多圖片需要儲存,你們系統中是如何儲存圖片的?

  在電商專案中需要儲存大量的圖片,需要一個獨立的圖片伺服器來儲存,而且儲存的容量需要可擴充套件。並且還需要解決在高併發及高可用的問題。所以我們採用一個FastDFS一個分散式檔案系統來儲存圖片。FastDFS可以搭建伺服器叢集,解決了儲存空間的水平擴充套件、負載均衡以及伺服器的高可用問題。

6、你們系統的併發是多少?如何解決高併發的問題?

  經過我們對系統的調優,保證壓力測試時每個tomcat的併發量達到400。現在我們有5臺web伺服器提供服務,基本上也就是2000左右的併發,如果將來併發量進一步提高是可以再增加伺服器來提供併發能力。
  解決高併發問題首先要提高本系統的吞吐能力,例如:在系統中新增快取、實現網頁靜態化等方式。如果在系統優化之後還不能滿足業務的需要就需要增加伺服器,做伺服器叢集。前端使用nginx做負載均衡伺服器,並實現nginx的高可用。目前可以滿足當前的業務需要,如果將來業務量增加的話可以考慮新增伺服器F5硬負載等裝置。

7、你們商城是否做過SEO處理,是如何做的?

  我們做過seo處理,也就是配合seo人員做一些工作。在頁面中新增一個關鍵詞做網頁的偽靜態化或者是純靜態化等處理。還有就是在頁面的關鍵詞中中新增一些連結等。

8、網頁靜態化的實現方案

  建立一個獨立的工程,此功能的功能就是生成靜態化頁面的,例如商品詳情頁面靜態化。將此工程獨立部署到一個服務上,頁面就生成到當前服務的磁碟上,並且此工程監聽MQ的訊息,一旦後臺工程新增商品,此工程將接收到訊息並且生成靜態頁面。在此伺服器上安裝一個nginx做為訪問靜態資源的http伺服器

9、你們專案中是redis做快取,你redis存的是什麼格式的資料,是怎麼存的?

  redis提供的儲存形式比較豐富。為了便於對快取資料進行管理,我們多數是採用hash(鍵值對)格式來儲存的。

10、你們專案中快取的應用場景?

  在商城系統中當併發量比較高,頻繁的對資料庫進行讀操作的時候都需要新增快取。例如:頁面中廣告資料、搜尋面板資料、購物車等。

11、如何提高快取的利用率?

  做資料的快取時,因為資料量很大,而且快取是把資料儲存到記憶體中,此時不可能把所有的資料都放到快取中。所以需要設定資料快取的有效期,當用戶訪問到非熱點資料後,此資料放到快取中,當快取到期後就從快取中刪除,而且長時間不會新增到快取。而熱點資料一旦從快取中刪除會馬上又新增到快取。這樣可以提高快取的利用率,同時也減輕了資料庫的壓力。

12、專案中使用到了快取,那麼如何實現快取同步的?

  只要使用了快取就涉及到快取同步的問題。快取同步其實就是當快取的資訊發生變化,也就是對後臺對快取的資料進行增、刪、改操作後,資料庫中的資料發生了變化同時要把快取中的資料對應刪除即可。當頁面再次請求資料時,快取中不能命中就會從資料庫中查詢並且新增到快取中,即實現了快取同步。

13、Redis是nosql資料庫,是否適合儲存大資料?

  redis是nosql資料庫,但是redis是key-value形式的nosql資料庫,資料是儲存到記憶體中的,適合於快速存取一般作為快取使用。所以不適合於大資料的儲存。並且redis是單執行緒的,如果某個操作進行大資料的儲存的話其他的程序都處於等待狀態,這樣就降低了效能。所以在redis中不適合於大資料的儲存。如果是類似商品評論這樣的價值不高的大批量資料,我們的做法是採用mongodb

14、你們系統中搜索是怎麼實現的?

  電商搜尋一般也是使用全文檢索實現,我們使用的是solr作為全文檢索伺服器,實現搜尋功能。我們在solr中配置跟業務相關的業務域,從資料庫中把相關的資料匯入到索引庫中。例如商品搜尋功能就把商品表中的資料匯入到索引庫中。然後使用solr實現商品搜尋,然後在頁面中把搜尋結果展示出來。
  我們把SKU:商品名稱、商家名稱、價格、規格等資訊設定為業務域規格的儲存採用了動態域來實現。
  我們使用的是SpringDataSolr框架來實現對solr的操作。

15、如何處理資料量大、併發量高的搜尋?

  如果要搜尋的內容資料量很大並且併發量很高的情況下,一個solr服務是不能滿足要求的,所以此時需要SolrCloud來解決。SolrCloud也就是solr的分散式解決方案。是zookeeper+solr實現的。

16、你們專案搜尋功能中是如何處理分詞的?新上市的商品如何處理分詞?

  在專案中搜索功能使用solr實現,在solr中配置中文分析器,我們使用IKAnalyzer來實現中文分詞。如果是新上市的商品可能會出現一些新的關鍵詞,為了查詢的準確性,我們會把新的關鍵詞新增到IKAnalyzer的擴充套件詞典中

17、你們的專案中的系統之間是如何通訊的?

  我們專案主體部分採用的是Dubbox分散式框架,利用Zookeeper實現各系統之間的呼叫。另外就是使用ActiveMQ實現系統之間非同步呼叫。前端跨域呼叫使用CORS技術。

18、專案中是否使用訊息中介軟體(MQ)進行通訊?有什麼好處?

  專案中使用到了Activemq,可以實現系統之間的非同步通訊,從而實現業務的解耦執行效率的提升

19、Activemq有幾種訊息通訊方式?

  使用MQ中介軟體可以有兩種通訊方式queuetopic。Queue可以實現點到點之間的通訊,可以有多個Producer也可以有多個Consumer,但是訊息只能被一個Consumer接收,一旦訊息被消費後就沒有了。
  Topic可以實現類似廣播的通訊方式,可以有多個Producer和多個Consumer,一旦有Producer傳送訊息後,此訊息可以被所有Consumer接收。

20、Activemq在你專案中的應用場景是什麼?

  應用場景1:當後臺系統對商品資料進行新增、刪除、修改後,將會發送一個訊息變化的訊息,此訊息通過topic進行通訊,有多個消費端,商品詳情頁面的靜態頁面會重新生成
  應用場景2:使用者註冊時,向用戶註冊傳送簡訊驗證碼,採用queue方式通訊。消費端呼叫阿里大於簡訊介面進行簡訊的傳送。

21、如何處理叢集環境下的登入問題?

  在我們的專案中,我們使用一個SSO(單點登入)系統來解決叢集環境下的登入問題,只需要在單點登入系統中登入一次就可以訪問其他的互信的網站。我們採用的耶魯大學的開源專案CAS,並與SpringSecurity進行整合

22、你的專案中購物車是如何實現的?

  我們的專案中是使用者不登陸的時候也可以使用購物車,通過讀cookie實現的。當用戶登陸後,將本地的購物車同步到服務端,採用Redis進行儲存。同步後將本地的cookie中購物車資料清除。

23、搞活動秒殺搶購時庫存是如何控制的?

  1、把商品的數量放到redis中。
  2、秒殺時使用decr命令對商品數量減一。如果不是負數說明搶到。
  3、一旦返回數值變為0說明商品已售完。

24、你們商城的支付系統是如何實現的?

  我們系統採用微信掃碼支付。首先需要到微信平臺申請微信公眾賬號(服務號),然後再申請開通微信支付。開通後會得到appid、祕鑰等資料,用於呼叫微信支付介面。
  微信支付介面是通過httpClient方式向微信支付平臺傳送資料並獲取結果。
  (1)呼叫統一下單介面獲取url。
  (2)根據獲取的url在頁面上通過qrcode.js生成二維碼。
  (3)生成二維碼後,實時輪詢查詢訂單狀態,當返回成功時,跳轉至成功頁面。

25、AngularJS包括哪些常用指令?

  ng-app   指定應用模組
  ng-controller   指定控制器
  ng-init   指定控制器呼叫的初始化方法
  ng-model   繫結變數
  ng-if   條件判斷
  ng-repeat   迴圈資料

26、你們使用什麼技術實現資料的快取?

  我們使用redis作為資料快取,並搭建redis叢集(6個點,3主3備),使用Spring Data框架操作redis快取

27、如何實現負載均衡?

  可以使用nginx做反向代理伺服器,經過配置nginx.conf配置反向代理,將請求轉發給後端的tomcat叢集,實現負載均衡。

28、當資料庫的資料特別大,如何實現擴容?

  資料庫可以實現垂直切分水平節分。垂直切分就是將不同業務模組的表存入到不同的資料庫中。水平切分就是將一個表的資料按照一定分片規則儲存在不同的資料庫中。
  我們可以使用mycat資料庫中介軟體。Mycat可以很方便地管理資料的叢集。通過設定資料節點分片規則邏輯庫邏輯表來實現資料的水平切分。

29、什麼是mysql資料庫的讀寫分離?

  對於大部分應用,資料庫讀的多,寫的少。資料庫所承擔是主要是讀的壓力。我們可以通過mysql的主從複製實現資料庫的讀寫分離。即一個主庫(用於寫入資料),多個從屬庫(用於讀取資料)。當用戶傳送查詢語句,就訪問從屬庫,如果使用者傳送增刪改語句,就訪問主庫。
  主庫與從屬庫之間建立心跳,實現實時同步資料

30、什麼是Docker?

  Docker是一個開源的引擎,可以輕鬆的為任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署。


  參考連結:https://blog.csdn.net/qq_39924485/article/details/79949232