diff --git a/apps/backend/apps/client/src/submission/submission-pub.service.ts b/apps/backend/apps/client/src/submission/submission-pub.service.ts index f36ce3e642..bf26542b81 100644 --- a/apps/backend/apps/client/src/submission/submission-pub.service.ts +++ b/apps/backend/apps/client/src/submission/submission-pub.service.ts @@ -5,6 +5,9 @@ import { Span, TraceService } from 'nestjs-otel' import { EXCHANGE, JUDGE_MESSAGE_TYPE, + MESSAGE_PRIORITY_HIGH, + MESSAGE_PRIORITY_LOW, + MESSAGE_PRIORITY_MIDDLE, RUN_MESSAGE_TYPE, SUBMISSION_KEY, USER_TESTCASE_MESSAGE_TYPE @@ -78,12 +81,52 @@ export class SubmissionPublicationService { await this.amqpConnection.publish(EXCHANGE, SUBMISSION_KEY, judgeRequest, { messageId: String(submission.id), persistent: true, - type: isTest - ? RUN_MESSAGE_TYPE - : isUserTest - ? USER_TESTCASE_MESSAGE_TYPE - : JUDGE_MESSAGE_TYPE + type: this.calculateMessageType(isTest, isUserTest), + priority: this.calculateMessagePriority(isTest, isUserTest) }) span.end() } + + /** + * 채점 요청 메세지의 타입을 계산하여 반환 + * + * - RUN_MESSAGE_TYPE: 오픈 테스트 케이스 실행 + * - USER_TESTCASE_MESSAGE_TYPE: 사용자 정의 테스트 케이스 실행 + * - JUDGE_MESSAGE_TYPE: 제출 + * + * @param isTest - 테스트 제출 여부 + * @param isUserTest - 사용자 정의 테스트 케이스 제출 여부 + */ + private calculateMessageType(isTest: boolean, isUserTest: boolean) { + if (isTest) return RUN_MESSAGE_TYPE + if (isUserTest) return USER_TESTCASE_MESSAGE_TYPE + return JUDGE_MESSAGE_TYPE + } + + /** + * 채점 요청 메세지의 우선순위를 계산하여 반환 + * + * 우선순위 (0 ~ 3, 클 수록 우선순위 높음) + * + * - JUDGE_MESSAGE_TYPE: 3 + * - RUN_MESSAGE_TYPE: 2 + * - USER_TESTCASE_MESSAGE_TYPE: 2 + * - DEFAULT: 1 + * + * @param isTest - 테스트 제출 여부 + * @param isUserTest - 사용자 정의 테스트 케이스 제출 여부 + */ + private calculateMessagePriority(isTest: boolean, isUserTest: boolean) { + const msgType = this.calculateMessageType(isTest, isUserTest) + + switch (msgType) { + case JUDGE_MESSAGE_TYPE: + return MESSAGE_PRIORITY_HIGH + case RUN_MESSAGE_TYPE: + case USER_TESTCASE_MESSAGE_TYPE: + return MESSAGE_PRIORITY_MIDDLE + default: + return MESSAGE_PRIORITY_LOW + } + } } diff --git a/apps/backend/apps/client/src/submission/test/submission-pub.service.spec.ts b/apps/backend/apps/client/src/submission/test/submission-pub.service.spec.ts index 943f611c3e..471e0b6482 100644 --- a/apps/backend/apps/client/src/submission/test/submission-pub.service.spec.ts +++ b/apps/backend/apps/client/src/submission/test/submission-pub.service.spec.ts @@ -7,6 +7,8 @@ import * as sinon from 'sinon' import { EXCHANGE, JUDGE_MESSAGE_TYPE, + MESSAGE_PRIORITY_HIGH, + MESSAGE_PRIORITY_MIDDLE, RUN_MESSAGE_TYPE, SUBMISSION_KEY } from '@libs/constants' @@ -103,7 +105,8 @@ describe('SubmissionPublicationService', () => { amqpSpy.calledOnceWith(EXCHANGE, SUBMISSION_KEY, judgeRequest, { messageId: String(submission.id), persistent: true, - type: JUDGE_MESSAGE_TYPE + type: JUDGE_MESSAGE_TYPE, + priority: MESSAGE_PRIORITY_HIGH }) ).to.be.true }) @@ -143,7 +146,8 @@ describe('SubmissionPublicationService', () => { amqpSpy.calledOnceWith(EXCHANGE, SUBMISSION_KEY, judgeRequest, { messageId: String(submission.id), persistent: true, - type: RUN_MESSAGE_TYPE + type: RUN_MESSAGE_TYPE, + priority: MESSAGE_PRIORITY_MIDDLE }) ).to.be.true }) diff --git a/apps/backend/libs/constants/src/rabbitmq.constants.ts b/apps/backend/libs/constants/src/rabbitmq.constants.ts index 671f68d23f..0f5b584a15 100644 --- a/apps/backend/libs/constants/src/rabbitmq.constants.ts +++ b/apps/backend/libs/constants/src/rabbitmq.constants.ts @@ -13,3 +13,10 @@ export const ORIGIN_HANDLER_NAME = 'codedang-handler' export const JUDGE_MESSAGE_TYPE = 'judge' export const RUN_MESSAGE_TYPE = 'run' export const USER_TESTCASE_MESSAGE_TYPE = 'userTestCase' + +/** + * 채점 요청 메세지 우선순위 + */ +export const MESSAGE_PRIORITY_HIGH = 3 +export const MESSAGE_PRIORITY_MIDDLE = 2 +export const MESSAGE_PRIORITY_LOW = 1 diff --git a/apps/infra/production/codedang/message_queue.tf b/apps/infra/production/codedang/message_queue.tf index ccde86bbf6..a04b1495fd 100644 --- a/apps/infra/production/codedang/message_queue.tf +++ b/apps/infra/production/codedang/message_queue.tf @@ -37,7 +37,8 @@ resource "rabbitmq_queue" "submission_queue" { vhost = rabbitmq_permissions.vh_perm.vhost settings { - durable = true + durable = true + arguments_json = var.rabbitmq_arguments } } diff --git a/apps/infra/production/codedang/variables.tf b/apps/infra/production/codedang/variables.tf index 24c7e3799c..122b5fe73e 100644 --- a/apps/infra/production/codedang/variables.tf +++ b/apps/infra/production/codedang/variables.tf @@ -9,6 +9,14 @@ variable "rabbitmq_port" { sensitive = true } +variable "rabbitmq_arguments" { + default = <