Difference between revisions of "Нотификации во внешние системы"

From EjudgeWiki
(Created page with "Навигация: Главная страница/Система ejudge/Использование/Нотификации во внешние сис...")
 
(...)
Line 1: Line 1:
 
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Нотификации во внешние системы]]
 
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Нотификации во внешние системы]]
 +
 +
Поддерживается с версии [[Изменения в версии 3.10.4|3.10.4]].
 +
 +
Механизм нотификаций об изменении состояния посылки позволяет
 +
избавиться от периодического опроса состояния посылки. После
 +
выполнения запроса [[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> &mdash; задает идентификатор драйвера очереди сообщений на стороне ejudge, который будет использоваться для отправки сообщений.
 +
* <code>notify_kind</code> &mdash; это тип идентификатора очереди сообщений.
 +
* <code>notify_queue</code> &mdash; это идентификатор очереди сообщений.
 +
 +
В настоящее время 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>&lt;</code>, <code>&gt;</code>, <code>&amp;</code>.
 +
* <code>u64</code> - 64-битное беззнаковое целое число в десятичной записи. Старшие 8 байт значения обнуляются.
 +
* <code>uuid</code> - 128-битное значение в формате UUID
 +
* <code>ulid</code> - 128-битное значение в формате ULID
 +
 +
Примеры (URL-encoded):
 +
 +
notify_driver=1&notify_kind=str&notify_queue=ExternalQueue
 +
notify_driver=1&notify_kind=u64&notify_queue=2737281
 +
notify_driver=1&notify_kind=uuid&notify_queue=d9ab67dc-3398-4a62-bcac-fb2becd09cc8
 +
notify_driver=1&notify_kind=ulid&notify_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
 +
  }
 +
}

Revision as of 00:05, 20 July 2023

Навигация: Главная страница/Система ejudge/Использование/Нотификации во внешние системы

Поддерживается с версии 3.10.4.

Механизм нотификаций об изменении состояния посылки позволяет избавиться от периодического опроса состояния посылки. После выполнения запроса 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-битное значение в формате UUID
  • ulid - 128-битное значение в формате ULID

Примеры (URL-encoded):

notify_driver=1&notify_kind=str&notify_queue=ExternalQueue
notify_driver=1&notify_kind=u64&notify_queue=2737281
notify_driver=1&notify_kind=uuid&notify_queue=d9ab67dc-3398-4a62-bcac-fb2becd09cc8
notify_driver=1&notify_kind=ulid&notify_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
  }
}