Почему мой сервер порождает два потока в ответ на один POST Http? - PullRequest
0 голосов
/ 12 мая 2019

итак ... кому нравится детективная работа, льющаяся за запись журнала ???Вот один из тех, кто работает с нами!

Один из наших пользователей заявляет, что он обнаружил страницу с ошибкой во время викторины на нашем сайте.Ниже я прилагаю некоторый текст из журналов нашего сервера, относящихся к моменту, когда они сообщили.

Я думаю, что третий столбец (8 или 9) относится к потоку на сервере.Таким образом, в 07:36:31 пользователь готовит для него ответ в формате HTML через серию вызовов функций в ответ на запрос пользователя POST (отвечая на предыдущий вопрос викторины).

Но после второго POST от пользователя в 07:36:44 по какой-то причине сервер, по-видимому, создал два потока, работающих параллельно, в ответ на то, что я предполагаю, что это один запрос POST.

Вы можете увидеть ошибку в конце и ее причину.Для первого потока (8) запись была сохранена в базе данных.Когда второй поток достигает этой точки спустя миллисекунды, мы получаем ошибку целостности, потому что запись с этим ключом уже существует (благодаря потоку 8).

У меня никогда не было этой проблемы раньше.Любые идеи относительно ПОЧЕМУ вдруг наш сервер решил внезапно создать два потока, что привело к неожиданному состоянию гонки ??

Мой технологический стек: * Сервер Heroku * Веб-фреймворк Python Django

07:36:31 : 95.XX.67.113      https:POST   status:200  "/en/main/"
..<snip>..
07:36:31 : wrappers       9  INFO   : User Aysegul: starting main.views.quiz_class.ask_quiz_question    
07:36:31 : wrappers       9  INFO   : User Aysegul: starting grammar.views.assess.run_quiz
07:36:31 : wrappers       9  INFO   : User Aysegul: starting main.views.quiz_class.get_next_scheduled_q
07:36:31 : wrappers       9  INFO   : User Aysegul: starting main.views.quiz_class.ask_quiz_question
07:36:44 : 95.XX.67.113      https:POST   status:200  "/en/main/"
07:36:44 : wrappers       8  INFO   : User Aysegul: starting main.views.main.switchboard
07:36:44 : wrappers       9  INFO   : User Aysegul: starting main.views.main.switchboard
07:36:44 : wrappers       8  INFO   : User Aysegul: starting main.views.main.load_session_data
07:36:44 : wrappers       9  INFO   : User Aysegul: starting main.views.main.load_session_data
07:36:44 : user_profile   8  DEBUG  : Model UserProfile Instance saved:[<User: Aysegul>]
07:36:44 : main           8  DEBUG  : Aysegul switchboard - returning control back to run_quiz
07:36:44 : wrappers       8  INFO   : User Aysegul: starting grammar.views.assess.run_quiz
07:36:44 : user_profile   9  DEBUG  : Model UserProfile Instance saved:[<User: Aysegul>]
07:36:44 : main           9  DEBUG  : Aysegul switchboard - returning control back to run_quiz
07:36:44 : wrappers       9  INFO   : User Aysegul: starting grammar.views.assess.run_quiz
07:36:44 : wrappers       8  INFO   : User Aysegul: starting main.views.quiz_class.record_answer
07:36:44 : wrappers       9  INFO   : User Aysegul: starting main.views.quiz_class.record_answer
07:36:44 : wrappers       8  INFO   : User Aysegul: starting main.views.quiz_class.question_feedback
07:36:44 : log            9  ERROR  : Internal Server Error: /en/main/
07:36:44 : Traceback (most recent call last):
07:36:44 :   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
07:36:44 :     return self.cursor.execute(sql, params)
07:36:44 : psycopg2.IntegrityError: duplicate key value violates unique constraint "grammar_entry_question_id_text_d90c1
7cd_uniq"
07:36:44 : DETAIL:  Key (question_id, text)=(1385, Üç günden beri hasta oluyor) already exists.

PS Интересно, что эта проблема также произошла с комбинацией heroku / django ... Один запрос Heroku порождает два ответа, которые приводят к сбою моего приложения

1 Ответ

0 голосов
/ 14 мая 2019

Читая вокруг, я думаю, что ответ таков:

Маршрутизатор Heroku может иногда работать со сбоями и порождать два потока ответов для одного полученного запроса.Это прискорбно, но, к счастью, редко.

Потенциальное решение может состоять в том, чтобы ваш бэкэнд-код проверял, выполняется ли поток запросов для пользователя (например, путем записи метки времени в базу данных или общего универсального кэша).).Если запущен другой поток, последний может выйти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...