ํธ๋์ญ์ ๋ ๋ฉ์์ง์๋, ๊ทธ๋ฅ PostgreSQL ์ฐ์ธ์
ํธ๋์ญ์ ๋ ๋ฉ์์ง์๋, ๊ทธ๋ฅ PostgreSQL ์ฐ์ธ์ ๊ด๋ จ
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ๋ฐ์ดํฐ ๋ถ์์ ์ํด ๋ค๋ฅธ ์์คํ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ ์ฃผ๊ธฐ ์ํด ๋ฌธ์์ ๋ฉ์ผ์ ๋ณด๋ด๋ ๋ฑ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ์ํฉ์ ์๊ฐ๋ณด๋ค ์์ฃผ ๋ง์ดํ๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ํํ ์ํ์น ์นดํ์นด(Apache Kafka)๋ AWS SQS ๊ฐ์ ๋ฉ์์ง ํ(Message Queue)๋ฅผ ๋์ ํ๊ณค ํ๋ค. ๋ค๋ง ๋ฌธ์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฉ์์ง ํ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋จ์ผ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ๊ธฐ ์ด๋ ค์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์๋ค๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด, ๋น์ฆ๋์ค ๋ก์ง์ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ ํ ๋ค์ ๋ฉ์์ง ํ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค. ์ด๋ ํธ๋์ญ์ ๋ด์์ ์ํํ ํ์ ๋น์ฆ๋์ค ๋ก์ง์์ ์ค๋ฅ๊ฐ ์๊ธฐ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋กค๋ฐฑ(Rollback)๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ๋ฉ์์ง ํ์ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ๋ค์ ํ์ํ๊ธฐ๋ ์ด๋ ต๋ค.
์ด๋ฅผ ๋ง๊ธฐ ์ํด ์์๋ฅผ ๋ฐ๊ฟ ์ค๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์ปค๋ฐ ํ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์๋ ์๋ค. ํ์ง๋ง ๋คํธ์ํฌ ๋ฌธ์ ๋ ๋๋ ๋งํผ ํํ๊ธฐ์ ์ฅ์ ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๋ฐ ์คํจํ ์ ์๋ค. ์ด๋ฌํ ์คํจ์ ๋๋นํ๋ ค๋ฉด ์ด๋์๊ฐ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ ๋ค์ ์๋ํด์ผ ํ๋ค. ์ด โ์ด๋์๊ฐ ์ ์ฅํด์ผ ํ๋คโ๋ ์ ์ ๋ ์ฐ๋ฆฌ๋ฅผ ๋ค์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ฌธ์ ๋ก ๋ณด๋ธ๋ค.
ํธ๋์ญ์ ๋ ๋ฉ์์ง(Transactional Messaging)์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ํธ๋์ญ์ ๋ ๋ฉ์์ง์ด๋ โ๋ฉ์์ง๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์ ์ผ๋ถ๋ก ๋ฐํํ๋ ๊ฒโ์ ์๋ฏธํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ ํ๋ ์์ ๊ณผ ๋ฉ์์ง ํ์ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ ์์ , ๋ ๊ฐ์ง ์์ ์ ์์์ ์ผ๋ก ์ํํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ด๋ค.[1]
์ด ๊ธ์์๋ ํธ๋์ญ์ ๋ ๋ฉ์์ง์ ๊ตฌํํ๋ ๋ ๊ฐ์ง ํจํด์ ์๊ฐํ๋ค. ์ด์ด ํฌ์คํธ๊ทธ๋ ์คํ์(PostgreSQL)์ ์ด์ฉํ์ฌ ์ด๋ฅผ ๋ ๋จ์ํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฌ๋ค.
ํธ๋์ญ์ ๋ ๋ฉ์์ง์ ๊ตฌํํ๋ ๋ ๊ฐ์ง ํจํด
<๋ง์ดํฌ๋ก์๋น์ค ํจํด>์ ์ ์ ํฌ๋ฆฌ์ค ๋ฆฌ์ฐจ๋์จ์ ํธ๋์ญ์ ๋ ๋ฉ์์ง์ ๊ตฌํํ๋ ๋ ๊ฐ์ง ํจํด์ ์ธ๊ธํ๋ค. ๋ ํจํด ๋ชจ๋ ์์๋ฐ์ค(Outbox)๋ผ๋ ํ ์ด๋ธ์ ๋ฉ์์ง ํ๋ก ์ฌ์ฉํ๋ค.
๋จผ์ ์๊ฐํ ํจํด์ ํธ๋์ญ์ ๋ ์์๋ฐ์ค(Transactional outbox) ํจํด์ผ๋ก, ๋ฉ์์ง ํ์ ๋ฉ์์ง๋ฅผ ๋ฐ๋ก ๋ณด๋ด์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์๋ฐ์ค ํ ์ด๋ธ์ ๋ฃ๋ ๋ฐฉ์์ด๋ค. ์ด์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ฉด ์ฃผ๊ธฐ์ ์ผ๋ก ์์๋ฐ์ค ํ ์ด๋ธ ๋ด์ฉ์ ์ฝ์ด ๋ฉ์์ง ํ์ ๋ณด๋ด๋ ๊ฒ์ด๋ค.
๋ ๋ค๋ฅธ ํ๋๋ ํธ๋์ญ์ ๋ก๊ทธ ํ ์ผ๋ง(Transaction log tailing) ํจํด์ด๋ค. ์์๋ฐ์ค ํ ์ด๋ธ์ ํ์ ๋ณด๋ผ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๋ ๊ฒ๊น์ง๋ ๊ฐ์ง๋ง ์์๋ฐ์ค ํ ์ด๋ธ์ ๋ด์ฉ์ ์ฝ๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ค. ์ด ํจํด์ ์ ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ๋ก๊ทธ[2]๋ฅผ ์ฝ๊ณ ์์๋ฐ์ค ํ ์ด๋ธ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ๋ง์ ํํฐ๋ง(Transaction log miner)ํด ๋ฉ์์ง ํ์ ๋ณด๋ธ๋ค.
์ฆ๊ฐํ๋ ์ฐ๋ฐ์ ๋ณต์ก์ฑ
1986๋ ํ๋ง์ ์์์์ด์ ์ฑ <๋งจ๋จผ์ค์ ๋ฏธ์ >, ๊ทธ๋ฆฌ๊ณ โ์ํํ์ ์๋คโ๋ผ๋ ๋ง๋ก ์ ์๋ ค์ง ํ๋ ๋ ๋ธ๋ฃฉ์ค๋ ์ํํธ์จ์ด ์์ง๋์ด๋ง์์ ๋ณต์ก์ฑ์ ๋ ๊ฐ์ง ์ ํ(Types of complexity)์ผ๋ก ๊ตฌ๋ถํ๋ค.
- ๋ณธ์ง์ ๋ณต์ก์ฑ(essential complexity)
- ์ฐ๋ฐ์ ๋ณต์ก์ฑ(accidental complexity)
๋ณธ์ง์ ๋ณต์ก์ฑ์ ๋๋ฉ์ธ ์์ฒด์์ ๋น๋กฏ๋๋ ๋ณต์ก์ฑ์ด๋ค. ์ฆ, ๋น์ฆ๋์ค ๋ฒ์๋ฅผ ์ค์ด์ง ์๊ณ ๋ ์ ๊ฑฐํ ์ ์๋ ๊ฒ์ผ๋ก ์ฝ๊ฒ ๋งํ์๋ฉด ๋ค๋ฃจ๋ ์ ๋ฌด๊ฐ ๋ณต์กํ ๊ฒ์ด๋ค.[3]
๋ฐ๋ฉด ์ฐ๋ฐ์ ๋ณต์ก์ฑ์ ์ต์ ํ๋ ํตํฉ ๋ฑ์ ์ด์ ๋ก ๋์ ํ ํ๋ ์์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ค์์ ๋น๋กฏ๋๋ ๋ณต์ก์ฑ์ด๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ฉ์์ง ํ๋ฅผ ๋์ ํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฉ์์ง ํ ์ฌ์ด์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ค ํธ๋์ญ์ ๋ ์์๋ฐ์ค ํน์ ํธ๋์ญ์ ๋ก๊ทธ ํ ์ผ๋ง์ ๊ตฌํํ๋ ๊ณผ์ ์ ์ด๋ฌํ ์ฐ๋ฐ์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํจ๋ค.
๋๋ ์์คํ ์ ์ค๊ณํ ๋ ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ ๊ฑฐํ๋ ์ชฝ์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค. ๊ฒฝํ์ ์ผ๋ก ์ํํธ์จ์ด ๋น์ฉ ์ค ๋ง์ ๋ถ๋ถ์ด ์์ฌ์ํต์ผ๋ก ์๋น๋๊ธฐ ๋๋ฌธ์ด๋ค. ์์คํ ์ด ๋จ์ํ ์๋ก ๊ทธ๋งํผ ์์ฌ์ํตํ ์ผ๋ ์ค์ด๋ ๋ค.
๊ทธ๋ฅ PostgreSQL ์ฐ์ธ์
์ผ๋ง ์ โ๊ทธ๋ฅ Postgres ์ฐ์ธ์โ๋ผ๋ ๊ธ์ด ๋จ๊ฑฐ์ด ๊ด์ฌ์ ๋ฐ์๋ค. ๋น์ทํ ๊ฒฐ๋ก ์ด์ ์๋ โPostgreSQL๋ฉด ์ถฉ๋ถํ๋คโ๋ผ๋ ๊ธ๋ ์์๋ค. ์ด๋ฐ ๊ธ์ ํฌ์คํธ๊ทธ๋ ์คํ์์ด ๊ฐ์ฒด-๊ด๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค(object-relational database)๋ฅผ ํ๋ฐฉ[4]ํ๊ณ ์์ง๋ง, ํ์ฅ์ ํตํด ๋ฉ์์ง ํ, ๊ทธ๋ํ, ์บ์, ๋ฒกํฐ ๋ฑ์ ์ง์ํ๋ค๋ ์ฌ์ค์ ๋ฐํ์ผ๋ก ์ฐ์๋ค.
์ด๋ฌํ ํฌ์คํธ๊ทธ๋ ์คํ์์ ๋ค์ํ ์ฐ์์๋ ๊ท๋ชจ๊ฐ ์๊ฑฐ๋ MVP(Minimum Viable Product)๋ฅผ ๋ง๋ค์ด ๊ฒฐ๊ณผ๋ฅผ ๋นจ๋ฆฌ ๋ด์ผ ํ๋ ์กฐ์ง์ ๋งค๋ ฅ์ ์ด๋ค. ๊ธฐ์ ์คํ์ด ๋ถํ์ํ๊ฒ ๋ณต์กํด์ง๋ ๊ฒ์ ๋ง์ ์ฐ๋ฐ์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํค์ง ์๊ณ ๋ ๋จ์ํ๊ฒ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ์ ์ํด ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
ํฌ์คํธ๊ทธ๋ ์คํ์๋ก ํธ๋์ญ์ ๋ ๋ฉ์์ง์ ๋ ๋จ์ํ๊ฒ
์ฒซ๋จธ๋ฆฌ์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ํธ๋์ญ์ ๋ ๋ฉ์์ง์ ํต์ฌ์ ์ ํ๋ฆฌ์ผ์ด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ ํ๋ ์์ ๊ณผ ๋ฉ์์ง ํ์ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ ์์ , ๋ ์์ ์ ์์์ ์ํ์ด๋ค. ๋ฌธ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฉ์์ง ํ๋ฅผ ๋จ์ผ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ๊ธฐ ์ด๋ ค์ด ๋ฐ ์์๋ค.
PGMQ(Postgres Message Queue) (tembo-io/pgmq
)๋ ํฌ์คํธ๊ทธ๋ ์คํ์์ ๋ฉ์์ง ํ๋ก ํ์ฅํ ๊ฒ์ด๋ค. ํฌ์คํธ๊ทธ๋ ์คํ์๊ณผ PGMQ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋จ์ผ ํธ๋์ญ์
์ผ๋ก ๋ ๊ฐ์ง ์์
์ ๋ฌถ์ ์ ์๋ค. ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ค ์ค๋ฅ๋ก ํธ๋์ญ์
์ ๋กค๋ฐฑํ๋ฉด, PGMQ์ ๋ฃ์๋ ๋ฉ์์ง ์ญ์ ํจ๊ป ๋กค๋ฐฑํ๋ค๋ ๋ป์ด๋ค.
PGMQ ์ฌ์ฉ๋ฒ์ ๋งค์ฐ ๋จ์ํ๋ค. ํฌ์คํธ๊ทธ๋ ์คํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์์ SQL์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ถ์ฐ ํ๊ฒฝ ์ค์์ ์นดํ์นด๋ฅผ ๋๊ณ ๋ฐ์ดํฐ๋ฅผ ํตํฉํ๋ ์๋๋ฆฌ์ค์์ ์นดํ์นด๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋์๋ ์ด ๋ฐฉ์์ ์ ํจํ๋ค. PGMQ์ ๋ฉ์์ง๋ฅผ ์ฝ์ด ์นดํ์นด๋ก ๋ณด๋ด๋ ๋ฉ์์ง ๋ฆด๋ ์ด(MessageRelay)๋ฅผ ์ถ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋๊ตฐ๊ฐ๋ ์ด๋ ๊ฒ ์ฐ๋ฉด โ์์๋ฐ์ค ํ ์ด๋ธ์ ์ฐ๋ ๊ฒ๊ณผ ๋ฌด์์ด ๋ค๋ฅด๋โ๊ณ ๋ฐ๋ฌธํ ์ ์๊ฒ ๋ค. ๊ทธ๋ฌ๋ ํธ๋์ญ์ ๋ ์์๋ฐ์ค ํจํด์์๋ ์์๋ฐ์ค ํ ์ด๋ธ์ ์ง์ ๊ตฌ์ฑํด์ผ ํ๋ค. ๋, ๋ฉ์์ง๋ฅผ ๋ค์ ๋ณด๋ด์ง ์๊ธฐ ์ํด ๋ฉ์์ง ํ์ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ์ญ์ ํ๊ฑฐ๋ ํ์ํ๋ ๋ฉ์ปค๋์ฆ ์ญ์ ์ง์ ๊ตฌํํด์ผ ํ๋ค. ๊ฒ๋ค๊ฐ ์์๋ฐ์ค ํ ์ด๋ธ์ ํ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉ์์ง ๋ฆด๋ ์ด๊ฐ ์ฌ๋ฌ ๊ฐ๊ฐ ๋ ๊ฒฝ์ฐ, EIP(Enterprise Integration Patterns)์์ ๋งํ๋ ๊ฒฝ์ ์๋น์(Competing Consumers)๊น์ง ๊ณ ๋ คํด์ผ ํ๋ค.
๋ฐ๋ฉด PGMQ๋ ๋ฉ์์ง๋ฅผ ์ญ์ ํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ค. ๊ทธ๋ฟ๋ง ์๋๋ผ ๋ฉ์์ง๋ฅผ ์ฝ์ ๋ [VT(Visibility Timeout) (tembo-io/pgmq
)](https://github.com/tembo-io/pgmq?tab=readme-ov-file#visibility-timeout-vt) ์ต์
์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ ์๋น์๋ฅผ ๊ตฌํํ๋ ๊ฒ ์์ฝ๋ค.
๋ง์น๋ฉฐ
ํธ๋์ญ์ ๋ ๋ฉ์์ง์ ์๊ฐ๋ณด๋ค ๋ค๋ฃจ๊ธฐ ๊น๋ค๋ก์ด ๋ฌธ์ ๋ค. ๊ทธ๋ฌ๋ ํฌ์คํธ๊ทธ๋ ์คํ์๋ก ์ฐ๋ฐ์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํค์ง ์๊ณ ๋ ๋จ์ํ๊ฒ ๋ฌธ์ ๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
๋๋ ๋ชจ๋ ๊ณณ์ ํฌ์คํธ๊ทธ๋ ์คํ์์ ์ฐ์๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ ์๋๋ค. ๊ฐ์๊ฐ ์ฒํ ๋งฅ๋ฝ์ ๋ฐ๋ผ ๊ธฐ์ ์ ํ์ ๋ฌ๋ผ์ง ์๋ฐ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ค๋ง ์ด๋ค ๊ธฐ์ ์ด ๋ด๊ฐ ์ฒํ ๋งฅ๋ฝ์์ ํจ์จ์ ์ธ์ง ํ๋จํ๊ธฐ ์ํด์๋ ์ฌ๋ฌ ์ ํ์ง๋ฅผ ์์์ผ ํ๋ ๋ฒ์ด๋ค. ์ด ๊ธ์ด ๊ธฐ์ ์ ํ์ ๊ณ ๋ฏผํ๋ ๊ฐ๋ฐ์์๊ฒ ๋ค์ํ ์ ํ์ง ์ค ํ๋๊ฐ ๋๊ธฐ๋ฅผ ๋ฐ๋๋ค.
๋ง์ดํฌ๋ก์๋น์ค ํจํด, ํฌ๋ฆฌ์ค ๋ฆฌ์ฒ๋์จ, ๊ธธ๋ฒ โฉ๏ธ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ณ๊ฒฝ ์ฌํญ(์. ํ ์ด๋ธ ์์ฑ, ํ ์ด๋ธ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋ฑ)์ ๋ก๊ทธ๋ก ๊ธฐ๋กํ๋ ๋ฐ ์ด๋ฅผ ํธ๋์ญ์ ๋ก๊ทธ ํน์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ผ๊ณ ๋ถ๋ฅธ๋ค. โฉ๏ธ
๋ณต์กํ ์ ๋ฌด ์์๋ โ๋ณต์กํ ์ ๋ฌด ์ฝ๋๋ฅผ ๋น ๋ฅด๊ฒ ๋ถ์ํ๊ธฐโ๋ฅผ ์ฐธ๊ณ ํ๋ผ. โฉ๏ธ
ํฌ์คํธ๊ทธ๋ ์คํ์ ๊ณต์ ๋ฌธ์: What is PostgreSQL โฉ๏ธ