๐Ÿ” ์ƒํ’ˆ ํˆฌ์žํ•˜๊ธฐ ์„œ๋น„์Šค Lock๊ธฐ๋ฒ• ๊ฐœ์„ ์•ˆ

DB๊ด€๋ จ ๊ณต๋ถ€ ์ •๋ฆฌ โ—€

ํˆฌ์ž ์„œ๋น„์Šค์—์„œ ์–ด๋–ค ์ด์Šˆ๊ฐ€ ์žˆ๋Š”๊ฐ€?

    1. ํˆฌ์ž์ž ํˆฌ์ž์‹คํ–‰ ์‹œ ์ˆœ์„œ๋ณด์žฅX
    1. Lockํ•ด์ œ์™€ ์ •ํ•ฉ์„ฑ ์ด์Šˆ

์ƒํ’ˆ ํˆฌ์ž ์„œ๋น„์Šค ๊ตฌ์„ฑ

ํ—ฌ๋กœ์˜ ํˆฌ์ž ์„œ๋น„์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํŠน์ • scf / ์ฃผํƒ๋‹ด๋ณด๋Œ€์ถœ ์ƒํ’ˆ์— ๋Œ€ํ•ด ํˆฌ์ž์ž๋ฅผ ๋ชจ์ง‘ํ•œ๋‹ค.
  • ํˆฌ์ž์ž๋“ค์€ ํŠน์ •์‹œ๊ฐ„์— open๋˜๋Š” ์ƒํ’ˆ์— ์ผ๊ด„์ ์œผ๋กœ ํˆฌ์ž์‹ ์ฒญ์„ํ•œ๋‹ค.
    1. ์ด๋•Œ, ๊ฐ ํšŒ์›๋ณ„๋กœ "ํˆฌ์ž ์‹ ์ฒญ ๊ธฐ๋ก"์„ ์ง„ํ–‰ํ•œ๋‹ค.
    2. ํˆฌ์ž์‹ ์ฒญ ๊ธฐ๋ก์ด๋ž€, P2PCenter(๊ธˆ์œต๊ฒฐ์ œ์›) API๋ฅผ ํ†ตํ•ด ์œ ํšจ์„ฑ(ํˆฌ์ž๊ธฐ๋ก / ํˆฌ์žํ•œ๋„)์„ ์กฐํšŒํ•˜์—ฌ ํˆฌ์ž์ ํ•ฉ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ณ  ๊ธฐ๋กํ•˜๋Š”๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ํšŒ์›๋ณ„ ๊ฒ€์ฆ ๋ฐ ํˆฌ์ž๊ธˆ ๊ณ„์‚ฐ์„ ๋งˆ์น˜๋ฉด ์ •์ƒ ํˆฌ์ž๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

์ด๋•Œ, ํˆฌ์ž์‹ ์ฒญ ๊ธฐ๋ก ๋กœ์ง์—์„œ Lock๊ธฐ๋ฒ•์ด ์ ์šฉ๋˜์–ด์žˆ๋‹ค.


๋Œ€๊ธฐ์—ด ๋Œ€์‹  Lock๊ธฐ๋ฒ•์ด ์‚ฌ์šฉ๋œ ์ด์œ 

lock

  • Lock๊ธฐ๋ฒ•์€ ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ๊ฐ™์€ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์š”์ฒญ๋งŒ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ง‰๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๋ฌด์—‡๋ณด๋‹ค ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—์„œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ํšจ๊ณผ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

  • ํ—ฌ๋กœ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ, ํšŒ์› idx๋กœ lock์„ ์œ ์ง€ํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ ํ™•๋ณด -์ƒํ’ˆ๋ณ„ ํ•œ๋„ / ํˆฌ์ž์ž ์ผ๋ณ„ ํˆฌ์ž์ƒํ•œ / ํˆฌ์ž ๊ธˆ์•ก / ์˜ˆ์น˜๊ธˆ ๋“ฑ ์ •ํ•ฉ์„ฑ์ด ๋ฌด์—‡๋ณด๋‹ค ์šฐ์„ ์‹œ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ํฌํ•จ

ex1) java synchronized ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

(JVM ๋ ˆ๋ฒจ Lock)

import org.springframework.stereotype.Service;

@Service
public class SynchronizedLockService {
    private int counter = 0;

    public synchronized void increment() {
        counter++;
        System.out.println(Thread.currentThread().getName() + " - ํ˜„์žฌ ์นด์šดํŠธ: " + counter);
    }
}

  • JVM๋ ˆ๋ฒจ์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ, ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ๋Š” ๋™์ž‘ X, ์„ฑ๋Šฅ ๋น ๋ฆ„

ex2) Database Lock

(DB๋ฅผ ํ™œ์šฉํ•˜์—ฌ Lock๊ตฌํ˜„)

CREATE TABLE lock_table (
    id INT PRIMARY KEY,
    locked BOOLEAN NOT NULL DEFAULT FALSE
);

    @Transactional
    public void doSomethingWithLock() {
        // ํ–‰ ์ž ๊ธˆ (SELECT FOR UPDATE)
        jdbcTemplate.queryForObject("SELECT * FROM lock_table WHERE id = 1 FOR UPDATE", (rs, rowNum) -> rs.getInt("id"));

        System.out.println(Thread.currentThread().getName() + " - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Lock ํš๋“!");
        try {
            Thread.sleep(5000); // ์ž‘์—… ์ˆ˜ํ–‰
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " - ์ž‘์—… ์™„๋ฃŒ!");
    }
  • DB๋งŒ์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ, ํŠธ๋ Œ์ ์…˜ ๊ฒฉ๋ฆฌ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ๋ฉ€ํ‹ฐ์ธ์Šคํ„ด์Šค(๋ถ„์‚ฐํ™˜๊ฒฝ)์—์„œ ์ •ํ•ฉ์„ฑ ๋ณด์žฅ ๊ฐ€๋Šฅ
  • ๋ชจ๋“  ์š”์ฒญ์ด DB lock์„ ๊ธฐ๋‹ค๋ฆฌ๋ฏ€๋กœ ์†๋„ ๋А๋ฆผ(lock์ด ํ•ด์ œ๋ ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐ), ๋ฐ๋“œ๋ฝ ๊ฐ€๋Šฅ์„ฑ์žˆ์Œ -> ๋ ˆ๋””์…˜ ๋ฝ์€ ๋ธ”๋กํ‚นํ•˜์ง€ ์•Š๊ณ , Polling๋ฐฉ์‹์œผ๋กœ ์žฌ์‹œ๋„ ๊ฐ€๋Šฅ. ์ปค๋„ฅ์…˜ pool ๋ฏธ ์†Œ์œ  ๋ฐ TTL๋กœ ๋ฐ๋“œ๋ฝ ๋ฐฉ์ง€

๋Œ€๊ธฐ์—ด

  • ์„ค๊ณ„ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ, ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ ์œ ์ง€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ถ”๊ฐ€์ ์ธ ์„ค๊ณ„/๊ฐœ๋ฐœ์ด ํ•„์š”.
  • ๋†’์€ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ์Œ. (๋™์‹œ์š”์ฒญ)
  • ์ˆ˜ํ‰์  ํ™•์žฅ์— ์šฉ์ด(์Šค์ผ€์ผ ์•„์›ƒ)

๊ฒฐ๋ก 

  • ์„ค๊ณ„ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ, lock / ๋Œ€๊ธฐ์—ด ๋ชจ๋‘ ์ผ๊ด€์„ฑ(๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ)์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, lock ๊ธฐ๋ฒ• ์‚ฌ์šฉ์‹œ ์ถ”๊ฐ€์ ์ธ ์…‹ํŒ… ์—†์ด ์‰ฝ๊ฒŒ ์ผ๊ด€์„ฑ ๋ฐ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ฑ„ํƒ๋˜์—ˆ๋‹ค.

scf์˜ ์ƒํ’ˆ ํŠน์„ฑ๊ณผ ์ดํ•ด

๋ฝ์„ ์žก์•„๋†“๊ณ (lock์•ˆ์—์„œ์˜ ์„œ๋น„์Šค๋กœ์ง) apiํ†ต์‹ ์„ ํ•˜๋Š”์ด์œ ?

  • ๋™์‹œ์„ฑ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž.
๋™์‹œ์„ฑ ์ด์Šˆ๋ž€?
  • ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ์ฐจ์ด๋Š” ์žˆ๊ฒ ์ง€๋งŒ
    ์—ฌ๊ธฐ์„œ๋Š” '์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ' ๋กœ ์ •์˜ํ•˜๊ฒ ๋‹ค.

๋™์‹œ์„ฑ ์ด์Šˆ๋ฅผ ๋Œ€์‘ํ•ด์•ผํ•  ๊ณณ.

  1. ๋ชจ์ง‘๊ธˆ์•ก๊ณผ, ์ƒํ’ˆ ๋ณ„ ๋™์ผ ์ฐจ์ฃผ ํˆฌ์ž ํ•œ๋„๋ฅผ ๋„˜์ง€ ์•Š๊ฒŒ ์ƒํ’ˆ์˜ ๋™์‹œ์„ฑ ์ด์Šˆ
  2. p2pํˆฌ์žํ•œ๋„์™€ ์˜ˆ์น˜๊ธˆ ํ•œ๋„๋ฅผ ๋„˜์ง€ ์•Š๊ฒŒ ํšŒ์›๋ณ„ ๋™์‹œ์„ฑ ์ด์Šˆ

์šฐ๋ฆฌ๋Š” ์™ธ๋ถ€์€ํ–‰์— ํˆฌ์ž์ž,๋Œ€์ถœ์ž ๋ˆ์„ ๋ชจ๋‘ ๋งก๊ฒจ๋‘๊ณ  ์šด์˜(์‹ ํƒ ์šด์˜)์ค‘์ด๋‹ค.

  • ํ•œ๋„๋ฅผ ๊ธˆ๊ฒฐ์› api๋ฅผ ํ†ตํ•ด ๋งค๋ฒˆ ์ฒดํฌ

์‹ค์ œ ๋ˆ์ด ๋น ์ ธ๋‚˜๊ฐ€๋Š” ์‹œ์ ์€, ๋ชจ๋“  ํˆฌ์ž๊ธฐ๋ก์„ ๋งˆ์นœ ํ›„, ๋Œ€์ถœ์„ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์—์„œ ๋ˆ์„ ๊ฐ€์ ธ๊ฐ„๋‹ค.

  • ํšŒ์›๋ณ„ ๋™์‹œ์„ฑ

์„ธ๋งˆํฌ์–ด ๋ฎคํ…์Šค ๋น„๊ด€์ ๋ฝ ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•๋ก ์ด ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” redisson lock์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

  • k8s๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ server๋ฅผ ๋„์›Œ๋†“๋Š” ๋ถ„์‚ฐํ™˜๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ.

redisson lock ์‚ฌ์šฉ์ด์œ 

๋จผ์ €, ํ—ฌ๋กœ ํˆฌ์žํ•˜๊ธฐ ์„œ๋น„์Šค๋Š” redisson lock์„ ์‚ฌ์šฉํ•œ๋‹ค.

Lock testLock = redissonClient.getLock("affterProcessorLock-" + Idx);
testLock.tryLock(4, 4, TimeUnit.SECONDS);
// ...ํˆฌ์ž ๋กœ์ง
testLock.unlock();

๋ ˆ๋””์…˜ ๋ฝ(redisson lock)์ด๋ž€?

  • Redis๊ธฐ๋ฐ˜์˜ ๋ถ„์‚ฐ ๋ฝ ๊ตฌํ˜„์ฒด์ด๋‹ค.
  • ๋ฉ€ํ‹ฐ ์„œ๋ฒ„ ํ™˜๊ฒจ์—์„œ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋™์ผํ•œ ๊ณต์œ ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ, ์ค‘๋ณต ์ฒ˜๋ฆฌ๋‚˜ ๋ฐ์žํ„ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ด์ค€๋‹ค.

๋‹จ์ผ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” synchronized, ์ผ๋ฐ˜ Lock์„ ํ†ตํ•ด ์ž„๊ณ„ ๊ตฌ์—ญ์„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฉ€ํ‹ฐ์„œ๋ฒ„(๋ถ„์‚ฐ ์‹œ์Šคํ…œ) ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋Ÿฐ

์ž„๊ณ„๊ตฌ์—ญ(Critical Section) : ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›(Shared Resource) ์— ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ ์˜์—ญ

๊ฒฐ๋ก 

  • ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•จ

์ด์Šˆ

1.ํˆฌ์ž์ž ๋ณ„ ํˆฌ์ž์™„๋ฃŒ๊นŒ์ง€์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ํ ๋ฐฉ์‹์˜ Redis๋Š” ์™œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๊ฐ€?

  • Redis๊ฐ€ lock์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ณผ์ • ์ž์ฒด๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ ๋ฐฉ์‹์ด๋‹ค. ํ—ˆ๋‚˜, Redisson Lock์€ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ๋ฝ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ฆ‰, ๋ฝ์„ ํญ๋“ํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์—†๋Š” ๊ฒฝ์Ÿ์ ๋ฝ๋ฐฉ์‹์ด๋‹ค.
์ •๋ณด

FIFO ๋ฐฉ์‹์˜ "๊ณต์ • ๋ฝ(Fair Lock)"๋˜ํ•œ ์ง€์›ํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๋Œ€๊ธฐ์—ด ๋ฐฉ์‹์ด๋ผ๊ณ  ๋ด๋„ ๋˜๊ฒ ๋‹ค.

๊ธฐ๋ณธ Redisson Lock์˜ ๋™์ž‘ ๋ฐฉ์‹

  1. ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ(์„œ๋ฒ„ ๋˜๋Š” ์Šค๋ ˆ๋“œ)๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ๋ฝ์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ.
  2. ๊ฐ€์žฅ ๋จผ์ € Redis์— ๋ฝ์„ ์„ค์ •ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฝ์„ ํš๋“(๊ฒฝ์Ÿ ๋ฐฉ์‹).
  3. ๋ฝ์„ ํš๋“ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด์ œํ•ด์•ผ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฝ์„ ํš๋“ ๊ฐ€๋Šฅ.
  4. ๋ฝ์ด ๋งŒ๋ฃŒ๋˜๊ฑฐ๋‚˜ ์ž๋™ ์—ฐ์žฅ(Watchdog)๋˜๋ฉด์„œ ๋™์ž‘.

์ด๋Ÿฌํ•œ ๋™์ž‘ ๋ฐฉ์‹ ๋•Œ๋ฌธ์—, Starvation(๊ธฐ์•„ ํ˜„์ƒ)์ด ์•ผ๊ธฐ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

๊ธฐ์•„ํ˜„์ƒ์ด๋ž€, ๊ณ ๋ถ€ํ•˜ ํ™˜๊ฒฝ์—์„œ ๋ฝ์„ ํญ๋“ํ•˜๋ ค๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งŽ์œผ๋ฉด, ํ›„์ˆœ์œ„ ์š”์ฒญ์ด ๊ณ„์†ํ•ด์„œ ๋ฌด์‹œ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊ธฐ๊ธด๋‹ค. ์ฆ‰, Aํˆฌ์ž์ž๊ฐ€ ๋จผ์ € ํˆฌ์ž๋ฅผ ํ•˜์˜€์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์— ์‹คํ–‰ํ•œ ํˆฌ์ž์ž B,C๊ฐ€ ๋จผ์ € ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ํ•ด๋‹น ๊ฒฝ์šฐ๋ฅผ ์‹ฌ์‹ฌ์น˜ ์•Š๊ฒŒ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • ์ตœ๋Œ€ 30์ดˆ ์ด์ƒ ๋Œ€๊ธฐ์ƒํƒœ์—์„œ ๊ธฐ๋‹ค๋ฆฐ ์ธ์›์ด ์žˆ์Œ. -> ๊ทธ๋Ÿฌ๋‚˜ ํ‰๊ท  ์†๋„๋Š” ๋Œ€๊ธฐ์—ด์— ๋น„ํ•ด ๊ต‰์žฅํžˆ ๋น ๋ฅด๋‹ค.(์ถ”๊ฐ€์ ์ธ ๋Œ€๊ธฐ์—ด(FIFO ํ)์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฝ ํš๋“ ์†๋„๊ฐ€ ๋น ๋ฆ„)

์œ„์—์„œ๋Š” ์ผ๊ด€์„ฑ/์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ๋Œ€๊ธฐ์—ด์„ ํฌ๊ธฐํ•˜๊ณ  lock์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉฐ?

ํ•ด๋‹น ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์€, ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ ๊ณ ๋ถ€ํ•˜ apiํ†ต์‹ , I/O ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ์ ์ ˆํ•œ ํผํฌ๋จผ์Šค๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํƒ€ํ˜‘์  ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

์ฃผ์‹ ์ฒด๊ฒฐ๊ณผ ๊ฐ™์ด ์ƒํ’ˆ์„ ๋ฏธ๋ฆฌ ์—ด์–ด ์ฃผ๋ฌธ์„ ๋ฐ›๊ณ , ํˆฌ์ž์ž ๋ณ„ ํ•œ๋„๋Œ€๋กœ ํˆฌ์ž๋ฅผ ์‹œํ–‰

  • ์ƒํ’ˆ์„ ๋ฏธ๋ฆฌ ์—ด์–ด, ํˆฌ์ž ๊ธˆ์•ก ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๋Š” ์›๋ฆฌ.
  • ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฐ ์†๋„๋ฅผ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•œ๊ณ„

  1. ํˆฌ์ž์ž ์ž…์žฅ์—์„œ๋Š” ํˆฌ์ž ์™„๋ฃŒ ์ดํ›„ ์ทจ์†Œ ํ†ต๋ณด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.
    • ํˆฌ์ž์ž ๊ฐœ์ธ ํ•œ๋„๋Š” ๊ธˆ์œต๊ฒฐ์ œ์œ„์›ํšŒ์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ, ํƒ€ ์—…์ฒด์˜ ํ•œ๋„์™€ ๊ณต์œ ๋˜์–ด ์ค‘๋ณตํˆฌ์ž๋กœ์ธํ•œ ์ทจ์†Œ ๊ฐ€๋Šฅ์„ฑ
    • ์ƒํ’ˆ ํˆฌ์ž ํ•œ๋„ ์ดˆ๊ณผ๋กœ ์ธํ•œ ์ทจ์†Œ๊ฐ€๋Šฅ์„ฑ ํ•ด๋‹น ๊ฒฝ์šฐ์— ์žฌ ํˆฌ์ž๋ฅผ ๋ฐ›์•„์•ผ ํ•  ๊ฒฝ์šฐ๋„ ์ƒ๊น€

์‚ฌ๋‚ด ์ •์ฑ…์˜ ๋ฌธ์ œ ๋˜ํ•œ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ์™„๋ฒฝํ•˜๊ธฐ๋ž€ ์‰ฝ์ง€ ์•Š์•„ ๋ณด์ธ๋‹ค.


์ด์Šˆ

2.Lockํ•ด์ œ์™€ ์ •ํ•ฉ์„ฑ ์ด์Šˆ

  • lock์ด ํ’€๋ฆฌ๋Š” ์ด์œ ?

lock์œผ๋กœ ๋ฌถ์—ฌ์žˆ๋Š” ํ•œ ์„œ๋น„์Šค ๋กœ์ง ๋‚ด์—, ๋‹ค์ˆ˜์˜ ์™ธ๋ถ€ ํ†ต์‹ ์ด ํฌํ•จ๋˜์–ด ์žˆ์Œ.

  • ํ˜„์žฌ ์„ค์ •์œผ๋กœ, Redisson Lock์€ 4sec์˜ TTL์„ ๊ฐ–๋Š”๋‹ค. ์ด๋•Œ, ์™ธ๋ถ€์‘๋‹ต ์ง€์—ฐ์œผ๋กœ TTL์„ ์ดˆ๊ณผํ•ด ๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค๋ฉด, lock์„ ํ•ด์ œํ•จ๊ณผ ๋™์‹œ์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

์–ด์ฉจ์„œ??

  • A, B ์ƒํ’ˆ์— ๋Œ€ํ•˜์—ฌ, ๋‹จ์ผ ํˆฌ์ž์ž๊ฐ€ ํˆฌ์ž๋ฅผ ํ–ˆ์„ ๋•Œ A์ƒํ’ˆ์— ๋Œ€ํ•œ ํˆฌ์ž๋ฅผ ์™„๋ฃŒ์ฒ˜๋ฆฌํ•˜์—ฌ ( ์›๋ž˜์˜€์œผ๋ฉด lock์ฒ˜๋ฆฌ๋  )์˜ˆ์น˜๊ธˆ ์ฐจ๊ฐ์ด ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ฝ์ด ํ’€๋ ค๋ฒ„๋ฆฐ๋‹ค๋ฉด? B์ƒํ’ˆ์— ๋Œ€ํ•œ ํˆฌ์ž๋„ ์ •์ƒ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

1. ์„œ๋น„์Šค๋กœ์ง ๋‹จ์ˆœํ™”

  • ๋งค ํˆฌ์ž ๊ฑด ๋ณ„๋กœ ์กฐํšŒํ•˜๋Š” ๊ฐœ์ธ๋ณ„ ํˆฌ์žํ•œ๋„๋ฅผ redis๋กœ ๊ด€๋ฆฌํ•˜์—ฌ, ํˆฌ์ž๊ฑด๋ณ„ ์†๋„ ๊ฐœ์„ ์„ ๋ชฉํ‘œ๋กœํ•จ. ํ•œ๊ณ„ : ํˆฌ์ž ๊ฑด ๋ณ„ TTL์ดˆ๊ณผ ํ™•๋ฅ ์„ ์ค„์ผ ์ˆ˜๋Š” ์žˆ์œผ๋‚˜, ์™ธ๋ถ€์— ์˜์กด์ ์ธ ํˆฌ์ž๊ตฌ์กฐ ์ƒ 100% ํ•ด๊ฒฐํ•  ์ˆ˜๋Š” ์—†์Œ

2. ๋จผ์ € ํˆฌ์ž๋ฅผ ๋ฐ›์€ ํ›„, ๋ฐ์ดํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ํ•œ๋„๋ณ„ ํˆฌ์ž์ฒ˜๋ฆฌ

(1๋ฒˆ ์ด์Šˆ์™€ ๊ฐ™์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•)

  • ์ƒํ’ˆ์„ ๋ฏธ๋ฆฌ ์—ด์–ด, ํˆฌ์ž ๊ธˆ์•ก ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๋Š” ์›๋ฆฌ.
  • ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฐ ๊ฒฝํ•ฉ์„์œ„ํ•œ ๋ฝ ์‚ฌ์šฉ ๋ถˆํ•„์š”
๊ฒฐ๋ก 

ํ˜„์žฌ ์‹ ํƒ ์šด์˜์œผ๋กœ ์ธํ•œ ํ•œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘๊ด€๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ์™€,
๋ณด์ˆ˜์ ์ธ ์šด์˜์ƒ์˜ ๋ฐฉ์นจ์œผ๋กœ ํฐ ๊ตฌ์กฐ ๊ฐœ์„ ์„ ํž˜๋“ค์–ด ๋ณด์ž„

ํ˜„์žฌ๋Š” ๋ฆฌํŽ™ํ† ๋ง์„ ํ†ตํ•ด lock์— ๋ฌถ์—ฌ์žˆ๋Š” ๋กœ์ง์„ ๋‹จ์ˆœํ™” ํ•˜๋Š”๊ฒƒ์— ๋งŒ์กฑํ•ด์•ผ๊ฒ ์Œ.