2012-08-07 76 views
0

我正在通過EventMachine使用WebSockets在Ruby上構建服務器。Ruby和EventMachine-WebSockets - 它有多異步?

比方說,用戶卡爾要求一輛車。

向CarManager請求車號「7」。 CarManager創建一個Car實例,Car從Mongo數據庫加載自己(提供了id)。汽車「7」存儲在CarManager中,就像一個緩存,只要Carl或任何其他人持續使用或請求它。然後Car通過WebSocket發送,具體發送給Carl。我在某處儲存了Carl的WS。

如果兩個用戶Lenny和Carl都在「確切」同時要求Car id「7」,該怎麼辦?請問CarManager,因爲無論在哪種情況下都無法找到Car 7的緩存版本,而是從數據庫中獲取它並實例化它,或者這兩個WebSocket請求中的一個將首先處理,然後第二個將使用緩存版?

WebSockets的整個異步事件讓我有點困惑。感謝您對此的任何見解!

回答

0

讓我這樣說:想象你已經擴展到兩臺服務器。你應該明白,你的懶惰汽車的創作方法是不正確的。您不應該允許用戶使用提供的ID創建,或者您應該使用一些外部互斥鎖,例如CarManager中的「Car:7:loading」。或者,也可以讓CarManager成爲一個透明代理,將作業提取到Cars上(並在那裏面對相同的併發問題)。

0

我會使用類似Mongoid隱藏大多數的這些細節,所以,當卡爾的瀏覽器發送的WebSocket onmessage要求如{:command => 'get_car", :car_id => "7"}你EM的onmessage處理程序看起來有點像

ws.onmessage do |msg| 
    message = JSON.parse(msg) 
    car = Cars.where(car_number: message[:car_id]).first 
    ws.send(car.to_json) 
end 

很明顯,你會想要處理未找到汽車或消息形成不當的情況,並且您可能想要自定義返回的JSON(例如,向Car模型添加.to_summary方法),以便它僅返回信息關於客戶關心的汽車。

您不必擔心哪個請求會首先進入,或者即使它們同時進入,mongoid也會爲您處理低級別的內容。