Я сделал довольно простой веб-сервис вроде этого:
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-клиента завершил отправку данных в другую реплику той же веб-службы.
Когда я запустил простой стресс-тест для метода / Upload в одну реплику после нескольких успешных запросов, я получил исключение клиента тайм-аута чтения. На 1000 успешных запросов я получил одно исключение тайм-аута чтения. После некоторой отладки я понял, что иногда обратный вызов 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
Теперь onSuccessCallback
всегда вызывается, и тайм-аут чтения пропал.
Вопрос: «Почему?»
self.request
? - person Amber   schedule 21.01.2013