0

EventMachine を介して WebSockets を使用して Ruby でサーバーを構築しています。

ユーザー Carl が Car を要求したとします。

ID「7」の車が CarManager に要求されます。CarManager は Car インスタンスを作成し、Car は Mongo Database (id が提供された) から自身をロードします。車「7」は、Carl または他の誰かが使用または要求し続ける限り、キャッシュのように CarManager に保存されます。次に、Car が WebSocket を介して、具体的には Carl に送信されます。カールの WS をどこかに保管しました。

たとえば、レニーとカールの 2 人のユーザーが「正確に」同時に車の ID「7」を要求した場合はどうなるでしょうか。CarManager は、どちらの場合も Car 7 のキャッシュされたバージョンを見つけることができないため、データベースから 2 回フェッチしてインスタンス化するか、またはこれら 2 つの WebSocket 要求のいずれかが最初に処理され、次に 2 番目の要求がキャッシュされたバージョンを使用します。バージョン?

WebSocket の非同期処理全体が、私を少し混乱させました。これについての洞察をありがとう!

4

2 に答える 2

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 に答える
0

2 台のサーバーにスケーリングしたとします。怠惰な Car 作成へのアプローチが正しくないという考えが得られるはずです。提供された ID を使用して作成することをユーザーに許可しないでください。または、CarManager の「Car:7:loading」などの外部ミューテックスを使用する必要があります。または、代わりに、CarManager を透過的なプロキシにして、Car を取得するジョブをその上に配置することもできます (そしてそこで同じ同時発生の問題に直面します)。

于 2012-08-12T01:38:12.340 に答える