자라나라 개발머리

[Redis] 분산 락(Distribution Lock) 개념, redlock 사용법 본문

etc.

[Redis] 분산 락(Distribution Lock) 개념, redlock 사용법

iammindy 2024. 6. 23. 17:05

오늘은 분산 락(Distribution Lock)에 대한 내용을 공유하고, redis가 제공하는 redlock을 활용해 실습해보려고 합니다.

 

분산 락(Distribution Lock)

분산 락은 독립된 시스템에서 발생하는 동시성 문제를 해결하기 위해 나온 개념입니다.

동시성 문제란, 여러 프로세스나 스레드가 동시에 같은 데이터에 접근하려 할 때 발생하게 됩니다.

 

예를 들어,

DB에 checkCount라는 클라이언트가 특정 페이지를 조회했다는 의미의 필드가 있고, checkCountUpdate()라는 클라이언트가 조회할 때 마다 DB의 checkCount의 Int값을 ++; 을 해주는 함수 있다고 칩시다.

100명의 클라이언트가 동시에 특정 페이지 접속해서 이 checkCountUpdate()를 실행시킵니다. 기존 checkCount 값이 0이라고 했을 때, 이 함수를 동시에 실행해서 동시에 DB에 업데이트를 해주게되면 100명의 클라이언트가 들어왔지만 checkCount는 1이 되는 것입니다.

 

분산 락은 이러한 동시성 문제를 해결하기 위해, 분산 시스템에서 여러 노드가 동일한 자원에 접근하려 할 때, 하나의 시스템만 자원에 접근할 수 있도록 만든 동기화 메커니즘입니다.

 

분산 락의 기초 개념은 아래와 같습니다!

 

 

락 획득과 해제

1. 락 획득

자원에 접근하기 전에 락을 획득하여 다른 프로세스가 해당 자원에 접근하지 못하도록 합니다.

 

 2. 락 해제

자원에 대한 작업이 끝난 후 락을 해제하여 다른 프로세스가 자원에 접근할 수 있도록 합니다.

 

이렇게 락을 걸어줌으로써 자원에 접근할 때는 하나의 프로세스만 접근할 수 있도록 동기화를 보장해주는 것 입니다.

오늘은, Redis가 제공하는 분산락인 redlock을 활용하여 이 분산락을 구현해보도록 하겠습니다!

 

RedLock 구현

import Client from "ioredis";
import Redlock from "./redlock";

const redis = new Client({ host: "localhost", port:6379});
const redlock = new Redlock([redis]);

 

위와 같이 작성 시, redlock을 사용하기 위한 준비가 끝났습니다.

Redlock 초기화 시, 파라미터를 세팅할 수 있습니다. 자세한 파라미터는 아래 reference 참조 부탁드립니다.

 

await redlock.using(["식별할 string"], 5000, async (signal) => {
  // Do something...
  await something();

  // Make sure any attempted lock extension has not failed.
  if (signal.aborted) {
    throw signal.error;
  }

  // Do something else...
  await somethingElse();
});

 

using()함수를 씀으로써, 해당 객체가 락을 걸고 내부 함수에 있는 내용을 다 실행할 때 까지는 다른 객체는 접근하지 못합니다.

배열엔 식별 string을 적어주면 됩니다.

signal.aborted는 락의 유효기간을 늘렸을 때, 실패했을 시 동작을 처리하는 process를 뜻합니다.

이렇게 구현해주고 난 뒤, 서로 다른 프로세스로 실행시키게 되면, 특정 프로세스가 함수를 처리하는 동안은 다른 프로세스가 기다리는 모습을 볼 수 있습니다.

 

오늘은 이렇게! 분산 락의 개념을 알아보고, redis의 분산 락인 redlock을 통해 분산 락을 구현해보았습니다! DB의 동시성 문제는 개발하면서 높은 확률로 부딪힐 수 있는 문제라고 합니다. 분산 락이라는 개념을 인지하고 있다면, 이러한 동시성 문제를 맞닥뜨렸을 때 슬기롭게 해결할 수 있을 것 입니다. 읽어주셔서 감사합니다😁

 

 

 

reference

https://www.npmjs.com/package/redlock

 

redlock

A node.js redlock implementation for distributed redis locks. Latest version: 5.0.0-beta.2, last published: 2 years ago. Start using redlock in your project by running `npm i redlock`. There are 515 other projects in the npm registry using redlock.

www.npmjs.com