Design Distributed Message Queue
νλ μννΈμ¨μ΄ μν€ν μ²λ μκ³ λ 립μ μΈ μλΉμ€λ‘ ꡬμ±λλ©°, λ©μμ§ νλ μλΉμ€ μ¬μ΄μ ν΅μ κ³Ό μ‘°μ¨μ λ΄λΉνκ² λλ©΄μ λ€μκ³Ό κ°μ μ΄μ μ μ 곡νλ€.
κ²°ν©λ μν(decoupling): μ»΄ν¬λνΈ μ¬μ΄ κ°ν κ²°ν©μ μ κ±°νκ³ , κ° μ»΄ν¬λνΈλ€μ λ 립μ μΌλ‘ κ°±μ κ°λ₯
κ·λͺ¨ νμ₯μ± κ°μ : λ©μμ§ νμ λ°μ΄ν°λ₯Ό μμ°νλ μμ°μμ νμμ λ©μμ§λ₯Ό μλΉνλ μλΉμ μμ€ν κ·λͺ¨λ₯Ό νΈλν½ λΆνμ λ§κ² μ‘°μ κ°λ₯
κ°μ©μ± κ°μ : νΉμ μ»΄ν¬λνΈμ μ₯μ κ° λ°μν΄λ λ€λ₯Έ μ»΄ν¬λνΈλ νμ κ³μ ν΅μ κ°λ₯
μ±λ₯ κ°μ : μμ°μλ μλ΅μ κΈ°λ€λ¦¬μ§ μκ³ λ©μμ§λ₯Ό μ μ‘ ν μ μκ³ , μλΉμλ λ©μμ§κ° μμ λλ§ μ²λ¦¬νκ² λμ΄ λΉλκΈ° ν΅μ μ μννκ² ν¨
μꡬ μ¬ν
λ©μμ§ νν: ν μ€νΈ
λ©μμ§ νκ· ν¬κΈ°: μ KB
νλμ λ©μμ§κ° νλμ μλΉμ / μ¬λ¬ μλΉμμκ² μ λ¬ μ€μ κ°λ₯
μμ°λ μμλλ‘ μλΉ
λ°μ΄ν° μ§μμ± 2μ£Ό 보μ₯
λ©μμ§ μ λ¬ λ°©μ μ΅μ ν λ²(at-least-once) / μ΅λ ν λ²(at-most-once) / μ νν ν λ²(exactly-once) μ€μ κ°λ₯
λ©μμ§ λͺ¨λΈ
κ°μ₯ λ리 μ°μ΄λ λ©μμ§ λͺ¨λΈμ μΌλμΌ(point-to-point)κ³Ό λ°ν-ꡬλ (publish-subscribe)μ΄ μ‘΄μ¬νλ€.
μΌλμΌ λͺ¨λΈ
κ° λ©μμ§λ μ€μ§ ν μλΉμμκ²λ§ μ λ¬
μ΄λ€ μλΉμκ° λ©μμ§λ₯Ό κ°μ Έκ°λ€λ μ¬μ€μ νμ μ리면(acknowledge) ν΄λΉ λ©μμ§λ νμμ μμ
νμ μ μ₯λλ λ°μ΄ν° 보κ΄μ μ§μνμ§ μμ
λ°ν-ꡬλ λͺ¨λΈ
ν΄λΉ ν ν½μ ꡬλ νλ λͺ¨λ μλΉμμκ² μ λ¬
λ©μμ§λ₯Ό μ£Όκ³ λ°μ λ ν ν½μ 보λ΄κ³ λ°λ λ°©μ(ν ν½ = λ©μμ§μ μ£Όμ κ°λ )
ν ν½μ λ°μ΄ν°κ° λΆμ‘±ν κ²½μ°
λ°ν-ꡬλ λͺ¨λΈμ λ©μμ§κ° ν ν½μ μ μ₯λλλ°, 보κ΄λλ λ°μ΄ν°μ μμ΄ μ»€μ§κ² λλ©΄ νν°μ μ λλμ΄ ν΄κ²°ν μ μλ€.
νλμ ν ν½μ μ¬λ¬ νν°μ μΌλ‘ λΆν
λ©μμ§λ₯Ό λͺ¨λ νν°μ μ κ· λ±νκ² λλμ΄ μ μ‘
νΈλν½μ΄λ λ°μ΄ν° μμ΄ λ§μμ§ μλ‘ νν°μ μ΄ μ¦κ°νκ² λλλ°, νν°μ μ μ μ§νλ μλ²λ₯Ό λ³΄ν΅ λΈλ‘컀λΌκ³ λΆλ₯Έλ€.
κ°λ΅μ μ€κ³μ
μμ°μ: λ©μμ§λ₯Ό νΉμ ν ν½μΌλ‘ μ μ‘
μλΉμ κ·Έλ£Ή: ν ν½μ ꡬλ νκ³ λ©μμ§ μλΉ
λΈλ‘컀: νν°μ μ μ§
λ°μ΄ν° μ μ₯μ: λ©μμ§λ₯Ό νν°μ λ΄ λ°μ΄ν° μ μ₯μμ 보κ΄
μν μ μ₯μ: μλΉμμ μν 보κ΄
λ©νλ°μ΄ν° μ μ₯μ: ν ν½ μ€μ / ν ν½ μμ± λ± μ μ₯
μ‘°μ μλΉμ€
μλΉμ€ νμ: μ΄λ€ λΈλ‘μ»€κ° μ΄μμλμ§ κ°μ§
리λ μ μΆ: λΈλ‘컀 κ°μ΄λ° νλλ₯Ό 컨νΈλ‘€λ¬ μν λ‘ μ μΆ(ν ν΄λ¬μ€ν°μλ νλ μ΄μμ 컨νΈλ‘€λ¬κ° νμ)
λ°μ΄ν° μ μ₯μ
λ©μμ§ νμ νΈλν½ ν¨ν΄μ λ€μκ³Ό κ°λ€.
μ½κΈ°μ μ°κΈ° λΉλ²
μμ°¨μ μ½κΈ°/μ°κΈ°κ° λλΆλΆ
κ°±μ /μμ μ°μ° λ°μ X
μκ°ν΄ λ³Ό μ μλ μ νμ§λ‘λ κ΄κ³ν/λΉκ΄κ³ν λ°μ΄ν°λ² μ΄μ€κ° μ‘΄μ¬νμ§λ§, μ½κΈ°/μ°κΈ°κ° λκ·λͺ¨λ‘ λΉλ²νκ² λ°μνκΈ° λλ¬Έμ μ ν©νμ§ μλ€.
μ°κΈ° μ°μ λ‘κ·Έ(Write-Ahead Log, WAL)
WALμ μλ‘μ΄ νλͺ©μ΄ μΆκ°λκΈ°λ§ νλ μΌλ° νμΌλ‘, λ©μμ§ νμ μ ν©ν λ°μ΄ν° μ μ₯μλ‘ μ¬μ©ν μ μλ€.
μλ‘μ΄ λ©μμ§κ° νν°μ 꼬리 λΆλΆμ μΆκ°λλ λ°©μ
μ κ·Ό ν¨ν΄μ΄ μμ°¨μ μ΄κΈ° λλ¬Έμ λμ€ν¬ I/O μ΅μν
μμ°¨ μ κ·Όμ΄κΈ° λλ¬Έμ νμ μ λμ€ν¬ νκ²½μμλ λΉ λ₯Έ λ°μ΄ν° μ κ·Ό κ°λ₯
λ©μμ§ μλ£ κ΅¬μ‘°
λ©μμ§ κ΅¬μ‘°λ μμ°μμ λ©μμ§ ν, μλΉμ μ¬μ΄μ κ³μ½μ΄λΌκ³ λ³Ό μ μλ€.
key
byte[]
νν°μ μ μ νλ ν€
value
byte[]
λ©μμ§μ λ΄μ©(=payload)
topic
string
λ©μμ§κ° μν ν ν½
partition
integer
λ©μμ§κ° μν νν°μ
offset
long
νν°μ λ΄ λ©μμ§μ μμΉ
timestamp
long
λ©μμ§ μμ± μκ°
size
integer
λ©μμ§ ν¬κΈ°
crc
integer
μν μ€λ³΅ κ²μ¬μ μ½μλ‘, λ°μ΄ν° λ¬΄κ²°μ± λ³΄μ₯μ μ¬μ©
μΌκ΄ μ²λ¦¬
μμ°μ / μλΉμ / λ©μμ§ νλ λ©μμ§λ₯Ό κ°κΈμ μΌκ΄ μ²λ¦¬νκ² λλλ°, μΌκ΄ μ²λ¦¬λ μμ€ν μ±λ₯μ λ§μ μν₯μ λ―ΈμΉλ€.
ν λ²μ λ€νΈμν¬ μμ²μΌλ‘ μ²λ¦¬νμ¬ λ€νΈμν¬ μ볡 λΉμ© μν
μ¬λ¬ λ©μμ§κ° ν λ²μ λ‘κ·Έμ κΈ°λ‘λλ©΄, ν° κ·λͺ¨μ μμ°¨ μ°κΈ° μ°μ°μ΄ λ°μνμ¬ λμ€ν¬μ μ°μλ 곡κ°μΌλ‘ κΈ°λ‘λ¨(λμν μμΉ)
νμ§λ§ ν λ²μ λ§μ μμ μ²λ¦¬ν μλ‘, λ©μμ§ νμ μ§μ° μκ°μ΄ μ¦κ°νκ² λκΈ° λλ¬Έμ μ μ ν κ· νμ μ°ΎμμΌ νλ€.
νΈμ vs ν
λ©μμ§ νλ νΈμ(push)μ ν(pull) λ°©μμΌλ‘ λ©μμ§λ₯Ό μλΉν μ μλ€.
νΈμ λͺ¨λΈ: λΈλ‘μ»€κ° μλΉμμκ² λ©μμ§λ₯Ό μ λ¬νλ λ°©μ
μ¦μ μλΉμμκ² μ λ¬νμ¬ μ§μ° μκ° κ°μ
μλΉμ λ©μμ§ μ²λ¦¬ μλκ° μμ°μ μμ± μλλ³΄λ€ λλ¦° κ²½μ° λμ λΆν κ°λ₯μ± μ‘΄μ¬
μμ°μ μμ± μλμ λ§μΆ° μλΉμμ μ»΄ν¨ν μμμ μ€λΉν΄ λμ΄μΌ ν¨
ν λͺ¨λΈ: μλΉμκ° λ©μΈμ§λ₯Ό κ°μ Έκ°λ λ°©μ
λ©μμ§ μλΉ μλλ₯Ό μμμ κ²°μ νμ¬ μ€μκ° / μΌκ΄ μ²λ¦¬ μ ν κ°λ₯
μλΉ μλκ° λ리λλΌλ λΆνκ° μκΈ°μ§ μμ
μμΈ λͺ¨λ λ©μμ§λ₯Ό ν λ²μ κ°μ Έκ° μΌκ΄ μ²λ¦¬ κ°λ₯
λΈλ‘컀μ λ©μμ§κ° μμ΄λ λΆνμν νλ§ μμ²μΌλ‘ μμ λλΉ κ°λ₯μ± μ‘΄μ¬(λ‘± νλ§μΌλ‘ λ¬Έμ μν)
λ©μμ§ μ λ¬ λ°©μ
λ©μμ§ μ λ¬ λ°©μμ μ΅μ ν λ²(at-least-once) / μ΅λ ν λ²(at-most-once) / μ νν ν λ²(exactly-once)μΌλ‘ λλλ€.
μ΅λ ν λ²: λ©μμ§κ° μ λ¬ κ³Όμ μμ μμ€λλλΌλ λ€μ μ λ¬νμ§ μμ
μ΅μ ν λ²: λ©μμ§κ° λΈλ‘컀μκ² μ λ¬λμμμ λ°λμ νμΈνλ λ°©μμΌλ‘, λ©μμ§ μμ€λμ§ μμ
μ νν ν λ²: μ±λ₯ λ° κ΅¬ν 볡μ‘λκ° λμ λ°©μμΌλ‘, μ€μν λ°μ΄ν° μ λ¬μ μ¬μ©
μ°Έκ³ μλ£
Last updated
Was this helpful?