31/1/2018

이벤트 기반의 이해

마이크로서비스 아키텍처 구축살펴보던이벤트 기반(Event Driven)대해서 언급이 나왔다. 읽기만 해서는 이해가 되지 않아 코드를 작성해보았다. 물론 아직도 이해가안된다.

오케스트레이션(Orchestration)

중앙에서 이벤트를 모두 관리처리

class Customrer():
    def __init__(self, name, address, email):
        self.name = name
        self.address = address
        self.email = email


class CustomerService():

    def signup(self, customrer):
        # 계좌 개설
        BankService().create_account(customrer)

        # 환영 메일 발송
        MailService().send(customrer.email)

        # 가입 패키지 발송
        PostService().send(customrer.address)


class BankService():
    def create_account(self, customrer):
        print("Service Name: %s, Customrer Name: %s" %(self.__class__.__name__, customrer.name))


class MailService():
    def send(self, to):
        print("Service Name: %s, To: %s" % (self.__class__.__name__, to))


class PostService():
    def send(self, to):
        print("Service Name: %s, Address: %s" % (self.__class__.__name__, to))


if __name__ == '__main__':
    customer = Customrer(name='SELO', address='Seoul, Korea', email='rochan87@gmail.com')
    CustomerService().signup(customer)

코레오그래피(Choreography)

발행/구독 패턴을 통한 느슨한 결합

class Customrer():
    def __init__(self, name, address, email):
        self.name = name
        self.address = address
        self.email = email

EventBook = {
    # example
    'main_event': {
        'events': ['dependent_event', ],
    }
}


def register_event(pub_event_name, sub_event):
    try:
        pub_event = EventBook[pub_event]
        pub_event.append(sub_event)
    except KeyError:
        EventBook[pub_event] = [sub_event]


def pub(event_name):
    def add(func):
        def __wrapper(*args, **kwargs):
            _r = func(*args, **kwargs)
            sub_events = EventBook[event_name]
            for sub_event in sub_events:
                sub_event(*args, **kwargs)
            return _r
        
        if event_name not in EventBook:
            EventBook[event_name] = []

        return __wrapper
    return add


def sub(event_name):
    def register(func):
        def __wrapper(*args, **kwargs):
            return func(*args, **kwargs)

        if event_name not in EventBook:
            EventBook[event_name] = []

        EventBook[event_name].append(__wrapper)
        return __wrapper
    return register


SIGNUP = 'signup'
UPDATE = 'update'


class CustomerService:
    @pub(SIGNUP)
    def signup(self, customrer):
        print("SignUp\n")

    @pub(UPDATE)
    def update(self, customrer):
        print("Update\n")


class BankService:
    @sub(SIGNUP)
    def create_account(self, customrer):
        print("Service Name: %s, Customrer Name: %s" %(self.__class__.__name__, customrer.name))


class MailService:

    # 아래와 같이 구독하고 싶은 이벤트만 추가해서 원하는 동작을 수행한다.
    @sub(SIGNUP)
    @sub(UPDATE)
    def send(self, customrer):
        print("Service Name: %s, To: %s" % (self.__class__.__name__, customrer.email))


class PostService:
    @sub(SIGNUP)
    def send(self, customrer):
        print("Service Name: %s, Address: %s" % (self.__class__.__name__, customrer.address))



if __name__ == '__main__':
    customer = Customrer(name='SELO', address='Seoul, Korea', email='rochan87@gmail.com')
    CustomerService().signup(customer)
    CustomerService().update(customer)

MSA MicroserviceArchitecture EventDriven


Previous post
Dynamically import django settings for multiple environment such as local, dev, beta, production 장고 개발을 하다보면 각 환경을 구분하고, 이에 따라 변경되야 하는 부분들이 존재한다. 예를들면 임포트 되어야하는 미들웨어 혹은 장고 어플리케이션들, 데이터베이스 연결정보 등이 달라진다. 이럴때 각 환경에 따라 코드를 수정하는 작업은 해서는 안되는 작업이며,
Next post
[Django] contenttypes framework 부제: 은 무엇인가? 장고 프로젝트를 생성하고, 파일을 보면 기본값 설정들이 되어있고, 하위에 이미 어떤 장고 어플리케이션들이 선언되어있다. 해당 어플리케이션인들이 프로젝트에 판단하기 위해 역할을 알아볼 것이다. 이 포스트에서는 에 대해 살펴볼것이다.