Оригинал на GitHub
Вопрос
При выполнении запросов на REMOTES периодически встречаем пропуски в нумерации id, которые, казалось бы, должны идти последовательно. Мне надо понять почему записей нет. Например, в моем случае в тотуме нет id 5167,5163. То есть записи отправлены, но не получены
Нужно понять как отловить такие ошибки
Логируется ли это где-то
Есть ли какое-либо особое сообщение о ошибке или это тоже 200 ОК и не отслеживается?
Ответ
Чаще всего такой эффект может быть в случае, когда приходит несколько одновременных запросов, и они пишутся в одну таблицу. У таблиц по умолчанию стоит перезапуск транзакций при ошибке одновременного доступа — при запросе ремоута возможно 5 перезапусков, потом он выдаст 200 с содержимым error или в (некоторых случаях) текстом ошибки.
Так как id
тотума резервируется при начале первой попытки, то он получается пропущен.
Если ремоут завершился успешно, и у вас стоит тип ответа success/error
то при успешном завершении будет 200
+ success
.
В случае, когда вы из внешней системы идет постоянная запись в одни таблицу в Totum:
надо исключить в этой таблице Коды действия при добавлении и обрабатывать записанные строки асинхронно через простановку галочек кроном или daemons.
для этой таблицы записи поставить параметр "Актуальность" в значение ! Без отслеживания изменений. В этом случае код-действия remotes не будет проверять действия других пользователей в таблице.
Используйте tryCatch в коде ремоута:
=catch: "remote_code_action_here"
catch: insert(table: 'table_for_errors'; field: 'data_field_for_error' = $#exception)
Если вам нужно вернуть заголовки, то надо подключаться напрямую к remotes: HOST/Remotes/remote_name.
В этом случае используется remotes_user от которого будет выполнен ремоут, а авторизация передается либо в теле запроса, либо в заголовке. Прочитать заголовки в коде ремоута можно из переменной $#headers.
В этом случае работает тип ответа, заданный в поле return в строке ремоута в таблице ремоутов.
Если вы там поставите в remotes вариант ответа headers + body, то тогда сможете сформировать нужные вам заголовки:
=catch: json`{"headers":$headers_ok,"body":$body_ok}`
headers_ok: $#lc
body_ok: "code_action_here"
catch: json`{"headers":$headers_err,"body":$body_err}`
headers_err: json`["HTTP/1.0 500 Some custom error"]`
body_err: $#exception
Таким образом, мы можем отдавать стороннему сервису нужные ему коды ошибок.