基于事件或消息的處理,是一種編程方法,屬于異步處理胁镐,與傳統(tǒng)的同步編程思路大不一樣。nameko的eventhandler事件處理诸衔,做的比較優(yōu)雅盯漂,它的優(yōu)雅源自現(xiàn)在很牛逼的rabbitmq。nameko使用rabbitmq作為消息中間件笨农,自然對基于消息的處理就缆,得心應(yīng)手。
先上菜谒亦,再解釋:
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是發(fā)送信息的服務(wù)竭宰,可以使用@rpc裝飾器,這樣其他的微服務(wù)就可以調(diào)用诊霹。當(dāng)然羞延,如果本微服務(wù)下調(diào)用,可以不使用@rpc這個(gè)裝飾器脾还。
- 在sender_service中使用了timer伴箩,目的是調(diào)用發(fā)送信息的方法,便于測試 事件觸發(fā)-》事件處理 的完整流程鄙漏。
- receiver_service嗤谚,是收信息的服務(wù),這里設(shè)計(jì)了兩個(gè)接收消息的微服務(wù)怔蚌,為了檢測消息或者事件被一個(gè)收信息服務(wù)接受后巩步,另外的微服務(wù)是否還可以接收到。具體的方法桦踊,使用@event_handler這個(gè)裝飾器椅野,裝飾器的參數(shù):第一個(gè)是微服務(wù)名稱,第二個(gè)是參數(shù),這是最簡運(yùn)用方式竟闪。定義的方法中的參數(shù)就是獲取到的載荷-payload离福,然后可以對數(shù)據(jù)任意處理。
基于消息或者事件的編程炼蛤,是一種非常不錯(cuò)的體驗(yàn):一是極大的降低應(yīng)用或功能之間耦合度妖爷;二是容易大規(guī)模部署。