0

私は次のような非常に単純な Web サービスを実行しました。

class UploadResource(Resource):

    def onSuccess(self, result):
        self.request.write("OK")

    def onError(self, result):
        self.request.write("Error")

    def render_POST(self, request):
        request.data.save_to_disk()
        d = request.mirror("http://mirror_replica/Upload")
        d.addCallbacks(self.onSuccess, self.onError)
        return server.NOT_DONE_YET

メソッドrequest.mirror()は、http クライアント リクエストが完了した後にコールバックを起動した deferred を返し、同じ Web サービスの別のレプリカにデータを送信します

いくつかのリクエストが成功した後、1 つのレプリカに対して /Upload メソッドの簡単なストレス テストを実行したところ、読み取りタイムアウト クライアント例外が発生しました。1000 件の成功したリクエストに対して、1 つの読み取りタイムアウト例外が発生しました。いくつかのデバッグの後、onSuccess コールバックが呼び出されず、読み取りタイムアウトが高負荷によって引き起こされたものではないことがあることがわかりました。

そこで、クラス コードを次のように書き直しました。

class UploadResource(Resource):

    def render_POST(self, request):
        request.data.save_to_disk()
        d = request.mirror("http://mirror_replica/Upload")

        def onSuccess(result):
            request.write("OK")

        def onError(self, result):
            request.write("Error")

        d.addCallbacks(onSuccess, onError)
        return server.NOT_DONE_YET

NowonSuccessCallbackは常に呼び出され、読み取りタイムアウトはなくなりました。

問題は「なぜ?」

4

1 に答える 1

1

あなたDeferredが呼び出されていない場合、誰かがそれを呼び出すことができません。これはバグである可能性があります。または、単にリクエストに時間がかかっている可能性があります。メソッドのコードを見なければ、mirror推測することすら不可能です。完全で実行可能な例を作成できれば、問題の診断に大いに役立ちます。

于 2013-01-21T18:57:08.037 に答える