1

基本的にリダイレクトであるサービスの設計に関する問題に取り組んでいます。

取得したリクエスト リンクには、いくつかのパラメーター (abc.com/param1=v1¶m2=v2) が含まれます。このリンクで 2 つのタスクを実行する必要があります

  1. リンクをフォーマットし、param1 などの値に応じて、渡されたいくつかのパラメーター (xyz.com/p1=v2) を使用してユーザーを別のドメインにリダイレクトする必要があります。このステップはできるだけ速く行う必要があります。

  2. 何らかの処理を行った後、リンクの詳細を DB に保存する必要があります。

nginx+lua(openresty)+(Redis or Mongodb?) の組み合わせでこれを行う予定です。

2つは無関係なタスクであるため、両方を非同期で実行するために分割する予定です。

リダイレクトの最初のタスクとして、ngx.redirect("/link") が適切なようです。しかし、ドキュメントによると、リダイレクト呼び出しは現在のリクエストの処理を終了します

これら 2 つのタスクを独立させるにはどうすればよいでしょうか。リダイレクトは可能な限り高速に行われ、2 番目のタスクの完了を待つべきではありません。

4

1 に答える 1

0

別のスレッドで保存を行うことはできますか? また、このジョブを別のスレッドに渡すにはどうすればよいですか?

ええ、もちろんできます。まず、lua モジュール ディレクティブの順序を完全に理解する必要があります。次に、Mongodb プロセスを別のスレッドで実行するには、ngx.location.capture($url) を使用して呼び出す必要があります url はロケーション ブロック内の URL です。

location redirect/handling {
   ... // 
   content_by_lua_file url/to/your/code/forRedirectHandling
   ngx.location.capture(mongo/save):

}

location mongo/save {
  content_by_lua_file url/to/mongodbHandlingdCode
}

ngx.location.capture() は 2 番目のロケーション ブロックを指し、別のスレッド (nginx ワーカー) でコードを作成します。

使用するディレクティブについては、openresty のドキュメントを参照してください (access_by_lua、log_by_lua...)

この助けを願っています:)

于 2016-06-20T13:33:17.687 に答える