약 3분

Valkey의 명령어 실행 흐름 이해해보기

Valkey에는 클라이언트에서 받은 메시지를 그대로 되돌려주는 echo 명령(command)이 있다

Valkey에서는 명령어가 어떤 흐름으로 실행되는지 알아보자

Valkey에서의 명령어 실행 흐름

  1. 명령어 수신
    • Valkey 서버는 TCP 커넥션을 통해 클라이언트로부터 명령어를 전달받음
    • 소켓에서 읽어온 데이터를 입력 버퍼에 저장
  1. 명령어 파싱
    • RESP 프로토콜 또는 inline command 형식을 활용해 입력 버퍼의 데이터를 파싱한다
    • 파싱 결과를 client 구조체에 저장한다
*parsed_cmd에 저장된다
    • echo hello! 명령의 경우 다음과 같이 처리된다:
c->argc = 2;
c->argv[0] = "echo";
c->argv[1] = "hello!";
  1. 명령 테이블 lookup
    • command table에서 실행할 명령어에 대한 정보를 찾는다
    • 이때 argv[0]에 있는 "echo"를 key로 활용함
  1. 실행 가능 여부 확인
    • processCommand() 함수에서 해당 명령어를 실행할 수 있는지 확인한다
      • 명령이 실제로 존재하는지, 인자(argument) 수가 맞는지, ...
  1. 명령 실행
    • call() 함수가 호출된다
    • call 함수는 내부적으로 c->cmd->proc(c) 를 실행한다
    • echo 명령의 경우 여기서 echoCommand() 함수가 호출됨
Call() is the core of the server's execution of a command
  1. 응답 생성 및 전송
    • addReplyBulk() 함수처럼 응답 버퍼에 데이터를 쓰는 함수가 호출된다
    • 최종적으로 클라이언트에게 응답이 전송됨

Valkey에 명령어를 추가해보기

기본적으로 제공되는 echo 명령을 복붙.. 해서, 똑같은 동작을 하는 echodoorcs 명령을 만들어보자

명령 로직 자체는 그대로 사용할 것이기 때문에, 세가지만 고쳐 주면 된다:

  1. server.h 헤더에 echodoorcs 함수 선언 추가
  2. server.c 파일에 echodoorcs 함수 구현체 추가
  3. commands.def 파일에 echodoorcs 명령어 메타데이터 추가