0

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

假设用户 Carl 要汽车。

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

如果两个用户,比如说,Lenny 和 Carl,都在“确切”的时间要求 Car id “7”,会怎样。CarManager 会因为在这两种情况下都找不到 Car 7 的缓存版本,因此两次都从数据库中获取并实例化它,或者这两个 WebSocket 请求中的一个将首先处理,然后第二个将使用缓存的版本?

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

4

2 回答 2

0

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

于 2012-08-12T01:38:12.340 回答
0

我会使用类似的东西Mongoid来隐藏大部分细节,这样当 Carl 的浏览器发送一个 websocketonmessage请求时,就像{: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也会为您处理低级别的东西。

于 2013-05-03T01:56:54.830 回答