基于事件或消息的处理,是一种编程方法,属于异步处理,与传统的同步编程思路大不一样。nameko的eventhandler事件处理,做的比较优雅,它的优雅源自现在很牛逼的rabbitmq。nameko使用rabbitmq作为消息中间件,自然对基于消息的处理,得心应手。
先上菜,再解释:
class SenderService:
name = "sender_service"
dispatcher = EventDispatcher()
@rpc
def dispatch_method(self, payload):
self.dispatcher("message", payload)
@timer(2)
def call_dispatcher_method(self):
self.dispatcher_method({'message': 'hello world'})
class ReceiverService:
name = "receiver_service"
@event_handler("sender_service", "message")
def handle_event(self, payload):
print("reciever1 just received message from sender_service @ {}:".format(time.ctime()), payload)
class ReceiverService2:
name = "receiver_service2"
@event_handler("sender_service", "message")
def handle_event(self, payload):
print("receiver2,just received message from sender_service@ {}:".format(time.ctime()), payload)
说明:
- sender_service是发送信息的服务,可以使用@rpc装饰器,这样其他的微服务就可以调用。当然,如果本微服务下调用,可以不使用@rpc这个装饰器。
- 在sender_service中使用了timer,目的是调用发送信息的方法,便于测试 事件触发-》事件处理 的完整流程。
- receiver_service,是收信息的服务,这里设计了两个接收消息的微服务,为了检测消息或者事件被一个收信息服务接受后,另外的微服务是否还可以接收到。具体的方法,使用@event_handler这个装饰器,装饰器的参数:第一个是微服务名称,第二个是参数,这是最简运用方式。定义的方法中的参数就是获取到的载荷-payload,然后可以对数据任意处理。
基于消息或者事件的编程,是一种非常不错的体验:一是极大的降低应用或功能之间耦合度;二是容易大规模部署。
网友评论