LinkedIn์์ ์ต์ด๋ก ๋ง๋ค๊ณ opensourceํ ํ ํ์ฅ์ฑ์ด ๋ฐ์ด๋ ๋ถ์ฐ ๋ฉ์์ง ํ(FIFO : First In First Out)
โ ๋ถ์ฐ ์ํคํ ์ณ ๊ตฌ์ฑ, Fault-toleranceํ architecture(with zookeeper), ๋ฐ์ดํฐ ์ ์ค ๋ฐฉ์ง๋ฅผ ์ํ ๊ตฌ์ฑ์ด ์๋์ด ์์
โ AMQP, JMS API๋ฅผ ์ฌ์ฉํ์ง ์์ TCP๊ธฐ๋ฐ ํ๋กํ ์ฝ ์ฌ์ฉ
โ Pub / Sub ๋ฉ์์ง ๋ชจ๋ธ์ ์ฑ์ฉ
โ ์ฝ๊ธฐ / ์ฐ๊ธฐ ์ฑ๋ฅ์ ์ค์
โ Producer๊ฐ Batchํํ๋ก broker๋ก ๋ฉ์์ง ์ ์ก์ด ๊ฐ๋ฅํ์ฌ ์๋ ๊ฐ์
โ ํ์ผ ์์คํ ์ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๋ฏ๋ก, ๋ฐ์ดํฐ์ ์์์ฑ ๋ณด์ฅ
โ Consume๋ ๋ฉ์์ง๋ฅผ ๊ณง๋ฐ๋ก ์ญ์ ํ์ง ์๊ณ offset์ ํตํ consumer-group๋ณ ๊ฐ๋ณ consume๊ฐ๋ฅ
์นดํ์นด๋ ๋ฉ์ธ์งํ์ด๋ฉฐ, ๋ฉ์ธ์งํ์ ๋ชฉ์ ์ ๋จ์ํ๋ค. ๋ฉ์ธ์ง๋ฅผ ํ๊ณณ์ ๋์ง๊ณ ๊ทธ๊ฑธ ํ์ํ ์ฃผ์ฒด๊ฐ ๊ฐ์ ธ๋ค ์ฒ๋ฆฌํ๋ค. ์ด๊ฑด RabbitMQ, ์นดํ์นด, ๋ฉค์บ์ ๋ฑ ๋ค์์ ์ ํ๋ค์ ๊ธฐ๋ณธ๊ธฐ๋ฅ์ด๋ค. ์ผ๋จ ๋ฉ์ธ์งํ๋ฅผ ๊ฐ์ฅ ๋ง์ด์ฐ๋ ์๋น์ค๋ ๋ก๊ทธ ๊ด๋ฆฌ์ด๋ค. ์ด๋ ํ์ฌ๋ค ๋ก๊ทธ๊ด๋ฆฌ์ ํ์์ฑ์ ๊ฐ์ง๊ฒ ๋๊ณ ๊ทธ์ ๋ง๋ ๋ก๊ทธ ์์คํ ์ ๊ตฌ์ถํ๋ค.
๐ฉ RabbitMQ
๊ตฌ์ฑ์ด ์ฝ๋ค.
์ ์ฐํ ๋ผ์ฐํ ์ด ๊ฐ๋ฅํ๋ฉด ๊ด๋ฆฌ UI ๊ฐ ํธ๋ฆฌํ๋ค.
์ ํ ์ฑ์๋๊ฐ ๋๋ค.
๊ฐ๋ฐฉํ ํ๋กํ ์ฝ์ ์ํ AMQP ๋ฅผ ๊ตฌํ ์ํด ๊ฐ๋ฐ
ํ์์ ๋ฐ๋ผ ๋๊ธฐ/๋น๋๊ธฐ์์ด ๊ฐ๋ฅํจ
์๋น์์ค์ฌ์ ์ค๊ณ
20k/sec ์ฒ๋ฆฌ๋ฅผ ๋ณด์ฅ
๐ฉ Apache Kafka
๊ตฌ๋ ๋ฐฉ์์ ๋น๋๊ธฐ์ ๊ตฌ์ฑ
๊ณ ์ฑ๋ฅ ๊ณ ๊ฐ์ฉ์ฑ
๋ถ์ฐ์ฒ๋ฆฌ์ ํจ๊ณผ์ ์ผ๋ก ์ค๊ณ ๋จ.
์์ฐ์ ์ค์ฌ์ ์ค๊ณ
๋ฒ์ฉ ๋ฉ์ธ์ง ์์คํ ์์ ์ ๊ณต๋๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณต๋์ง ์์.
100k/sec ์ฒ๋ฆฌ๋ฅผ ๋ณด์ฅ
Broker : Kafka๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ ์๋ฒ 1๋ = 1 broker
Topic : Data๊ฐ ์ ์ฅ๋๋ ๊ณณ
Producer : Broker์ data๋ฅผ writeํ๋ ์ญํ
Consumer : Broker์์ data๋ฅผ readํ๋ ์ญํ
Consumer-Group : ๋ฉ์ธ์ง ์๋น์ ๋ฌถ์ ๋จ์(n consumers)
Zookeeper : Kafka๋ฅผ ์ด์ฉํ๊ธฐ ์ํ Coordination service(zookeeper ์๊ฐ)
Partition : topic์ด ๋ณต์ฌ(replicated)๋์ด ๋๋์ด์ง๋ ๋จ์
Producer : ๋ฐ์ดํฐ ๋ฃ์
Consumer : ๋ฐ์ดํฐ ๊ฐ์ ธ๊ฐ
Topic : ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ = ํ ์ด๋ธ
( ํ ํฝ ๋ช ํ์คํ ์ , ์ ์ง๋ณด์์ ํธ๋ฆฌ)
๐ ํํฐ์ ์ ๋๋ฆฌ๋๊ฒ์ ๊ฐ๋ฅํ์ง๋ง, ๋ค์ ์ค์ผ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผํ๋ฉฐ ํํฐ์ ์ ๋๋ฆฌ๋ฉด ์ปจ์๋จธ ๊ฐฏ์๋ฅผ ๋๋ ค์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ถ์ฐ์ํฌ ์ ์๋ค.
ํ๋์ ํ ํฝ์ ์ฌ๋ฌ๊ฐ์ ํํฐ์ ์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ผ๋ฉฐ 0๋ฒ๋ถํฐ ํํฐ์ ์์
ํ๋์ ํํฐ์ ์ ํ์ ๊ฐ์ด ๋ด๋ถ์ ๋ฐ์ดํฐ๊ฐ ํํฐ์ ๋์์ ๋ถํฐ ์ฐจ๊ณก ์์ด๊ฒ ๋จ
์ฐจ๊ณก ์์ธ ๋ฐ์ดํฐ๋ ์ปจ์๋จธ๊ฐ ๊ฐ์ฅ ์ค๋๋ ์์๋๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ
๋์ด์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค์ง ์์ผ๋ฉด ์ปจ์๋จธ๋ ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ๋ ๊น์ง ๊ธฐ๋ค๋ฆผ
์ปจ์๋จธ๊ฐ ๋ฐ์ดํฐ ( reord )๋ค์ ๊ฐ์ ธ๊ฐ๋ ๋ฐ์ดํฐ๋ ์ญ์ ๋์ง ์์
= ํํฐ์ ์ ๊ทธ๋๋ก ๋จ๊ฒ๋๋๊ฒ
์๋ก์ด ์ปจ์๋จธ๊ฐ ๋ถ์์๋ ๋ค์ 0๋ฒ๋ถํฐ ๊ฐ์ ธ๊ฐ์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
๋ค๋ง ์ปจ์๋จธ ๊ทธ๋ฃน์ด ๋ฌ๋ผ์ผํ๊ณ , outo.offset.reset = earlist ์ธํ ๋์ด์ผํ๋ค.
๋์ผ๋ฐ์ดํฐ์ ๋ํด์ ๋๋ฒ ์ฒ๋ฆฌ๊ฐ๋ฅ
ํํฐ์
์ด ๋๊ฐ์ผ ๊ฒฝ์ฐ
( ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ๋ ํค๋ฅผ ์ง์ ๊ฐ๋ฅํ๋ค. )
1) ํค๊ฐ null์ด๊ณ , ๊ธฐ๋ณธํํฐ์ ๋ ์ฌ์ฉํ ๊ฒฝ์ฐ
โก๏ธ ๋ผ์ด๋๋ก๋น์ผ๋ก ํ ๋น
2) ํค๊ฐ ์๊ณ , ๊ธฐ๋ณธํํฐ์ ๋ ์ฌ์ฉํ ๊ฒฝ์ฐ
โก๏ธ ํค์ ํด์ ๊ฐ์ ๊ตฌํ๊ณ , ํน์ ํํฐ์ ์ ํ ๋น
๋ ์ฝ๋๊ฐ ์ ์ฅ๋๋ ์ต์ฌ์๊ฐ๊ณผ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์์
log.retention.ms : ์ต๋ record ๋ณด์กด์๊ฐ
log.retention.byte: ์ต๋ record ๋ณด์กดํฌ๊ธฐ
๐ก Broker, Replication, ISR
Broker : ์นดํ์นด๊ฐ ์ค์น๋์ด ์๋ ์๋ฒ๋จ์ (๋ณดํต 3๊ฐ์ด์ ๊ถ์ฅ )
Replication: ๋ณต์ / ๊ฐ์ฉ์ฑ๋ณด์ฅ (ex. Replication 3๊ฐ = ์๋ณธ 1๊ฐ, ๋ณต์ ๋ณธ 2๊ฐ ) = ๋ธ๋ก์ปค ๊ฐ์์ ๋ฐ๋ผ์ Replication ๊ฐ์๊ฐ ์ ํ๋๋ค.
์๋ณธ : Leader partiton (ํ๋ก๋์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ๋ฐ๋ ๊ณณ)
๋ณต์ ๋ณธ : Follower partiton
Leader partiton + Follower partiton โก๏ธ In Sync Replica (ISR)
- topic์ ํด๋นํ๋ ๋ฉ์์ง๋ฅผ ์์ฑ
- ํน์ topic์ผ๋ก ๋ฐ์ดํฐ๋ฅผ publish
- ์ฒ๋ฆฌ ์คํจ/์ฌ์๋
ํ๋ก๋์์ ack ๋์ โก๏ธ ์์ธ์ต์ โก๏ธ ๊ณ ๊ฐ์ฉ์ฑ ์ ์ง
๐ก ack ์ข ๋ฅ : 0, 1, all
0: ๋ฐ์ดํฐ ์ ์ก ํ์ธ ์๋ต๊ฐ X , ํํฐ์
๋ณต์ ์๋ต๊ฐ X
1: ๋ฐ์ดํฐ ์ ์ก ํ์ธ ์๋ต๊ฐ O , ํํฐ์
๋ณต์ ์๋ต๊ฐ X
all: ๋ฐ์ดํฐ ์ ์ก ํ์ธ ์๋ต๊ฐ O , ํํฐ์
๋ณต์ ์๋ต๊ฐ O
=> (๋์ ์๋๊ฐ ํ์ ํ ๋๋ฆฌ์ง๋ง ๊ฐ์ฅ๊ตฟ)
Replication ๊ฐ์๊ฐ ๋ง์ผ๋ฉด ?
๋ธ๋ก์ปค์ ๋ฆฌ์์ค ์ฌ์ฉ๋๋ ๋์ด๋๊ฒ ๋จ์ ์ฃผ์ํ์
์ถ์ฒ : https://blog.voidmainvoid.net/179
https://ellune.tistory.com/29