๋ชฉ์ฐจ
- Event ๋
- Event Driven Architecture ๋
- Event Driven Architecture ์ ๊ตฌํ ๋ชจ๋ธ
- Event-Driven-Architecture ์์ ๊ณ ๋ คํด์ผํ ๋ฌธ์ ๋ค
Event ๋
Event ๋ ๋ฌด์์ผ๊น?
Event ์ ๊ฐ๋ ์ ๊ฐ๋จํ๋ค.
์ด๋ฒคํธ๋ ๊ณผ๊ฑฐ์ ์ผ์ด๋ ์ด๋ ํ ์ฌ๊ฑด์ด๋ค.
Event-Streaming-Platform ์์๋ ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ํตํด์ ๋ถ์ฐ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ ์ด๋ ํ side effect ๋ฅผ ์ผ์ผํค๊ฑฐ๋ ํน์ process ๋ฅผ trigger ํ๋ฉฐ ์ด๋จ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํ๋ฅผ ํ๊ธฐ๋ ํ๋ค.
์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์ฌ๋ฌ ์ด์ ๊ฐ ์๊ฒ ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ์๊ฐํ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ฐ๋ก ์์คํ ๊ฐ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ค.
์๋ฅผ ๋ค์ด์ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๋ด๋ณด์.
@Service
@RequiredArgsConstructor
public class OrderCancelService {
private final OrderRepository repository;
public void cancelBy(Long orderId) {
Order order = repository.findById(orderId).orElseThrow(NoSuchElementException::new);
order.cancel();
repository.save(order);
}
}
OrderCancelService
๋ ์ฃผ๋ฌธ์ ์ทจ์ํ๋ ์ด๋ค ์ํฉ์ ์ฝ๋๋ก ํํํ ๊ฒ์ด๋ค.
cancelBy
๋ผ๋ ๋ฉ์๋๋ฅผ ์ฝ์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ ํ๋ค.
- orderId ๋ก Order ๋ฅผ ์กฐํํ๋ค.
- Order ๋ฅผ cancel, ์ทจ์ํ๋ค
- ์ทจ์๋ order ๋ฅผ update ํ๋ค.
์ฌ๊ธฐ์ ์ด๋ค ์๊ตฌ์ฌํญ์ด ์ถ๊ฐ๋์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ฃผ๋ฌธ์ด ์ทจ์๋๋ฉด ํด๋น ์ฃผ๋ฌธ์ ๋ฐ๋ฅธ ๋ฉค๋ฒ์ญ์ ํด์ง์์ผ์ผ ํ๋ค
๊ทธ๋ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ฐํ ์ ์์ ๊ฒ์ด๋ค.
@Service
@RequiredArgsConstructor
public class OrderCancelService {
private final OrderRepository orderRepository;
private final MembershipRepository membershipRepository;
public void cancelBy(Long orderId) {
Order order = orderRepository.findById(orderId).orElseThrow(NoSuchElementException::new);
order.cancel();
orderRepository.save(order);
// Membership ํด์ง
Membership found = membershipRepository.findByOrderId(orderId).orElseThrow(NoSuchElementException::new);
found.terminate();
membershipRepository.save(found);
}
}
ํด๋น ์ฃผ๋ฌธ์ id ๋ฅผ ํตํด์ membership ์ ์กฐํํ๊ณ ๋ ์ ์ฅํ๊ณ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ค์๊ฐ์์ผ๋ก ์๋ก์ด ์๊ตฌ์ฌํญ์ด ๋ ์ถ๊ฐ๋์๋ค.
๋ฉค๋ฒ์ญ์ด ํด์ง๋๋ฉด ํด๋น ๋ฉค๋ฒ์ญ์ ๊ฐ์ง๊ณ ์๋ ์ฌ์ฉ์์๊ฒ ํด์ง ๋ฌธ์๋ฅผ ๋ณด๋ด๋ฌ๋ผ๊ณ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ฐํ ์ ์์ ๊ฒ์ด๋ค.
@Service
@RequiredArgsConstructor
public class OrderCancelService {
private final OrderRepository orderRepository;
private final MembershipRepository membershipRepository;
private final NotificationService notificationService;
public void cancelBy(Long orderId) {
Order order = orderRepository.findById(orderId).orElseThrow(NoSuchElementException::new);
order.cancel();
orderRepository.save(order);
// Membership ํด์ง
Membership found = membershipRepository.findByOrderId(orderId).orElseThrow(NoSuchElementException::new);
found.terminate();
Membership terminatedMember = membershipRepository.save(found);
PhoneNumber number = terminatedMember.getPhoneNumber();
notificationService.sendSms(number, "๋ฉค๋ฒ์ญ์ด ํด์ง๋์์ต๋๋ค. ์ด์ฉํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.");
}
}
์ด๋ ๊ฒ ํ๋ํ๋ ์๊ตฌ์ฌํญ์ด ์๊ธธ ๋ ๋ง๋ค ์ฝ๋๊ฐ ์์ ๋์ด์ผ ํ๊ณ ๊ฒฐ๊ตญ ๊ฐ๋ฐฉ ํ์ ์์น์ ์ด๊ธฐ๋ ๊ผด์ด ๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๋ค.
OrderCancelService
๋ ๋ฌด์์ ํ๋ ์ฑ
์์ ๊ฐ์ง๊ณ ์์๊น?
๋ฌธ์ ์ ์ก? ๋ฉค๋ฒ์ญ ํด์ง? ์ฃผ๋ฌธ ์ทจ์? ํ๋ถ?
๋ฌผ๋ก ์์ ์ฝ๋๋ ์ด๋ ์ ๋ ๋น์ฝ์ด ์กด์ฌํ์ง๋ง ์ด๋ฐ์์ผ๋ก ์ ์ ์๊ฐ์ด ์ง๋ ๋๋ง๋ค ๊ฐ์๊ฐ ๊ฐ์ ธ์ผํ๋ ์ฑ ์์ด ๋ถ๋ฌธ๋ช ํด์ง๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ฌ๋ฌ ๋ฐฉ๋ฒ ์ค ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์์ ๊ฐ์ด ์ด๋ฒคํธ, ์ฆ ์ด๋ ํ ์ฌ๊ฑด์ ์ด์ฉํด์ ํด๋น ์ฌ๊ฑด์ ๊ด์ฌ์๋ ๊ฒ๋ค์๊ฒ ํ์ ์์ ์ ์์ฒญํ๊ฒ ํ ์ ์๋ค.
EDA, Event-Driven-Architecture ๋ ๋ฌด์์ผ๊น
Event-Driven-Architecture ๊ฐ ๋ฐ๋ก ์์์ ๋งํ ๋ฌธ์ ์ ํด๊ฒฐ์ ์ค๋ง๋ฆฌ๊ฐ ๋ ์ ์๋ ์ํคํ ์ฒ ์ค๊ณ ๊ธฐ๋ฒ์ด๋ค.
์์์ ๋ณด์ฌ์ค ์ผ๋ จ์ ์ฝ๋๋ค์ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐํํ๋ ์ด๋ฒคํธ์ธ๋ฐ, ์ด๋ฅผ ์์คํ ์ ์ผ๋ก ํ์ฅ์ํจ ๊ฒ์ด ๋ฐ๋ก Event Driven Architecture ์ด๋ค.
์์คํ ์์ ๋๊ธฐ์ ์ผ๋ก ์ด๋ ํ ํ๋ก์ธ์ค๊ฐ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ ๋๊ตฐ๊ฐ๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ฉด ํด๋น ์ด๋ฒคํธ์ ๊ด์ฌ์์ด๋ผ ํ๋ ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ํด๋น ์ด๋ฒคํธ๋ฅผ ์์ ํด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ํคํ ์ฒ์ด๋ค.
์ฆ, ์ ํต์ ์ธ ๋๊ธฐ ๋ฐฉ์ (Request-Response) ์ด ์๋๋ผ ์ด๋ค ์์ ์ด ํน์ ์ด๋ฒคํธ์ ๋ํด์ ์คํ๋๊ณ ํด๋น ์ด๋ฒคํธ์ ๋ํ ์๋ต์ผ๋ก ๋ฐ๋ฅธ ์์ ์ trigger ํ ์ ์์์ ์๋ฏธํ๋ค.
๊ทธ๋์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ asynchronous ํต์ ์ด๋ผ๊ณ ํํํ๊ธฐ๋ ํ๋ค.
์ด๋ ๊ฒ ์์คํ ์ด ๊ตฌ์ฑ๋๋ค๋ฉด ํน์ A ๋ผ๋ ์์คํ ์ B ๋ผ๋ ์์คํ ๊ณผ ํต์ ํ๊ธฐ ์ํด์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋ถํ์ํ ๊ณผ์ ์ด ์ฌ๋ผ์ง๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ Event ๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ํต์ ์ Fire and Forgot ์ด๋ผ๊ณ ํํํ๊ธฐ๋ ํ๋ค.
์ด๋ฌํ Event-Driven-Architecture ๊ฐ ํ๋์ ๊ฐ๊ด๋ฐ๋ ์ด์ ๊ฐ ์๋ค.
์ฌ์ค EDA ๋ ๊ฝค๋ ์ค๋๋ ๊ฐ๋ ์ด๋ผ๊ณ ํ๋ค.
martinfowler ์ ๋ธ๋ก๊ทธ์์ EDA ๋ผ๋ ๊ฐ๋ ์ด 2007 ๋ ์ ๊ธ, Focusing on Events ์์ ์๊ฐ๋๊ธฐ๋ ํ์ผ๋ฉฐ ๊ทธ๋ฆฌ ์ต์ ์ ๊ธฐ์ ์ ์๋๋ค.
ํ์ง๋ง ํ๋์ ๋ค์ด์ EDA ์ ํต์ฌ ์ปจ์ ์ด Loosely Coupled ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๊ด๋ฐ๋ MSA ์ ๋ง์ด ๋ฎ์์์ผ๋ฉฐ ์๋ก ์ํธ ๋ณด์์ ์ธ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
MSA ์ ๊ฐ์ ๋ถ์ฐ ํ๊ฒฝ์์๋ REST ํํ์ ํต์ ์ผ๋ก ์ธํ Synchronous ์ ์ฌ๋ฌ ์ ์ฝ์ฌํญ๋ค, ์ด๋ฅผํ ๋ฉด Transaction ๊ณผ ๋ฐ์ดํฐ์ Consistency ๋ Materialized View ์ฒ๋ผ ๋ฐ์ ๊ทํ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ํ๋ค์์๊ณ , ์ด๋ฅผ ๋ณด์ํ๋ Asynchronous ํ ํต์ ์ธ Event Driven ์ด ์ฃผ๋ชฉ์ ๋ฐ๋ ๊ฒ์ด๋ค.
Event-Driven-Architecture ์ ๊ตฌํ ๋ชจ๋ธ
Event-Driven-Architecture ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ๋ ์ ์๋ค.
๋จ์ํ๊ฒ๋ Messaging Infra ๋ฅผ ์ด์ฉํด์ Producer/Consumer ๋ Pub/Sub ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ๋ถํฐ ์์ํด์, Event Store ๋ฅผ ํ์ฉํ์ฌ Event Streaming Channel ์ ๋ง๋ค๊ณ ๊ณ์ํด์ event ๋ฅผ sourcing ํ๋ ๋ฐฉ๋ฒ๊น์ง...
๊ฒ์/๊ตฌ๋ ๋ชจ๋ธ
๊ทธ ์ค์์ ๊ฐ์ฅ ๋จ์ํ ๋ชจ๋ธ์ธ Pub/Sub ๋ชจ๋ธ์ ๋ํด์ ์ด์ผ๊ธฐํด๋ณด์๋ฉด, pub/sub ํํ์ธ ๊ฒ์ ๊ตฌ๋
๋ชจ๋ธ์ Messaging Infra ๋ฅผ ์ด์ฉํด์ ๊ตฌํํ๋ค.
pub/sub ์์๋ ๋๊ตฐ๊ฐ๋ ์ด๋ฒคํธ๋ฅผ Messaging Infra ์ ๊ฒ์ (publish) ํ๋ฉด ํด๋น ์ด๋ฒคํธ์ ๊ด์ฌ์๋ ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ (subscribe) ํด์ ๊ฐ์ ธ๊ฐ๊ฒ ๋๋ค.
์ผ์ข ์ Broadcasting ํํ๋ก Pub ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ Sub ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๊ฒ ๋๋ค.
๊ฒฐ๊ตญ ์๋ก ๋ค๋ฅธ ์ฑ ์์ ๊ฐ๊ณ ์๊ณ ์๋์ ๋ํ ๊ท์ฝ์ด ์๊ธฐ ๋๋ฌธ์ ์ฅ์ ๊ฒฉ๋ฆฌ(Fault Isolation) ๊ตฌ์กฐ๋ก ๋์ํ๊ฒ ๋๋ค.
Event-Driven-Architecture ์์ ๊ณ ๋ คํด์ผํ ๋ฌธ์ ๋ค
๋ค์์ EDA ๋ฅผ ์ํ๋ค๋ฉด ๊ณ ๋ คํด์ผํ ๋ฌธ์ ๋ค์ด๋ค.
- ๋๋ฉ์ธ์ ๋ํ ์๋ก์ด ๊ด์
- ๋ฉ์์ง์ ์ ๋ขฐ์ฑ
- ์ฅ์ ํฌ์ธํธ
- ์ ์ ํ Infrastructure
- Debuging
๋๋ฉ์ธ์ ๋ํ ์๋ก์ด ๊ด์
Event ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋๋ค๋ ๊ฒ์ ๋๋ถ๋ถ ์ด๋ ํ Domain Event ๊ฐ ๋ฐ์๋๋ ๊ฒ์ ์๋ฏธํ ๊ฒ์ด๋ค.
๊ทธ๋ผ ๊ทธ์ ๋ง๊ฒ ๋๋ฉ์ธ์ ๋ํ ์ค๊ณ๊ฐ ํ์ํ๋ฉฐ ๊ณผ๊ฑฐ์ ๋ฐฉ์๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅธ ์ธ์ฌ์ดํธ๊ฐ ํ์ํ ์ ์๋ค.
์ ์ ์๋๋ฆฌ์ค์ ๋ํ Event ๋ฐํ๊ณผ Event ๋ฐํ์ ๋ํ ์คํจ/์ฌ์๋ ์ฒ๋ฆฌ ๋ํ ๊ณ ๋ ค๋ ์ ์๋ค.
๋ฉ์์ง์ ์ ๋ขฐ์ฑ
Event-Driven-Architecture ์์๋ ํ๋์ ๋น์ฆ๋์ค ํธ๋์ญ์ ์ ์ฑ๊ณต์ ์ผ๋ก ๋๋ง์น๊ธฐ ์ํด์๋ ์ ๋ฌ๋๋ ์ด๋ฒคํธ์ ์ ๋ขฐ์ฑ์ด ์ค์ํ๋ค.
์ด๋ฒคํธ๋ Exactly once, ๋ฐ๋์ ํ๋ฒ ์ ๋ฌ๋์ด์ผ ํ๋ค.
๊ทธ๋ ์ง ์๋ค๋ฉด ๋์ผํ ์ด๋ฒคํธ๊ฐ ์ฌ๋ฌ๋ฒ ์ฒ๋ฆฌ๋์ง ์๋๋ก ๋ฉฑ๋ฑํ๊ฒ ๊ตฌ์ฑ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฅํด์ผ ํ๋ค.
๋ํ ๋ฉ์์ง๋ ์์๊ฐ ์ค์ํ๋ค.
Event ๋ ๊ณผ๊ฑฐ์ ๋ฐ์ํ๋ ์ด๋ค ์ฌ๊ฑด์ ์๋ฏธํ๋๋ฐ, ์ด ์ฌ๊ฑด์ ๋ํด์๋ ๊ณผ๊ฑฐ๋ผ๋ ์์ ์ด ๋งค์ฐ ์ค์ํ๋ค.
์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ์์์ ๋ฐ๋ผ์ ์์คํ ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๊ณ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ Scaling ๋ Application ์์ Event Message ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ทธ๋ค ๊ฐ์ race condition ์ ๋ํด์๋ ๊ณ ๋ คํด์ผ ํ๋ค.
์ฅ์ ์ ๋ํ ์ฒ๋ฆฌ
Event-Driven-Architecture ์์ ๋ฟ๋ง์ด ์๋๋ผ ์ฌํ ๋ค๋ฅธ ์ํคํ ์ฒ ํจํด์์๋ ์ฅ์ ์ ๋ํ handling ์ด ์ค์ํ๋ค.
Event-Driven Architecture ์์๋ Messaging Infrastructure ๋ฅผ ํตํด์ ํต์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ Messaging Infrastructure ์ Reliability ๊ฐ ๋งค์ฐ ์ค์ํ๋ค.
๋จ์ผ Channel ์ ์ฌ์ฉํ๋ค๋ฉด ํด๋น Channel ์ ์ฅ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ SPOF (Single Point of Failure) ๊ฐ ๋ ์๋ ์์ผ๋ฉฐ Partitioning ๊ณผ ๊ฐ์ด ์ด์ ๋ฐ๋ฅธ ์ ์ ํ Scaling ์ด ํ์ํ ์๋ ์๋ค.
๊ทธ๋ ๋ค๋ฉด Scaling ๋ Channel ์ ๋ํด์๋ ์์๊ฐ ์ ์ ํ ๋ณด์ฅ๋์ด์ผ ํ๊ณ ๋ค์ ๋ฉ์์ง์ ์ ๋ขฐ์ฑ์ผ๋ก ๋ฌธ์ ๊ฐ ๊ท๊ฒฐ๋๋ค.
์ ์ ํ Infrastructure
๋ํ EDA ์์๋ ์ ์ ํ ์ธํ๋ผ๊ฐ ๋งค์ฐ ์ค์ํ๋ค.
์ด๋ฒคํธ ์๋น ์คํจ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ํด์ DLQ ๋ฅผ ์ฌ์ฉํ๋ค๊ฑฐ๋ ๋ฐ์ํ๋ ๋ชจ๋ Event ๋ฅผ ํ๊ณณ์ ์ ์ฅํด์ผ ํ๋ ๋ฑ message ์์ฒด๋ฅผ persist ํ๊ฒ ๊ฐ์ ธ๊ฐ์ผ ํ ๋๊ฐ ์๋ค.
๊ฒฐ๊ตญ EDA ๋ฅผ ์ฌ์ฉํ๋ ๊ด์ ๊ณผ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์ RDS ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ฉํ ์ ์๊ณ NoSQL ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ฉํ ์๋ ์๋ค.
๋ํ ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ํ๊ณณ์ ์์ด๋ Event Store ๋ฅผ ๊ตฌ์ฑํ ๊ฒฝ์ฐ Network Throughput ์ ๊ฐ๋นํ ์ ์๋ ์์คํ ์ ๋ํ ์ค๊ณ๊ฐ ํ์ํ๋ค.
Messaging Infrastructure ๊ฐ Apache Kafka ๋ฅผ ์ฌ์ฉํด์ผ ํ ๋์ RabbitMQ ๋ฅผ ์ฌ์ฉํด์ผ ํ ๋, SQS/SNS ๋ฅผ ์ฌ์ฉํ ๋์ ๊ฐ์ด ์ฉ๋ก์ ์ฉ๋ฒ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์ ํ ์๋ฃจ์ ์ ์ฐพ๋๊ฒ๋ ํ์ํ๋ฉฐ ๋น์ฐํ๊ฒ ๊ทธ์ ๋ํ ํ์ ๋ ธํ์ฐ๊ฐ ์กด์ฌํด์ผ ํ๋ฉฐ ์ญ์ ๋ฆฌ์์ค๊ฐ ํ์ํ ์๋ ์๋ค.
Debuging
Loosely Coupled ํ ํ๊ฒฝ์ EDA ๋ฅผ ํตํด์ ๊ตฌ์ถํ๋ค๋ฉด ๋น์ฐํ๊ฒ Debuging ์ด ๋งค์ฐ ์ด๋ ค์์ง์ ์๋ฏธํ๋ค.
ํ Transaction ์์ Synchronous ํ๊ฒ ์ฒ๋ฆฌ๋๋ ํ๊ฒฝ์ด๋ผ๋ฉด ์ด๋์ ๋ฌธ์ ๊ฐ ๋ฐ์๋์๋์ง ๋น๊ต์ ๊ฐ๋จํ๊ฒ ์ฐพ์ ์ ์๋ค.
ํ์ง๋ง ๋ถ์ฐ๋ ํ๊ฒฝ์ ๊ทธ๋ ์ง ์๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด์๋ Open Tracing ์ ๋์ ํ๋ ๋ฑ Debuging ์ ์ํ ๋ค์ํ ์ฅ์น๋ค์ด ํ์ํ ์ ์๋ค.
References
- https://wonit.tistory.com/623?category=854727
- https://medium.com/dtevangelist/event-driven-microservice-๋-54b4eaf7cc4a
- https://akasai.space/architecture/about_event_driven_architecture/
- https://www.equalexperts.com/blog/tech-focus/event-driven-architecture-the-good-the-bad-and-the-ugly/
- https://s-core.co.kr/insight/view/๋น์ ์-msa๋-์๋ ํ์ ๊ฐ์-msa๋ฅผ-๋ณด์ํ๋-์ํคํ ์ฒ-edmevent-drive/
- https://developer.confluent.io/patterns/event-stream/event-stream/
๋๊ธ