1. 程式人生 > >電商專案常見面試題

電商專案常見面試題

什麼是負載均衡高可用
nginx作為負載均衡器,所有請求都到了nginx,可見nginx處於非常重點的位置,如果nginx伺服器宕機後端web服務將無法提供服務,影響嚴重。
為了遮蔽負載均衡伺服器的宕機,需要建立一個備份機。主伺服器和備份機上都執行高可用(High Availability)監控程式,通過傳送諸如“I am alive”這樣的資訊來監控對方的執行狀況。當備份機不能在一定的時間內收到這樣的資訊時,它就接管主伺服器的服務IP並繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的資訊時,它就釋放服務IP地址,這樣的主伺服器就開始再次提供負載均衡服務。

 

什麼是FastDFS
FastDFS是用c語言編寫的一款開源的分散式檔案系統。FastDFS為網際網路量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高效能等指標,使用FastDFS很容易搭建一套高效能的檔案伺服器叢集提供檔案上傳、下載等服務。

 

solr怎麼設定搜尋結果排名靠前(得分)?
可以設定文件中域的boost值,boost值越高計算出來的相關度得分就越高,排名也就越靠前。此方法可以把熱點商品或者是推廣商品的排名提高。 

 

什麼是sso系統
單點登入是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。
登入的處理流程:
1、登入頁面提交使用者名稱密碼。
2、登入成功後生成token。Token相當於原來的jsessionid,字串,可以使用uuid。
3、把使用者資訊儲存到redis。Key就是token,value就是TbUser物件轉換成json。
4、使用String型別儲存Session資訊。可以使用“字首:token”為key
5、設定key的過期時間。模擬Session的過期時間。一般半個小時。
6、把token寫入cookie中。
如何判斷是否登入
1.從cookie中取token
2.取不到未登入
3.取到token,到redis中查詢token是否過期
4.如果過期,為登入狀態
5.沒有過期,登入狀態

 

實現購車商品資料同步
1、要求使用者登入。
2、把購物車商品列表儲存到資料庫中。推薦使用redis。
3、Key:使用者id,value:購車商品列表。推薦使用hash,hash的field:商品id,value:商品資訊。
4、在使用者未登入情況下寫cookie。當用戶登入後,訪問購物車列表時,
a)把cookie中的資料同步到redis。
b)把cookie中的資料刪除
c)展示購物車列表時以redis為準。
d)如果redis中有資料cookie中也有資料,需要做資料合併。相同商品數量相加,不同商品新增一個新商品。
5、如果使用者登入狀態,展示購物車列表以redis為準。如果未登入,以cookie為準。

 

瀏覽器跨域問題
跨域是指從一個域名的網頁去請求另一個域名的資源。瀏覽器出於安全的考慮,不允許不同源的請求
JSONP解決AJAX跨域問題:
JSONP是伺服器與客戶端跨源通訊的常用方法。最大特點就是簡單適用,老式瀏覽器全部支援,伺服器改造非常小。
它的基本思想是,網頁通過新增一個<script>元素,向伺服器請求JSON資料,這種做法不受同源政策限制;伺服器收到請求後,將資料放在一個指定名字的回撥函式裡傳回來。

 


海量資料的儲存問題
如今隨著網際網路的發展,資料的量級也是呈指數的增長,從GB到TB到PB。對資料的各種操作也是愈加的困難,傳統的關係性資料庫已經無法滿足快速查詢與插入資料的需求。這個時候NoSQL的出現暫時解決了這一危機。它通過降低資料的安全性,減少對事務的支援,減少對複雜查詢的支援,來獲取效能上的提升。
但是,在有些場合NoSQL一些折衷是無法滿足使用場景的,就比如有些使用場景是絕對要有事務與安全指標的。這個時候NoSQL肯定是無法滿足的,所以還是需要使用關係性資料庫。如果使用關係型資料庫解決海量儲存的問題呢?此時就需要做資料庫叢集,為了提高查詢效能將一個數據庫的資料分散到不同的資料庫中儲存。

 

什麼是資料庫分片
簡單來說,就是指通過某種特定的條件,將我們存放在同一個資料庫中的資料分散存放到多個數據庫上面,以達到分散單臺裝置負載的效果。
資料的切分(Sharding)根據其切分規則的型別,可以分為兩種切分模式。
1.一種是按照不同的表來切分到不同的資料庫(主機)之上,這種切可以稱之為資料的垂直切分
2.另外一種則是根據表中的資料的邏輯關係,將同一個表中的資料按照某種條件拆分到多臺資料庫上面,這種切分稱之為資料的水平切分。


如何實現資料庫分片
當資料庫分片後,資料由一個數據庫分散到多個數據庫中。此時系統要查詢時需要切換不同的資料庫進行查詢,那麼系統如何知道要查詢的資料在哪個資料庫中?當新增一條記錄時要向哪個資料庫中插入呢?這些問題處理起來都是非常的麻煩。
這種情況下可以使用一個數據庫中介軟體mycat來解決相關的問題。


什麼是Mycat?
簡單的說,MyCAT就是:一個新穎的資料庫中介軟體產品,支援mysql叢集,提供高可用性資料分片叢集。你可以像使用mysql一樣使用mycat。對於開發人員來說根本感覺不到mycat的存在。
Mycat讀寫分離
資料庫讀寫分離對於大型系統或者訪問量很高的網際網路應用來說,是必不可少的一個重要功能。對於MySQL來說,標準的讀寫分離是主從模式,一個寫節點Master後面跟著多個讀節點,讀節點的數量取決於系統的壓力,通常是1-3個讀節點的配置

 

電商活動倒計時方案(秒殺方案):
1、確定一個基準時間。可以使用一個sql語句從資料庫中取出一個當前時間。SELECT NOW();
2、活動開始的時間是固定的。
3、使用活動開始時間-基準時間可以計算出一個秒為單位的數值。
4、在redis中設定一個key(活動開始標識)。設定key的過期時間為第三步計算出來的時間。
5、展示頁面的時候取出key的有效時間。Ttl命令。使用js倒計時。
6、一旦活動開始的key失效,說明活動開始。
7、需要在活動的邏輯中,先判斷活動是否開始。
秒殺方案:
8、把商品的數量放到redis中。
9、秒殺時使用decr命令對商品數量減一。如果不是負數說明搶到。
10、一旦返回數值變為0說明商品已售完。
由於宜立方商城是基於SOA的架構,表現層和服務層是不同的工程。所以要實現商品列表查詢需要兩個系統之間進行通訊。

 

如何實現遠端通訊?
1、Webservice:效率不高基於soap協議。專案中不推薦使用。
2、使用restful形式的服務:http+json。很多專案中應用。如果服務太多,服務之間呼叫關係混亂,需要治療服務。
3、使用dubbo。使用rpc協議進行遠端呼叫,直接使用socket通訊。傳輸效率高,並且可以統計出系統之間的呼叫關係、呼叫次數。

 

什麼是dubbo
DUBBO是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案
Dubbo就是資源排程和治理中心的管理工具。

 

dubbo服務開發流程,執行流程?zookeeper註冊中心的作用?
使用流程:
第一步:要在系統中使用dubbo應該先搭建一個註冊中心,一般推薦使用zookeeper。
第二步:有了註冊中心然後是釋出服務,釋出服務需要使用spring容器和dubbo標籤來發布服務。並且釋出服務時需要指定註冊中心的位置。
第三步:服務釋出之後就是呼叫服務。一般呼叫服務也是使用spring容器和dubbo標籤來引用服務,這樣就可以在客戶端的容器中生成一個服務的代理物件,在action或者Controller中直接呼叫service的方法即可。
Zookeeper註冊中心的作用主要就是註冊和發現服務的作用。類似於房產中介的作用,在系統中並不參與服務的呼叫及資料的傳輸。

 

電商專案中是如何解決高併發和高可用的?
1.頁面靜態化
2.fastDFS圖片伺服器
3.資料快取伺服器
4.資料庫叢集、庫表雜湊(資料庫的各種優化、資料庫的拆分)
5.負載均衡

 

什麼是負載均衡
當一臺伺服器的單位時間內的訪問量越大時,伺服器壓力就越大,大到超過自身承受能力時,伺服器就會崩潰。為了避免伺服器崩潰,讓使用者有更好的體驗,我們通過負載均衡的方式來分擔伺服器壓力。
我們可以建立很多很多伺服器,組成一個伺服器叢集,當用戶訪問網站時,先訪問一箇中間伺服器,在讓這個中間伺服器在伺服器叢集中選擇一個壓力較小的伺服器,然後將該訪問請求引入該伺服器。如此以來,使用者的每次訪問,都會保證伺服器叢集中的每個伺服器壓力趨於平衡,分擔了伺服器壓力,避免了伺服器崩潰的情況。
負載均衡是用反向代理的原理實現的。

 

redis為什麼可以做快取?專案中使用redis的目的是什麼?redis什麼時候使用?
1)Redis是key-value形式的nosql資料庫。可以快速的定位到所查詢的key,並把其中的value取出來。並且redis的所有的資料都是放到記憶體中,存取的速度非常快,一般都是用來做快取使用。
2)專案中使用redis一般都是作為快取來使用的,快取的目的就是為了減輕資料庫的壓力提高存取的效率。
3)在網際網路專案中只要是涉及高併發或者是存在大量讀資料的情況下都可以使用redis作為快取。當然redis提供豐富的資料型別,除了快取還可以根據實際的業務場景來決定redis的作用。例如使用redis儲存使用者的購物車資訊、生成訂單號、訪問量計數器、任務佇列、排行榜等。
redis支援五種資料型別儲存:1.字串2.雜湊3.列表4.集合5.有序集合

 

Redis叢集中,某個節點宕機怎麼辦?你遇見過嗎?你的解決思路是什麼?
redis叢集:一般的是至少是2臺伺服器,主從伺服器!如果redis叢集的主伺服器掛了,沒有關係還有備伺服器

(哨兵模式)

 

AcitveMQ的作用、原理、特點?(生產者。消費者。 p2p、訂閱實現流程)
Activemq的作用就是系統之間進行通訊。當然可以使用其他方式進行系統間通訊,如果使用Activemq的話可以對系統之間的呼叫進行解耦,實現系統間的非同步通訊。原理就是生產者生產訊息,把訊息傳送給activemq。Activemq接收到訊息,然後檢視有多少個消費者,然後把訊息轉發給消費者,此過程中生產者無需參與。消費者接收到訊息後做相應的處理和生產者沒有任何關係。

 

ActiveMQ如果資料提交不成功怎麼辦?
Activemq有兩種通訊方式,點到點形式和釋出訂閱模式。如果是點到點模式的話,如果訊息傳送不成功此訊息預設會儲存到activemq服務端知道有消費者將其消費,所以此時訊息是不會丟失的。
如果是釋出訂閱模式的通訊方式,預設情況下只通知一次,如果接收不到此訊息就沒有了。這種場景只適用於對訊息送達率要求不高的情況。如果要求訊息必須送達不可以丟失的話,需要配置持久訂閱。每個訂閱端定義一個id,在訂閱是向activemq註冊。釋出訊息和接收訊息時需要配置傳送模式為持久化。此時如果客戶端接收不到訊息,訊息會持久化到服務端,直到客戶端正常接收後為止。

 

sku的幾種常用設計方法,你的sku是怎麼設計的?
sku:Stock Keeping Unit(庫存量單位)產品統一編號的簡稱,每種產品均對應有唯一的SKU號
SKU屬性的設計,可以分為兩類:
(1)通過屬性集關聯SKU屬性 適合品類較少的網站,管理容易些。
(2)產品和SKU屬性直接關聯
適合品類很多網站,比較靈活,但是維護起來資料量比較大。
為了簡化,我增加SKU屬性關聯產品分類(可為空,表示是全域性的),這樣在建立產品時,可以只列出全域性的+本產品分類的SKU屬性,這樣就不會一下子列出很多SKU屬性了。SKU屬性分為前端名稱和後臺名稱兩個,方便不同業務含義的SKU屬性,在前端也能夠用同一個名稱顯示,如顏色、容量等。另外在操作上可以做些優化,比如用下拉列表顯示可選的SKU屬性時,可以同時顯示該屬性的屬性描述,供產品維護人員參考。
基於SKU方式來管理產品時,產品的價格、庫存和圖片等資訊必然是放在產品SKU表中處理的,和訂單、購物車等表的關聯,也是通過產品SKU表,而不是產品表。至於產品表,實際上是一個總的業務彙總和外部關聯表,但實際銷售的並不是它。我們網站做的更細些,會就每個產品SKU生成獨立的URL(偽靜態),但從SEO方面考慮,每個產品SKU擁有獨立

 

單點登入具體實現了什麼功能?

  1. 去登陸頁面
  2. 提交登陸頁面
  3. 使用者名稱、密碼、驗證碼的校驗
  4. 錯誤資訊的回顯
  5. 儲存使用者到Session中
  6. 重定向到登陸之前的訪問頁面
  7. Ajax跨域判斷使用者是否登陸

Redis在其中是怎麼用的?起了什麼作用?
redis中儲存的都是key-value格式的。拿商品資料來說,key就是商品id,value是商品相關資訊的json資料。
在商城系統中當併發量比較高,頻繁的對資料庫進行讀操作的時候都需要新增快取。例如頁面中內容資料的快取、商品資料的快取以及使用者資料的快取等。
做商品資料的快取時,因為商品的資料量很大,而且快取是把資料儲存到記憶體中,此時不可能把所有的商品資料都放到快取中。所以需要設定商品資料快取的有效期,當用戶訪問到非熱點資料後,此資料放到快取中,當快取到期後就從快取中刪除,而且長時間不會新增到快取。而熱點資料一旦從快取中刪除會馬上又新增到快取。這樣可以提高快取的利用率,同時也減輕了資料庫的壓力。

各模組是怎麼設計的,如商品引數,廣告位等

 

 

參考連結:http://blog.51cto.com/13517854/2073947