[MSA] Apache Kafka (๋ถ์ฐ ๋ฉ์์ง ์์คํ ) ์๋ฒ ๊ตฌ์ถ
Apache Kafka ๋?
Apache Kafka(์ดํ Kafka)๋ ๋ถ์ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ผ๋ก, ๋์ฉ๋์ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. Kafka๋ ๋ค์ํ ์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ฒ ์ ์กํ๊ณ , ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ์ ํนํ ์ ์ฉํ๋ค.
MSA๋ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์๋น์ค๋ก ์ชผ๊ฐ์ ธ ์๋ค. Kafka๋ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ๋น๋๊ธฐ ํต์ ์ ๊ฐ๋ฅ์ผ ํ๋ค. ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์์๋ ๊ฐ ์๋น์ค๊ฐ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๊ณ , ํด๋น ์ด๋ฒคํธ์ ๊ด์ฌ์ด ์๋ ๋ค๋ฅธ ์๋น์ค๊ฐ ๊ตฌ๋ ํ์ฌ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ ๋์จํ ๊ฒฐํฉ(loose coupling)์ ์ด์งํ๊ณ , ๊ฐ ์๋น์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ๊ณ ๋ฐฐํฌํ ์ ์๋๋ก ๋์์ค๋ค.
Kafka์ ๊ตฌ์ฑ ์์
ZooKeeper : Kafka๊ฐ ์ฃฝ์๋์ง ์ด์๋์ง ๊ด๋ฆฌํ๋ ์๋ฒ
ZooKeeper๋ Apache Kafka์ ํด๋ฌ์คํฐ ์ํ ๊ด๋ฆฌ, ๋ธ๋ก์ปค๋ค ๊ฐ์ ๋ฆฌ๋ ์ ์ถ, ์ปจ์๋จธ ๊ทธ๋ฃน๊ณผ ํํฐ์ ํ ๋น ๋ฑ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ฃผํคํผ๋ ๋ถ์ฐ ํ๊ฒฝ์์์ ์กฐ์ ๋ฐ ๋ฆฌ๋ ์ ์ถ์ ์ํํ๋ฉฐ, Kafka ํด๋ฌ์คํฐ์ ์์ ์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ ๊ณตํ๋ค. ์ฃผํคํผ๋ Kafka ๋ธ๋ก์ปค๊ฐ ๋ฌด์์ด ๋ฆฌ๋์ด๋ฉฐ, ์ด๋ค ํ ํฝ์ด ์ด๋ค ํํฐ์ ์ ๊ฐ์ง๋์ง ๋ฑ์ ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๋ค.
Kafka Broker : ๋ฉ์ธ์ง ํ ์๋ฒ ์ญํ , ์ฃผํคํผ์ ์ข
์๋์ด ์์
Kafka ๋ธ๋ก์ปค๋ Kafka ํด๋ฌ์คํฐ์์์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก, ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ ์ ์กํ๋ ์ญํ ์ ํ๋ค. ๊ฐ ๋ธ๋ก์ปค๋ ํน์ ํ ์ฃผํคํผ(zookeeper) ์๋ฒ์ ํต์ ํ๋ฉฐ, ํด๋ฌ์คํฐ์ ๊ตฌ์ฑ๊ณผ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ค.
Kafka ํด๋ฌ์คํฐ๋ ์ฌ๋ฌ ๊ฐ์ ๋ธ๋ก์ปค๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ด๋ฌํ ๋ธ๋ก์ปค๋ค์ด ํจ๊ป ํ๋ ฅํ์ฌ ์์ ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ๋ถ์ฐ ๋ฉ์์ง ์์คํ
์ ํ์ฑํ๋ค.
Producer : ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ฐ๋ฐ, ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ์ญํ
Kafka ํ๋ก๋์๋ ๋ฐ์ดํฐ๋ฅผ Kafka ํ ํฝ์ผ๋ก ๋ณด๋ด๋ ์ญํ ์ ํฉ๋๋ค. ํ ํฝ์ ๋ฐ์ดํฐ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ํ๋ด๋ฉฐ, ํ๋ก๋์๋ ํน์ ํ ํฝ์ผ๋ก ๋ฉ์์ง๋ฅผ ์ ์กํฉ๋๋ค. ํ๋ก๋์๋ ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ Kafka ํด๋ฌ์คํฐ์ ๋ธ๋ก์ปค๋ก ๋ฉ์์ง๋ฅผ ์ ์กํฉ๋๋ค. ์ฃผ๋ก ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๋ฉฐ, ๋ฉ์์ง๋ฅผ ํน์ ํํฐ์ ์ผ๋ก ๋ณด๋ด๋ ๋ฐฉ๋ฒ ๋ฐ ๋ฉ์์ง์ ํค๋ฅผ ์ง์ ํ๋ ๋ฑ์ ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
Consumer : ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ฐ๋ฐ, ๋ฉ์ธ์ง๋ฅผ ๋ฐ๋ ์ญํ
Kafka ์ปจ์๋จธ๋ ํน์ ํ ํฝ์ ๋ฉ์์ง๋ฅผ ์๋นํ๊ณ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ค. ์ปจ์๋จธ๋ ํน์ ํ ํฝ์ ํํฐ์ ์์ ๋ฉ์์ง๋ฅผ ์๋นํ๊ณ , ์ด ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๋ค. ๋ํ, ์ปจ์๋จธ๋ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ฌ ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ๋ณ๋ ฌ๋ก ๋ฉ์์ง๋ฅผ ์๋นํ ์ ์์ด ๊ณ ๊ฐ์ฉ์ฑ ๋ฐ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ค.
Kafka ์๋ฒ ๊ตฌ์ถ
- ๋ฆฌ๋ ์ค 2๋ (Zookeeper + Broker, Producer), ์ธํ ๋ฆฌ์ ์ด ํ๋ก์ ํธ 1๊ฐ (Consumer)
๋ฆฌ๋ ์ค 1 (Zookeeper + Broker)
1. ๋คํธ์ํฌ ์ค์
2. ์๋ฐ ์ค์น openjdk11
3. wget ๋ค์ด
4. kafka ๋ค์ด ๋ฐ ์์ถ ํ๊ธฐ ( tar -zvxf [ํ์ผ๋ช
] )
5. kafka ์์ถ ๊ณณ์์ Zookeeper ์คํ
./bin/zookeeper-server-start.sh ./config/zookeeper.properties
6. ์๋ฒ ํ๊ฐ ๋ ํค๊ณ , kafka ์์ถ ํผ ๊ณณ์์ Kafka์คํ
./bin/kafka-server-start.sh ./config/server.properties
๋ฆฌ๋ ์ค 2 (Producer)
1. ๋คํธ์ํฌ ์ค์
2. ์๋ฐ ์ค์น openjdk11
3. wget ๋ค์ด
4. kafka ๋ค์ด ๋ฐ ์์ถ ํ๊ธฐ ( tar -zvxf [ํ์ผ๋ช ] )
5. Kafka ์ค์ ํ์ผ config/server.properties ์์
advertise ๋ถ๋ถ ์ฃผ์ ์ ๊ฑฐํ๊ณ , broker IP์ฃผ์ ์จ์ฃผ๊ธฐ
6. kafka ์์ถ ๊ณณ์์ Producer ์คํ
./bin/kafka-console-producer.sh --bootstrap-server [๋ฆฌ๋
์ค 1 IP์ฃผ์]:9092 --topic emailcert --property "parse.key=true" --property "key.separator=:"
MSA ํ๋ก์ ํธ (Consumer)
1. application.yml Kafka ์ค์ ์ถ๊ฐ
spring:
kafka:
consumer:
bootstrap-servers: [๋ฆฌ๋
์ค1 IP์ฃผ์]:9092
2. pom.xml ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.8.11</version>
</dependency>
3. CreateEmailCertConsumer.java
package com.example.demo.emailcert.adapter.kafka;
import com.example.demo.common.ExternalSystemAdapter;
import com.example.demo.emailcert.application.port.in.CreateEmailCertCommand;
import com.example.demo.emailcert.application.port.in.CreateEmailCertUseCase;
import com.example.demo.emailcert.application.port.out.CreateEmailCertPort;
import com.example.demo.emailcert.application.service.CreateEmailCertService;
import com.example.demo.emailcert.domain.EmailCert;
import lombok.RequiredArgsConstructor;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
@ExternalSystemAdapter
@RequiredArgsConstructor
public class CreateEmailCertConsumer {
private final CreateEmailCertUseCase createEmailCertUseCase;
@KafkaListener(topics = "emailcert", groupId = "emailcert-group-00")
void createEmailCert(ConsumerRecord<String, String> record){
System.out.println(record.toString());
createEmailCertUseCase.createEmailCert(CreateEmailCertCommand.builder()
.email(record.value())
.build());
}
}
์คํ๊ฒฐ๊ณผ
์์ ๊ฐ์ด ์ค์ตํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด 3๊ฐ์ ์ฐฝ์ผ๋ก ์๋ฒ๊ฐ ์คํ๋๋ค.
Producer๊ฐ ์๋ง๊ฒ ์คํ๋๋ฉด
> ๋ก ์ฝ์์ฐฝ์ด ๋ฌ๋ค. Producer์ ์คํํ ๋ --topic ์ต์ ์ผ๋ก "emailcert"๋ฅผ ์ฃผ์ด์ ํ ํฝ์ ์ฐพ์๊ฐ๋๋ก ํ๊ณ , ๋ฌธ์์ด์ ํ์ฑํ ์ ์๋๋ก --property ์ต์ ์ผ๋ก parse.key=true --property key.seperator=: ๋ฅผ ์ฃผ์๋ค.
email:tatpo0o0o0o0@gmail.com ์ ์ ๋ ฅ์ ๋ฃ์ด์ฃผ๋ฉด, : ๋ก ํ์ฑ๋์ด DB์ ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๋ ์ธํ ๋ฆฌ์ ์ด(Consumer)์์ ๋ฉ์ธ์ง๋ฅผ ๋ฐ๊ณ , DB๋ก ์ ์ฅ๊น์ง ๋๋ ๊ฒ์ ๋ก๊ทธ๋ก ํ์ธํ ์ ์๋ค.
[์ฐธ๊ณ ]
[Apache Kafka] ์นดํ์นด๋ ๋ฌด์์ธ๊ฐ?
์นดํ์นด, ๋ฐ์ดํฐ ํ๋ซํผ์ ์ต๊ฐ์ ์ฑ ์ ๊ณต๋ถํ๋ฉฐ ์ด ์ ๋ฆฌ ๊ธ ์ ๋๋ค.์นดํ์นด(Kafka)๋ ํ์ดํ๋ผ์ธ, ์คํธ๋ฆฌ๋ฐ ๋ถ์, ๋ฐ์ดํฐ ํตํฉ ๋ฐ ๋ฏธ์ ํฌ๋ฆฌํฐ์ปฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ์ค๊ณ๋ ๊ณ ์ฑ๋ฅ ๋ถ์ฐ ์ด๋ฒคํธ
velog.io