2015-06-25 55 views
2

Rails如何處理來自不同用戶的多個請求而不發生衝突?什麼是邏輯?Rails如何處理多個傳入請求?

例如,user1登錄並瀏覽該網站。同時,user2,user3,...登錄並瀏覽。如何在用戶之間沒有任何數據衝突的情況下管理這種情況?

回答

3

這裏要記住的一點是,即使用戶在瀏覽器中同時使用該站點,服務器仍可能一次只處理一個請求。請求處理可能需要不到一秒的時間,因此請求可以排隊處理,而不會對用戶造成嚴重的延遲。每個響應都從一個空白的石板開始,僅從請求中獲取信息並使用它從數據庫中查找數據。它從一個請求到下一個請求都沒有任何結果。這被稱爲「無狀態」範例。

如果負載增加,可以添加更多的rails服務器。因爲無論如何每個響應都是從頭開始的,添加更多的服務器不會產生與「信息共享」有關的任何問題,因爲所有信息都是在請求中發送或從數據庫加載。這意味着每秒可以處理更多的請求。

當他們對用戶是一種「連續性」的感覺時,例如,保持登錄到網站,這是通過cookie完成的,cookie存儲在他們的機器上並作爲請求的一部分發送。服務器可以從請求中讀取此cookie信息,例如,不會將某人重定向到登錄頁面,因爲cookie告訴他們他們已經以用戶123或其他方式登錄。

+0

負載平衡器可以將作業分配給可能同時工作的多個服務器。 – sawa

+0

我知道。對不起,我不明白你的觀點。 –

+0

你寫過請求不能被服務器同時處理。那是錯的。它是控制這個的數據庫。 – sawa

1

這不是由Rails保證的,而是由web服務使用的數據庫保證的。您提到的財產被稱爲isolation。這是實際數據庫必須滿足的幾個屬性之一,稱爲ACID。

0

隨着更多的情況下,你可以使用像一個「美洲獅」多線程服務器...

2

如果你的問題是關於Rails這樣不同用戶的答案將是使用Cookie來存儲會話。你可以閱讀更多關於它here

而且因爲你能控制的新實例爲每個請求

RailsGuides:

當應用程序接收到一個請求,路由將決定 運行哪個控制器和動作,然後數據不衝突Rails創建一個控制器實例 ,並以與動作相同的名稱運行該方法。

1

這是通過使用a "session"來實現的:一組特定於給定客戶端,可用服務器端的數據。

plenty of ways的服務器來存儲會話,通常Rails使用一個cookie:存儲與每個請求送到用戶的瀏覽器和小(通常大約4 KB)的數據集。出於這個原因,你不想在那裏存儲太多。但是,您通常不需要太多,只需足以識別用戶並仍難以冒充他。

因此,Rails將會話本身存儲在cookie中(如this guide所述)。這很簡單,不需要安裝。有人認爲cookie存儲是不可靠的,並使用持久性機制:數據庫,鍵值存儲等。

典型地,工作流程如下:

  • 會話ID被存儲在cookie中,當服務器決定初始化一個會話
  • 服務器接收來自用戶的請求時,通過它的id獲取會話
  • 如果會話說,它代表用戶X,Rails的行爲就好像它實際上是他

由於不同的用戶發送不同的會話ID時,Rails將它們視爲不同並根據請求輸出與檢測到的數據相關的數據。

之前你問是的,這是有可能竊取其他人的會話ID和行爲在該人的姓名。它被稱爲session hijacking,它只是您可能遇到的所有可能的安全問題之一,除非您小心。同一頁面提供了更多關於如何防止用戶遭受痛苦的信息。