Kafka μ ν리μΌμ΄μ μ€μΌμΌλ§: νλ‘λμμ 컨μλ¨Έμ νμ₯ λ° κ³ κ°μ©μ± μ λ΅
Apache Kafka λ λκ·λͺ¨ λ°μ΄ν° μ€νΈλ¦¬λ° μ ν리μΌμ΄μ μ μ§μνλ κ°λ ₯ν νλ«νΌμ λλ€. Kafka μ ν리μΌμ΄μ μ μ±κ³΅μ μΌλ‘ μ€μΌμΌλ§νλ €λ©΄ νλ‘λμμ 컨μλ¨Έμ μν νμ₯ , ν ν½μ νν°μ λ μ λ΅ , 컨μλ¨Έ κ·Έλ£Ή κ΄λ¦¬ , κ·Έλ¦¬κ³ κ³ κ°μ©μ± μ μν μ₯μ λμ μ λ΅ μ΄ νμμ μ λλ€. μ΄λ² ν¬μ€ν μμλ μ΄λ¬ν μμλ€μ μ΄ν΄λ³΄κ³ , ν¨κ³Όμ μΈ Kafka μ ν리μΌμ΄μ μ€μΌμΌλ§ λ°©λ²μ μ€λͺ ν©λλ€.
1. νλ‘λμμ 컨μλ¨Έμ μν νμ₯
Kafka μ ν리μΌμ΄μ μ μν νμ₯ (Horizontal Scaling)νλ €λ©΄ νλ‘λμ μ 컨μλ¨Έ μΈμ€ν΄μ€λ₯Ό λ리λ κ²μ΄ ν΅μ¬μ λλ€. μν νμ₯μ νΈλν½μ΄ μ¦κ°ν λ μ ν리μΌμ΄μ μ μ²λ¦¬ λ₯λ ₯μ νμ₯νλ λ° μ€μν μν μ ν©λλ€.
νλ‘λμ νμ₯
νλ‘λμ λ μ¬λ¬ μΈμ€ν΄μ€λ₯Ό ν΅ν΄ λ³λ ¬λ‘ λ°μ΄ν°λ₯Ό Kafka λΈλ‘컀 μ μ μ‘ν μ μμ΅λλ€. μ΄λ λ©μμ§λ₯Ό λΉ λ₯΄κ³ μμ μ μΌλ‘ μ μ‘νλ λ° λμμ΄ λ©λλ€.
컨μλ¨Έ νμ₯
컨μλ¨Έ λ 컨μλ¨Έ κ·Έλ£Ή μ νμ©νμ¬ λ©μμ§λ₯Ό λ³λ ¬λ‘ μ²λ¦¬ν μ μμ΅λλ€. 컨μλ¨Έ κ·Έλ£Ή λ΄μ 컨μλ¨Έκ° νν°μ μ λλ μ μ²λ¦¬νλ―λ‘, 컨μλ¨Έ μΈμ€ν΄μ€λ₯Ό λ리면 λμμ μ²λ¦¬ν μ μλ λ©μμ§ μλ μ¦κ°ν©λλ€.
@KafkaListener(topics = "my_topic", groupId = "my_group", concurrency = "3")
public void consume(String message) {
System.out.println("Consumed message: " + message);
}
μ€λͺ :
- concurrency = “3” : μΈ κ°μ 컨μλ¨Έ μΈμ€ν΄μ€κ° λμμ λ©μμ§λ₯Ό μ²λ¦¬ν©λλ€.
- μν νμ₯ μ ν΅ν΄ νΈλν½μ΄ μ¦κ°ν λ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
2. ν ν½μ νν°μ λ μ λ΅
Kafka ν ν½μ νν°μ μΌλ‘ λλλ©°, νν°μ λμ νμ₯μ± κ³Ό λΆν λΆμ° μ λ§€μ° μ€μν μν μ ν©λλ€. κ° νν°μ μ λ 립μ μΌλ‘ μ²λ¦¬λκΈ° λλ¬Έμ, νν°μ μ λ₯Ό μ μ ν μ€μ νλ κ²μ΄ μ ν리μΌμ΄μ μ€μΌμΌλ§μ ν΅μ¬μ λλ€.
νν°μ λ μ λ΅
- Round-robin λ°©μ:
- λ©μμ§κ° κ· λ±νκ² νν°μ μ λΆλ°°λ©λλ€. κΈ°λ³Έμ μΈ λ‘λ λ°Έλ°μ± λ°©λ²μΌλ‘ μ£Όλ‘ μ¬μ©λ©λλ€. - ν€ κΈ°λ° νν°μ
λ :
- νΉμ ν€μ λ°λΌ λ©μμ§κ° κ³ μ λ νν°μ μ ν λΉλ©λλ€. λ°μ΄ν°λ₯Ό μΌκ΄λκ² μ²λ¦¬νκ±°λ νΉμ λ°μ΄ν°λ₯Ό νΉμ νν°μ μμ μ²λ¦¬ν λ μ μ©ν©λλ€.
ν ν½ μμ± μ νν°μ μ€μ
kafka-topics --create --topic my_topic --partitions 6 --replication-factor 3 --bootstrap-server localhost:9092
μ€λͺ :
- –partitions 6 : ν΄λΉ ν ν½μ 6κ°μ νν°μ μ μμ±ν©λλ€. νν°μ μλ₯Ό μ μ ν λ리면 컨μλ¨Έκ° λμμ μ¬λ¬ νν°μ μ μ²λ¦¬ν μ μμ΄ νμ₯μ± μ΄ λμμ§λλ€.
- νν°μ λ μ λ΅ μ λ©μμ§ μ²λ¦¬ μ±λ₯μ μ§μ μ μΈ μν₯μ λ―ΈμΉ©λλ€.
3. 컨μλ¨Έ κ·Έλ£Ή κ΄λ¦¬
컨μλ¨Έ κ·Έλ£Ή μ Kafkaμμ λμΌν λ©μμ§λ₯Ό μ€λ³΅ μ²λ¦¬νμ§ μκ³ μ¬λ¬ 컨μλ¨Έκ° λ©μμ§λ₯Ό λ³λ ¬λ‘ μ²λ¦¬ν μ μλλ‘ λμμ€λλ€. κ° μ»¨μλ¨Έλ νΉμ νν°μ μ ν λΉλ°μ λ©μμ§λ₯Ό μ²λ¦¬νλ©°, κ·Έλ£Ή λ΄ μ»¨μλ¨Έ μλ νν°μ μμ μΌμΉ νκ±°λ μ μ΄μΌ μ΅μ μ μ±λ₯μ λΌ μ μμ΅λλ€.
컨μλ¨Έ κ·Έλ£Ή κ΅¬μ± μμ
spring:
kafka:
consumer:
group-id: "my_group"
auto-offset-reset: "earliest"
μ€λͺ :
- group-id : 컨μλ¨Έ κ·Έλ£Ήμ μ μν©λλ€.
- auto-offset-reset : νν°μ
μμ λ©μμ§λ₯Ό μ½κΈ° μμν μμΉλ₯Ό μ€μ ν©λλ€.
"earliest"
λ‘ μ€μ νλ©΄ μ²μλΆν° λ©μμ§λ₯Ό μ½μ΅λλ€.
4. κ³ κ°μ©μ±κ³Ό μ₯μ λμ μ λ΅
Kafka μ ν리μΌμ΄μ μμ κ³ κ°μ©μ±μ ν보νλ €λ©΄ μ€λ¨ μλ μλΉμ€ μ 곡 μ΄ μ€μν©λλ€. Kafkaλ λΈλ‘컀 볡μ λ₯Ό ν΅ν΄ λ°μ΄ν°μ κ³ κ°μ©μ± μ 보μ₯νλ©°, μ΄λ₯Ό μν λ€μν μ₯μ λμ μ λ΅μ κ³ λ €ν΄μΌ ν©λλ€.
λΈλ‘컀 볡μ μ€μ
Kafkaλ 볡μ λ₯Ό ν΅ν΄ λΈλ‘μ»€κ° μ€ν¨νλλΌλ λ°μ΄ν°λ₯Ό μμ νκ² λ³΄μ‘΄ν©λλ€. Replication Factor λ₯Ό μ¬μ©ν΄ ν ν½ λ΄ λ©μμ§μ 볡μ λ³Έμ μ¬λ¬ λΈλ‘컀μ λΆμ°νμ¬ μ₯μ λ°μ μ λ°μ΄ν°λ₯Ό 볡ꡬν μ μμ΅λλ€.
kafka-topics --create --topic my_topic --partitions 6 --replication-factor 3 --bootstrap-server localhost:9092
μ₯μ λμ μ λ΅
- 리λ-νλ‘μ ꡬ쑰 :
- κ° νν°μ μλ 리λ μ νλ‘μ λΈλ‘μ»€κ° μμ΅λλ€. 리λκ° μ€ν¨νλ©΄ νλ‘μκ° μλμΌλ‘ μΉκ²©λμ΄ μλΉμ€ μ€λ¨ μμ΄ λ©μμ§λ₯Ό μ²λ¦¬ν©λλ€. - 컨μλ¨Έ μ€νμ
κ΄λ¦¬ :
- 컨μλ¨Έλ μ€νμ μ 컀λ°νμ¬ μμ μ΄ μ²λ¦¬ν λ§μ§λ§ λ©μμ§λ₯Ό Kafkaμ κΈ°λ‘ν©λλ€. μ₯μ λ°μ μ λ§μ§λ§μΌλ‘ μ²λ¦¬ν λ©μμ§ μ΄νλΆν° λ€μ λ©μμ§λ₯Ό μ²λ¦¬ν μ μμ΄ λ°μ΄ν° μ μ€ μ λ°©μ§ν©λλ€. - μ¬μλ λ‘μ§ :
- λ©μμ§ μ²λ¦¬ μ€ λ¬Έμ κ° λ°μνλ©΄ μ¬μλ λ‘μ§ μ ꡬννμ¬ λ©μμ§ μμ€ μμ΄ μμ μ μΌλ‘ μ²λ¦¬ν μ μμ΅λλ€.
@KafkaListener(topics = "my_topic", groupId = "my_group")
public void consume(String message) {
try {
// λ©μμ§ μ²λ¦¬ λ‘μ§
processMessage(message);
} catch (Exception e) {
logger.error("Error processing message, retrying...", e);
// μ¬μλ λ‘μ§
throw e;
}
}
Kafka μ€μΌμΌλ§ νΈλ λ λ° ν΅κ³
μ΅κ·Ό μ‘°μ¬μ λ°λ₯΄λ©΄, Kafkaλ₯Ό μ¬μ©νλ λκ·λͺ¨ κΈ°μ μ 75% μ΄μμ΄ νν°μ λ κ³Ό 컨μλ¨Έ κ·Έλ£Ή μ ν΅ν΄ νΈλν½ μ¦κ°μ ν¨κ³Όμ μΌλ‘ λμνκ³ μμ΅λλ€. νΉν 볡μ μ λ΅ μ μ¬μ©ν Kafka ν΄λ¬μ€ν°λ μ₯μ λ°μ μμλ 99.99%μ κ°μ©μ± μ 보μ₯ν μ μμ΅λλ€.
μμ£Ό 묻λ μ§λ¬Έ (FAQ)
Q1. Kafkaμμ νλ‘λμμ 컨μλ¨Έλ₯Ό μ΄λ»κ² νμ₯ν μ μλμ?
A1. νλ‘λμ λ μ¬λ¬ μΈμ€ν΄μ€λ‘ μν νμ₯μ΄ κ°λ₯νλ©°, 컨μλ¨Έ λ 컨μλ¨Έ κ·Έλ£Ή μ ν΅ν΄ μ¬λ¬ μΈμ€ν΄μ€κ° λ³λ ¬λ‘ λ©μμ§λ₯Ό μ²λ¦¬ν μ μμ΅λλ€. λν 컨μλ¨Έ κ·Έλ£Ή λ΄μμ κ° μ»¨μλ¨Έλ ν λΉλ νν°μ
μ λ³λ ¬λ‘ μ²λ¦¬νμ¬ νμ₯μ±μ λμΌ μ μμ΅λλ€.
Q2. νν°μ
λμ΄ μ€μν μ΄μ λ 무μμΈκ°μ?
A2. νν°μ
λ μ λ©μμ§λ₯Ό μ¬λ¬ νν°μ
μΌλ‘ λλμ΄ μ²λ¦¬ν¨μΌλ‘μ¨ λΆν λΆμ° μ κ°λ₯νκ² ν©λλ€. μ΄λ₯Ό ν΅ν΄ νλ‘λμ μ 컨μλ¨Έ κ° λμμ λ λ§μ λ©μμ§λ₯Ό μ²λ¦¬ν μ μμΌλ©°, μμ€ν
μ νμ₯μ±μ κ·Ήλνν μ μμ΅λλ€.
Q3. 컨μλ¨Έ κ·Έλ£Ήμμ νν°μ
ν λΉμ μ΄λ»κ² μ΄λ£¨μ΄μ§λμ?
A3. 컨μλ¨Έ κ·Έλ£Ή λ΄μ κ° μ»¨μλ¨Έλ νν°μ
μ μλμΌλ‘ ν λΉλ°μ λ©μμ§λ₯Ό μ²λ¦¬ν©λλ€. 컨μλ¨Έ κ·Έλ£Ήμ ν¬κΈ°κ° νν°μ
μλ³΄λ€ ν¬λ©΄ μΌλΆ 컨μλ¨Έλ λκΈ° μνκ° λ μ μμΌλ―λ‘, νν°μ
μ μ 컨μλ¨Έ μ λ₯Ό μ μ ν μ‘°μ ν΄μΌ ν©λλ€.
Q4. Kafka μ ν리μΌμ΄μ
μμ κ³ κ°μ©μ±μ μ΄λ»κ² ν보νλμ?
A4. Replication Factor λ₯Ό μ€μ νμ¬ λ©μμ§ λ³΅μ λ³Έμ μ¬λ¬ λΈλ‘컀μ λΆμ°ν¨μΌλ‘μ¨ κ³ κ°μ©μ± μ ν보ν μ μμ΅λλ€. λΈλ‘컀 μ€ νλκ° μ₯μ λ₯Ό μΌμΌμΌλ, λ€λ₯Έ 볡μ λ³Έμ΄ μλ λΈλ‘μ»€κ° λ°μ΄ν°λ₯Ό μ²λ¦¬νκ² λμ΄ μλΉμ€ μ€λ¨ μμ΄ μ ν리μΌμ΄μ
μ μ΄μν μ μμ΅λλ€.
Q5. Kafkaμμ μ₯μ λ°μ μ λ°μ΄ν°λ₯Ό μ΄λ»κ² 보νΈνλμ?
A5. Kafkaλ 컨μλ¨Έ μ€νμ
κ΄λ¦¬ μ λ©μμ§ λ³΅μ λ₯Ό ν΅ν΄ μ₯μ λ°μ μ λ°μ΄ν°λ₯Ό 보νΈν©λλ€. 컨μλ¨Έλ μμ μ΄ μ²λ¦¬ν λ©μμ§μ μ€νμ
μ μ μ₯ νμ¬, μ₯μ κ° λ°μνλλΌλ λ§μ§λ§μΌλ‘ μ²λ¦¬ν μμΉ μ΄νλΆν° λ©μμ§λ₯Ό λ€μ μ²λ¦¬ν μ μμ΅λλ€. λν, Replication Factor λ₯Ό ν΅ν΄ λ°μ΄ν°μ 볡μ λ³Έμ μ¬λ¬ λΈλ‘컀μ μ μ₯νμ¬ μ₯μ μ λ°μ΄ν° μ μ€μ λ°©μ§ν μ μμ΅λλ€.
λκΈ