Difference between revisions of "Нотификации во внешние системы"
(Created page with "Навигация: Главная страница/Система ejudge/Использование/Нотификации во внешние сис...") |
(...) |
||
| (One intermediate revision by the same user not shown) | |||
| Line 1: | Line 1: | ||
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Нотификации во внешние системы]] | Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Нотификации во внешние системы]] | ||
| + | |||
| + | Поддерживается с версии [[Изменения в версии 3.11.0|3.11.0]]. | ||
| + | |||
| + | Механизм нотификаций об изменении состояния посылки позволяет | ||
| + | избавиться от периодического опроса состояния посылки. После | ||
| + | выполнения запроса [[API:priv:submit-run]] или [[API:priv:submit-run-input]] | ||
| + | внешняя система, которая использует API ejudge для проверки задач, | ||
| + | должна была периодически проверять состояние отправленной посылки | ||
| + | с помощью запросов <code>run-status-json</code> или <code>get-submit</code>, | ||
| + | чтобы дождаться завершения проверки и отобразить результат проверки | ||
| + | своему пользователю. Это увеличивает время от отправки конечным пользователем | ||
| + | решения на проверку до получения им ответа и увеличивает нагрузку на | ||
| + | саму тестирующую систему ejudge. | ||
| + | |||
| + | Вместо этого при отправке в ejudge решения на проверку можно задать | ||
| + | информацию об очереди сообщений, в которую будут отправляться сообщения | ||
| + | об изменении состояния посылок. Сообщение содержит много информации | ||
| + | о посылке, поэтому внешней системе может не потребоваться | ||
| + | выполнять запросы <code>run-status-json</code> или <code>get-submit</code> | ||
| + | для обновления состояния посылок на своей стороне. | ||
| + | |||
| + | === Отправка на проверку === | ||
| + | |||
| + | Для использования нотификаций об изменении состояния посылок | ||
| + | в запросах [[API:priv:submit-run]] или [[API:priv:submit-run-input]] | ||
| + | необходимо дополнительно передать три параметра: | ||
| + | * <code>notify_driver</code> — задает идентификатор драйвера очереди сообщений на стороне ejudge, который будет использоваться для отправки сообщений. | ||
| + | * <code>notify_kind</code> — это тип идентификатора очереди сообщений. | ||
| + | * <code>notify_queue</code> — это идентификатор очереди сообщений. | ||
| + | |||
| + | В настоящее время ejudge поддерживает redis в качестве брокера очередей | ||
| + | сообщений, идентификатор драйвера redis равен <code>1</code>. | ||
| + | Если требуется создание очереди сообщений, это должна сделать внешняя | ||
| + | система заблаговременно. | ||
| + | |||
| + | Для хранения идентификатора очереди сообщений в базе посылок отводится | ||
| + | 128 бит (16 байт) во внутреннем представлении. Перевод | ||
| + | идентификатора очереди сообщений из строкового (внешнего) | ||
| + | представления во внутреннее возможен одним из 4 способов, | ||
| + | который задается в параметре <code>notify_kind</code>. | ||
| + | |||
| + | * <code>str</code> - строка длиной до 16 символов включительно. В строке допускаются только символы с кодами 32-126 (десятичное), кроме символов требующих специального кодирования в форматах XML и JSON: <code>'</code>, <code>"</code>, <code>\</code>, <code><</code>, <code>></code>, <code>&</code>. | ||
| + | * <code>u64</code> - 64-битное беззнаковое целое число в десятичной записи. Старшие 8 байт значения обнуляются. | ||
| + | * <code>uuid</code> - 128-битное значение в формате UUID | ||
| + | * <code>ulid</code> - 128-битное значение в формате ULID | ||
| + | |||
| + | Примеры (URL-encoded): | ||
| + | |||
| + | notify_driver=1¬ify_kind=str¬ify_queue=ExternalQueue | ||
| + | notify_driver=1¬ify_kind=u64¬ify_queue=2737281 | ||
| + | notify_driver=1¬ify_kind=uuid¬ify_queue=d9ab67dc-3398-4a62-bcac-fb2becd09cc8 | ||
| + | notify_driver=1¬ify_kind=ulid¬ify_queue=01H448PDFDAY1ZMD3BAFSDT9FH | ||
| + | |||
| + | === Сообщение об изменении статуса посылки === | ||
| + | |||
| + | После отправки посылки на проверку с помощью [[API:priv:submit-run]] | ||
| + | с указанием параметров нотификации в указанную очередь сообщений | ||
| + | при изменении состояния посылки будут отправляться сообщения следующего вида | ||
| + | в формате JSON: | ||
| + | |||
| + | { | ||
| + | "server_time_us" : SERVER-TIME-WITH-MICROSEC-PRECISION, | ||
| + | "type" : "run", | ||
| + | "run" : { | ||
| + | "run_id" : RUN-ID, | ||
| + | "run_uuid" : RUN-UUID, | ||
| + | "contest_id" : CONTEST-ID, | ||
| + | "serial_id" : SERIAL-ID, | ||
| + | "status" : STATUS, | ||
| + | "status_str" : STATUS-SHORT-STR, | ||
| + | "status_desc" : STATUS-DESCRIPTION, | ||
| + | "run_time" : RUN-SUBMIT-TIME-SEC, | ||
| + | "nsec" : NSEC-PART-OF-RUN-SUBMIT-TIME, | ||
| + | "run_time_us" : RUN-SUMBIT-TIME-WITH-MICROSEC-PRECISON, | ||
| + | "user_id" : USER-ID, | ||
| + | "user_login" : USER-LOGIN, | ||
| + | "user_name" : USER-NAME, | ||
| + | "ext_user_kind" : EXT-USER-KIND, | ||
| + | "ext_user" : EXT-USER, | ||
| + | "notify_driver" : NOTIFY-DRIVER, | ||
| + | "notify_kind" : NOTIFY-KIND, | ||
| + | "notify_queue" : NOTIFY-QUEUE, | ||
| + | "prob_id" : PROBLEM-ID, | ||
| + | "prob_name" : PROBLEM-SHORT-NAME, | ||
| + | "prob_internal_name" : PROBLEM-INTERNAL-NAME, | ||
| + | "prob_uuid" : PROBLEM-UUID, | ||
| + | "raw_variant" : VARIANT-STORED-IN-DB, | ||
| + | "variant" : ACTUAL-VARIANT, | ||
| + | "lang_id" : LANGUAGE-ID, | ||
| + | "lang_name" : LANGUAGE-NAME, | ||
| + | "size" : SOURCE-CODE-SIZE, | ||
| + | "ipv6_flag" : IPV6-FLAG, | ||
| + | "ip" : IP-ADDRESS, | ||
| + | "ssl_flag" : SSL-FLAG, | ||
| + | "sha256" : SOURCE-CODE-SHA256, | ||
| + | "sha1" : SOURCE-CODE-SHA1, | ||
| + | "locale_id" : LOCALE-ID, | ||
| + | "eoln_type" : EOLN-TYPE, | ||
| + | "mime_type" : MIME-TYPE, | ||
| + | "store_flags" : STORE-FLAGS, | ||
| + | "is_imported" : IS-IMPORTED, | ||
| + | "is_hidden" : IS-HIDDEN, | ||
| + | "is_readonly" : IS-READONLY, | ||
| + | "passed_mode" : PASSED-MODE, | ||
| + | "raw_score" : SCORE-STORED-IN-DB, | ||
| + | "raw_test" : TEST-STORED-IN-DB, | ||
| + | "is_marked" : IS-MARKED, | ||
| + | "score_adj" : SCORE-ADJUSTMENT, | ||
| + | "judge_uuid" : JUDGE-UUID, | ||
| + | "judge_id" : JUDGE-ID, | ||
| + | "pages" : PAGES, | ||
| + | "token_flags" : TOKEN-FLAGS, | ||
| + | "token_count" : TOKEN-COUNT, | ||
| + | "is_saved" : IS-SAVED, | ||
| + | "saved_status" : SAVED-STATUS, | ||
| + | "saved_status_str" : SAVED-STATUS-SHORT-STR, | ||
| + | "saved_score" : SAVED-SCORE, | ||
| + | "saved_test" : SAVED-TEST, | ||
| + | "is_checked" : IS-CHECKED, | ||
| + | "is_vcs" : IS-VCS, | ||
| + | "verdict_bits" : VERDICT-BITS, | ||
| + | "last_change_us" : LAST-CHANGE-TIME-WITH-MICROSECOND-PRECISION | ||
| + | } | ||
| + | } | ||
| + | |||
| + | === Сообщение об изменении статуса посылки с пользовательскими данными === | ||
| + | |||
| + | После отправки посылки на проверку с помощью [[API:priv:submit-run-input]] | ||
| + | с указанием параметров нотификации в указанную очередь сообщений | ||
| + | при изменении состояния посылки будут отправляться сообщения следующего вида | ||
| + | в формате JSON: | ||
| + | |||
| + | { | ||
| + | "server_time_us" : SERVER-TIME-WITH-MICROSEC-PRECISION, | ||
| + | "type" : "submit", | ||
| + | "submit" : { | ||
| + | "submit_id" : ID, | ||
| + | "user_id" : USER-ID, | ||
| + | "prob_id" : PROB-ID, | ||
| + | "lang_id" : LANG-ID, | ||
| + | "ext_user_kind" : EXT-USER-KIND, | ||
| + | "ext_user" : EXT-USER, | ||
| + | "notify_driver" : NOTIFY-DRIVER, | ||
| + | "notify_kind" : NOTIFY-KIND, | ||
| + | "notify_queue" : NOTIFY-QUEUE, | ||
| + | "status" : STATUS, | ||
| + | "status_str" : STATUS-SHORT-STR, | ||
| + | "compiler_output" : COMPILER-MESSAGES, | ||
| + | "test_checker_output" : TEST-CHECKER-MESSAGES, | ||
| + | "time" : CPU-TIME, | ||
| + | "real_time" : REAL-TIME, | ||
| + | "exit_code" : PROCESS-EXIT-CODE, | ||
| + | "term_signal" : TERMINATION-SIGNAL, | ||
| + | "max_memory_used" : VIRT-MEM-USE, | ||
| + | "max_rss" : MEMORY-USE, | ||
| + | "input" : INPUT, | ||
| + | "output" : OUTPUT-TEXT, | ||
| + | "error" : ERROR-TEXT | ||
| + | } | ||
| + | } | ||
Latest revision as of 05:33, 1 August 2023
Навигация: Главная страница/Система ejudge/Использование/Нотификации во внешние системы
Поддерживается с версии 3.11.0.
Механизм нотификаций об изменении состояния посылки позволяет
избавиться от периодического опроса состояния посылки. После
выполнения запроса API:priv:submit-run или API:priv:submit-run-input
внешняя система, которая использует API ejudge для проверки задач,
должна была периодически проверять состояние отправленной посылки
с помощью запросов run-status-json или get-submit,
чтобы дождаться завершения проверки и отобразить результат проверки
своему пользователю. Это увеличивает время от отправки конечным пользователем
решения на проверку до получения им ответа и увеличивает нагрузку на
саму тестирующую систему ejudge.
Вместо этого при отправке в ejudge решения на проверку можно задать
информацию об очереди сообщений, в которую будут отправляться сообщения
об изменении состояния посылок. Сообщение содержит много информации
о посылке, поэтому внешней системе может не потребоваться
выполнять запросы run-status-json или get-submit
для обновления состояния посылок на своей стороне.
Отправка на проверку
Для использования нотификаций об изменении состояния посылок в запросах API:priv:submit-run или API:priv:submit-run-input необходимо дополнительно передать три параметра:
notify_driver— задает идентификатор драйвера очереди сообщений на стороне ejudge, который будет использоваться для отправки сообщений.notify_kind— это тип идентификатора очереди сообщений.notify_queue— это идентификатор очереди сообщений.
В настоящее время ejudge поддерживает redis в качестве брокера очередей
сообщений, идентификатор драйвера redis равен 1.
Если требуется создание очереди сообщений, это должна сделать внешняя
система заблаговременно.
Для хранения идентификатора очереди сообщений в базе посылок отводится
128 бит (16 байт) во внутреннем представлении. Перевод
идентификатора очереди сообщений из строкового (внешнего)
представления во внутреннее возможен одним из 4 способов,
который задается в параметре notify_kind.
str- строка длиной до 16 символов включительно. В строке допускаются только символы с кодами 32-126 (десятичное), кроме символов требующих специального кодирования в форматах XML и JSON:',",\,<,>,&.u64- 64-битное беззнаковое целое число в десятичной записи. Старшие 8 байт значения обнуляются.uuid- 128-битное значение в формате UUIDulid- 128-битное значение в формате ULID
Примеры (URL-encoded):
notify_driver=1¬ify_kind=str¬ify_queue=ExternalQueue notify_driver=1¬ify_kind=u64¬ify_queue=2737281 notify_driver=1¬ify_kind=uuid¬ify_queue=d9ab67dc-3398-4a62-bcac-fb2becd09cc8 notify_driver=1¬ify_kind=ulid¬ify_queue=01H448PDFDAY1ZMD3BAFSDT9FH
Сообщение об изменении статуса посылки
После отправки посылки на проверку с помощью API:priv:submit-run с указанием параметров нотификации в указанную очередь сообщений при изменении состояния посылки будут отправляться сообщения следующего вида в формате JSON:
{
"server_time_us" : SERVER-TIME-WITH-MICROSEC-PRECISION,
"type" : "run",
"run" : {
"run_id" : RUN-ID,
"run_uuid" : RUN-UUID,
"contest_id" : CONTEST-ID,
"serial_id" : SERIAL-ID,
"status" : STATUS,
"status_str" : STATUS-SHORT-STR,
"status_desc" : STATUS-DESCRIPTION,
"run_time" : RUN-SUBMIT-TIME-SEC,
"nsec" : NSEC-PART-OF-RUN-SUBMIT-TIME,
"run_time_us" : RUN-SUMBIT-TIME-WITH-MICROSEC-PRECISON,
"user_id" : USER-ID,
"user_login" : USER-LOGIN,
"user_name" : USER-NAME,
"ext_user_kind" : EXT-USER-KIND,
"ext_user" : EXT-USER,
"notify_driver" : NOTIFY-DRIVER,
"notify_kind" : NOTIFY-KIND,
"notify_queue" : NOTIFY-QUEUE,
"prob_id" : PROBLEM-ID,
"prob_name" : PROBLEM-SHORT-NAME,
"prob_internal_name" : PROBLEM-INTERNAL-NAME,
"prob_uuid" : PROBLEM-UUID,
"raw_variant" : VARIANT-STORED-IN-DB,
"variant" : ACTUAL-VARIANT,
"lang_id" : LANGUAGE-ID,
"lang_name" : LANGUAGE-NAME,
"size" : SOURCE-CODE-SIZE,
"ipv6_flag" : IPV6-FLAG,
"ip" : IP-ADDRESS,
"ssl_flag" : SSL-FLAG,
"sha256" : SOURCE-CODE-SHA256,
"sha1" : SOURCE-CODE-SHA1,
"locale_id" : LOCALE-ID,
"eoln_type" : EOLN-TYPE,
"mime_type" : MIME-TYPE,
"store_flags" : STORE-FLAGS,
"is_imported" : IS-IMPORTED,
"is_hidden" : IS-HIDDEN,
"is_readonly" : IS-READONLY,
"passed_mode" : PASSED-MODE,
"raw_score" : SCORE-STORED-IN-DB,
"raw_test" : TEST-STORED-IN-DB,
"is_marked" : IS-MARKED,
"score_adj" : SCORE-ADJUSTMENT,
"judge_uuid" : JUDGE-UUID,
"judge_id" : JUDGE-ID,
"pages" : PAGES,
"token_flags" : TOKEN-FLAGS,
"token_count" : TOKEN-COUNT,
"is_saved" : IS-SAVED,
"saved_status" : SAVED-STATUS,
"saved_status_str" : SAVED-STATUS-SHORT-STR,
"saved_score" : SAVED-SCORE,
"saved_test" : SAVED-TEST,
"is_checked" : IS-CHECKED,
"is_vcs" : IS-VCS,
"verdict_bits" : VERDICT-BITS,
"last_change_us" : LAST-CHANGE-TIME-WITH-MICROSECOND-PRECISION
}
}
Сообщение об изменении статуса посылки с пользовательскими данными
После отправки посылки на проверку с помощью API:priv:submit-run-input с указанием параметров нотификации в указанную очередь сообщений при изменении состояния посылки будут отправляться сообщения следующего вида в формате JSON:
{
"server_time_us" : SERVER-TIME-WITH-MICROSEC-PRECISION,
"type" : "submit",
"submit" : {
"submit_id" : ID,
"user_id" : USER-ID,
"prob_id" : PROB-ID,
"lang_id" : LANG-ID,
"ext_user_kind" : EXT-USER-KIND,
"ext_user" : EXT-USER,
"notify_driver" : NOTIFY-DRIVER,
"notify_kind" : NOTIFY-KIND,
"notify_queue" : NOTIFY-QUEUE,
"status" : STATUS,
"status_str" : STATUS-SHORT-STR,
"compiler_output" : COMPILER-MESSAGES,
"test_checker_output" : TEST-CHECKER-MESSAGES,
"time" : CPU-TIME,
"real_time" : REAL-TIME,
"exit_code" : PROCESS-EXIT-CODE,
"term_signal" : TERMINATION-SIGNAL,
"max_memory_used" : VIRT-MEM-USE,
"max_rss" : MEMORY-USE,
"input" : INPUT,
"output" : OUTPUT-TEXT,
"error" : ERROR-TEXT
}
}