'κ°μ λ©΄μ μ¬λ‘λ‘ λ°°μ°λ λκ·λͺ¨ μμ€ν
μ€κ³ κΈ°μ΄' μ±
μ 보면μ '5μ₯ μμ ν΄μ μ€κ³' λ¨μμ μ½μ΄λ³΄μλλ°, μ μ΄ν΄κ° κ°μ§ μμμ λ€μ νλ² μ 리ν΄λ³΄κ³ μ νλ€.
μΌλ¨, ν΄λΉ λ¨μμ ν΄μ κΈ°μ μ API μλ²κ° μλ λ°μ΄ν°λ² μ΄μ€λ μΊμ μλ²μ κ°μ λ°μ΄ν° μ μ₯μ μμ€ν
μ μ¬μ©λλ κ²μ΄λ€. μλνλ©΄ API μλ²λ κΈ°λ³Έμ μΌλ‘ Statelessμ΄κΈ°μ μμ² μ²λ¦¬λ₯Ό μν΄ κΌ κ°μ μλ²μκ² μμ²μ 보λ΄μΌ νλ κ²λ μλλ©°, μλ²λ₯Ό μΆκ° λ° μ κ±° νλ€κ³ ν΄μ λ¬Έμ κ° λ°μνμ§ μλλ€. κ·Έλ¦¬κ³ μ΄λ° API μλ²μ λν λΆν λΆμ°μ λ‘λ λ°Έλ°μκ° λ°λ‘ νκΈ° λλ¬Έμ κ΄κ³μλ€!
μμ ν΄μμ λͺ©μ μ κΈ°μ‘΄ ν΄μλ₯Ό ν΅ν λ°μ΄ν°μ μ₯μ λΆμ° λ°©μμ λ¨μ μ ν΄μνκΈ° μν¨μ΄λ€.
κΈ°μ‘΄ ν΄μ λ°©λ²μ μλ²μ μ 보λ₯Ό λ°°μ΄ κ°μ μλ£κ΅¬μ‘°μ λ΄μλκ³ , ν€ κ°μ ν΄μνμ¬ λμ¨ κ°μ `% μλ²μ μ` μ°μ°μ ν΅ν΄ μΈλ±μ€λ‘ μ κ·Όνλ€. νμ§λ§ μ¬κΈ°μ μλ²κ° μΆκ°λκ±°λ, μ‘΄μ¬νλ μλ² μ€ νλκ° μ₯μ κ° λ°μνμ λ λ¬Έμ κ° μκΈΈ μ μλ€.
μλ₯Ό λ€μ΄, key1μ ν΄μ κ°μ΄ 7 μΌ λ, μλ²κ° 3κ° μ‘΄μ¬νλ€λ©΄ 3μΌλ‘ λλ λλ¨Έμ§λ 1μ΄λ€. μ¬κΈ°μ μλ²κ° μΆκ°λλ€λ©΄ 4λ‘ λλκ² λλλ°, μ΄λ¬λ©΄ λλ¨Έμ§κ° 1μ΄ μλ 3μ΄ λλ€. λ§μ½ μΊμ μλ²λΌλ©΄ μΊμ λ―Έμ€κ° λκ² λλ μν©μ΄κ³ , λ°μ΄ν°λ² μ΄μ€ μ€λ©μ΄μλ€λ©΄ νμν λ°μ΄ν°κ° μ‘΄μ¬νμ§ μλ λ°μ΄ν°λ² μ΄μ€μ μ κ·Όνκ² λλ μν©μ΄ λ°μνλ€.
μ΄ λΏλ§ μλλΌ κΈ°μ‘΄ 3κ°μ μλ² μ€ 1κ°μ μλ²κ° μ£½μλ€λ©΄, `% 2`κ° λμ΄ ν€λ€μ΄ λͺ¨λ μ¬λΆλ°° λμ΄μ μμ²μ΄ κ· λ±νκ² λΆν¬λμ§ μλ κ²½μ°κ° λ°μν μλ μλ€. μ΄λ λ― κΈ°μ‘΄ ν΄μλ μμ λ λ¨μ μ΄ μμκΈ° λλ¬Έμ μ΄λ₯Ό ν΄μνκΈ° μν΄ 'μμ ν΄μ' κΈ°μ μ΄ λμ€κ² λ κ²μ΄λ€.
μμ ν΄μμ λμ λ°©μμ ν΄μ ν¨μμ μΆλ ₯κ° λ²μλ₯Ό μλ―Ένλ ν΄μ 곡κ°μ λ
Όλ¦¬μ μΈ μν λ§ ννλ‘ λ§λλ κ²μΌλ‘ μμνλ€. μ΄μ μλ²λ μΈλ±μ€ λ°©μμ΄ μλ ν΄μ 곡κ°μμ νΉμ μ’νλ₯Ό κ°κ² λκ³ , ν€ κ°λ λμΌνκ² νΉμ μ’νλ₯Ό κ°κ² λλ€. μ¬κΈ°μ κ°λλ€ν¨μ μ€μ λ‘ μ΄ κ°μ 보μ νλ κ²μ΄ μλλΌ ν΄μ 곡κ°μ νΉμ μ’νμ μ‘΄μ¬ν¨μ μλ―Ένλ€. μλ²κ° ν΄μ 곡κ°μ μ’νλ₯Ό κ°λ μ½λλ₯Ό λνλ΄λ©΄ μλμ κ°μ κ²μ΄λ€.
TreeMap<Long, Server> hashRing = new TreeMap<>();
hashRing(hash(server1.ip), server1);
hashRing(hash(server2.ip), server2);
hashRing(hash(server3.ip), server3);
κ·Έλ¬λ©΄ μ΄μ μμ² μ ν΄μ ν¨μμ κ²°κ³Όλ‘ λμ¨ κ°μ κΈ°μ€μΌλ‘ μκ³ λ°©ν₯μΌλ‘ λλ©΄μ κ°μ₯ κ°κΉμ΄ μλ² λ
Έλλ₯Ό μ°Ύλλ€. μ°Ύμλ€λ©΄, ν΄λΉ μλ²λ‘ ν΄λΉ ν€μ λν μμ²μ 보λ΄λ κ²μ΄λ€.

κ·Έλ¦ΌμΌλ‘ λνλ΄λ©΄ μμ κ°μλ°, μ€μ λ‘ μ μ₯λ κ²μ μλ² λΏμ΄κ³ ν€ κ°μ μ€μ λ‘ ν΄μ 곡κ°μ μ μ₯λμ§ μλλ€. κ·Έλ₯ λ
Όλ¦¬μ μΌλ‘ λνλΈ κ²μΌ λΏ
μ΄λ κ² λλ©΄ μλ²κ° ν΄μ 곡κ°μ κ³ λ₯΄κ² λΆν¬λμ΄ μμ΄ ν€ κ°μ λ μ΄μ μ΄λ ν μλ²λ‘ λͺ°λ¦¬μ§ μμ κ²μ΄λ€. κ·Έλ¦¬κ³ , νλμ μλ²κ° μ¬λΌμ§κ±°λ μΆκ°λμ΄λ μν₯μ λ°λ ν€ κ°μ μκ° μ μ΄μ§λ€!
νμ§λ§ ν€ κ°κ³Ό μλ²μ ν΄μ κ°μ΄ κ°μΌλ©΄ μ΄λ»κ² λ κΉ? ν€λ₯Ό μ μ₯νμ§ μκ³ λΉκ΅νκΈ°λ§ νλ μ¬μ€ λ¬Έμ κ° μλ€. λ¨μ§, κ°μ κ°μ μλ²λ₯Ό ν΅ν΄ μμ²ν μ§, κ°μ κ° λ€μμ κ°κΉμ΄ μλ²λ₯Ό ν΅ν΄ μμ²ν μ§μ λν μ λ΅ μ°¨μ΄μΌ λΏμ΄λ€. μ½λλ‘ λ³Έλ€λ©΄ μλμ κ°μ κ²μ΄λ€.
TreeMap<Long, Server> ring = new TreeMap<>();
ring.put(hash(server1.ip), server1);
ring.put(hash(server2.ip), server2);
ring.put(hash(server3.ip), server3);
long keyPosition = hash(key);
Server server = ring.ceilingEntry(keyPosition).getValue();
κ·ΈλΌ μ΄λ° μμ ν΄μλ λ¨μ μ΄ μμκΉ? 그건 λ μλλ€. μμ μμμλ μλ²μ ν΄μ κ°μ΄ κ³ λ₯΄κ² λΆν¬λλ€λ κ°μ νμ ν κ²μ΄λΌ κ·Έλ μ§λ§ μλ²λΌλ¦¬ μλ‘ κ°κΉκ² ν΄μ κ°μ΄ μ΄λ€μ§λ©΄ μ΄λ° μμ ν΄μμ μ₯μ μ λ릴 μ μκ²λλ€.
κ·Έλμ κ°μ λ
Έλλ₯Ό νμ©νλλ°, μ΄ κ°μ λ
Έλλ€μ μ€μ λ
Έλ λλ μλ²λ€μ κ°λ₯΄ν€λ λ
Έλμ΄λ€. κ°μ λ
Έλλ€μ μ¬λ¬ κ° λ°°μΉνμ¬ λ¨μ μ ν΄μν μ μλ€. κ·Έλ¦ΌμΌλ‘ λ³Έλ€λ©΄ λ€μκ³Ό κ°λ€.

νμ§λ§ κ°μ λ
Έλλ₯Ό λ§μ΄ λ§λ€κ² λλ©΄ κ·Έλ§νΌ λ©λͺ¨λ¦¬ 곡κ°μ λ§μ΄ μ¬μ©νκ² λλ μ μ ν νΈλ μ΄λ μ€νκ° νμν λ²μ΄λ€.
'κ°λ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| κ³΅κ° μΈλ±μ€ (0) | 2025.12.07 |
|---|---|
| ν΄λ‘λ AIλ₯Ό ν΅ν μ€νλ§ νμ΅ (2) | 2025.11.18 |
| ν λΉμ ν΄λ¦° μ€νλ§ κ°μ° μμ½ (0) | 2025.11.01 |
| μ°μμ½ 2025λ₯Ό ν΅ν κ°μΈμ νκ³ (6) | 2025.10.29 |
| MVC ν¨ν΄ (5) | 2024.10.15 |