6

私は小さなシナトラアプリを作っています。いくつかの Redis 呼び出しを行い、データを返し、最後に Redis 呼び出しを行って「統計」を保存します。

これまでのところ、(入力に基づいて) リクエストを早期に終了したい場合は、haltを使用できることがわかりました。

# code code
halt send_blank if is_blocked? SETTINGS, host
# code code

最後に、私はこのようなものを持ちたいです:

response.body = JSON.generate(outgoing)
# update user
STATISTICS.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))

クライアントが待つ必要がないように、応答を送信してから5〜ミリ秒のredis書き込みを行うことは可能ですか? 最終統計のredis呼び出しをどこに、どのように配置しても、応答の送信が数ミリ秒遅れます-sinatraをだますことはできません。

これはノードで簡単に実現できますが、やりたいことを書くだけで、応答が送信された後に起動します。私が理解している限りでは、ここのコードは、応答を返す前に約 5 ミリ秒実行をブロックします。

after .. do フィルターを使用してみましたが、response.body のデータ以外のものを渡すことができないことを除いて、それらは正常に機能します。出力されました!この問題は、post("/") の範囲外の変数に代入することで回避できますが、1 秒あたり 100 件以上のリクエストがある場合、ある種の "グローバル" を介してデータを交換すると大きな問題になる可能性があることを理解していただければ幸いです。

それは本当に単純なことのように思えますが、ドキュメントでフィルターを実行した後よりも優れたものを見つけることができません。

redis.hset() プロセスをノンブロッキングにするスレッドまたは何かを作成できますか? それをハードコアにハッキングしているようです。

ありがとう!

4

1 に答える 1

2

redis 書き込みのフォークは機能するはずです。

このようなもの:

response.body = JSON.generate(outgoing)
fork do
    # update user
    redis = Redis.new(:host => "your_host_name", :port => your_port_number)
    redis.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))
end
于 2012-09-08T12:27:45.343 に答える