私は次のような非常に単純な 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
は常に呼び出され、読み取りタイムアウトはなくなりました。
問題は「なぜ?」