Ruby 和 EventMachine-WebSockets - 它的异步程度如何



我正在通过EventMachine使用WebSockets在Ruby上构建服务器。

假设用户卡尔要求一辆车。

ID 为"7"的汽车被请求给汽车经理。CarManager创建一个Car实例,Car从Mongo数据库加载自身(提供了id)。汽车"7"存储在CarManager中,就像缓存一样,只要Carl或其他任何人继续使用或请求它。然后Car通过WebSocket发送,特别是Carl。我把卡尔的WS存放在某个地方。

如果两个用户,比如说,Lenny 和 Carl,都同时要求 Car ID "7"精确"怎么办?CarManager会因为它在这两种情况下都找不到Car 7的缓存版本,所以两次都会从数据库中获取它并实例化它,还是这两个WebSocket请求中的一个将首先被处理,然后第二个将使用缓存版本?

WebSockets的整个异步事情让我有点困惑。感谢您对此的任何见解!

让我这样说:假设你已经扩展到两台服务器。你应该明白你懒惰汽车的创造方法是不正确的。您不应该允许用户使用提供的ID进行创建,或者你应该使用一些外部互斥锁,例如CarManager中的"Car:7:load"。或者,您也可以使您的 CarManager 成为透明的代理,将获取汽车的工作放在上面(并在那里面临相同的并发问题)。

我会使用类似 Mongoid 的东西来隐藏大部分细节,这样当 Carl 的浏览器发送 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 位(例如,将.to_summary方法添加到Car模型中),以便它只返回有关客户关心的汽车的信息。

您不必担心哪个请求先传入,或者即使它们同时出现,mongoid也会为您处理低级内容。

最新更新