golang中的解耦包通信

Go是一款非常強大的軟件開發語言,具有簡單,併發,一流的功能和工具。

在Go中,通常,包只能由一件事負責。應用程序隨著幾個包有自己的職責而增長。當項目中的包數和項目的職責增加時,可能會在其他包之間進行通信時搞亂。(在這裡,通信意味著在流上的不同包/模塊上調用函數,有/無等待結果。就像在接收/完全填充訂單時遞增計數器度量一樣)

解密通信的已知方法之一是事件驅動的軟件設計。通常,使用外部事件/消息總線服務器是將責任分配給內部/外部服務的方式。但這也為您的堆棧帶來了另一個外部組件。每個堆棧都有自己的問題。

對於小型服務,可能不需要添加外部總線的軟件包/庫和嵌入式系統。要解決此問題,可以在包中添加內部消息總線包。當事情變得越來越大時,可以將這種內部消息總線與外部消息總線服務進行通信。

golang中的解耦包通信

假設一個項目需要在用戶註冊上做幾件事; 遞增計數器,發送電子郵件,記錄和/或將webhook發送到外部服務; 而不是直接直接調用每個功能,消息總線可以幫助在不知道調用者的情況下異步執行多個功能。

解耦包幫助我們編寫更清晰的代碼,一次只關注一件事。使用總線 Go包,可以獲得真正的消息總線系統,並輕鬆編寫解耦包。該bus包允許任何處理程序監聽任何事件,而不知道誰生成事件。因此,包可以在不依賴於彼此的情況下進行通信。而且,很容易替代消費者功能。只要新函數理解Event正在發送和接收的結構,其他函數將永遠不會知道。

通過Bus4個步驟開始使用Go Package

配置

該bus程序包需要一個唯一的id生成器來為事件分配ID。您可以編寫自己的函數來生成唯一ID,或使用提供唯一ID生成功能的包。以下是使用單調id生成器的示例配置:

import (
"github.com/mustafaturan/bus"
"github.com/mustafaturan/monoton"
"github.com/mustafaturan/monoton/sequencer"
)

func init() {
// configure id generator (it doesn't have to be monoton)
node := uint(1)
initialTime := uint(0)
monoton.Configure(sequencer.NewMillisecond(), node, initialTime)
// configure bus
if err := bus.Configure(bus.Config{Next: monoton.Next}); err != nil {
panic("whoops")
}
// ...
}

註冊活動主題

要向主題發出事件,需要首先註冊主題名稱:

func init() {
// ...
// register topics
bus.RegisterTopics("order.received", "order.fulfilled")
// ...
}

註冊事件處理程序

要接收主題事件,您需要註冊處理程序; 處理程序基本上需要兩個值,即Handle函數和主題Matcher 正則表達式模式

handler := bus.Handler{
Handle: func(e *Event){
// fmt.Printf("Event: %+v %+v\\n", e, e.Topic)
// do something
// NOTE: Highly recommended to process the event in an async way
}),
Matcher: ".*", // regex pattern that matches all topics
}
bus.RegisterHandler("a unique key for the handler", &handler)

發出事件

該bus包提供了一個通用事件結構,用於標準化所有處理程序的事件。在發佈活動之前,最好知道bus包裝的事件是什麼。如果這是您與庫的關鍵時刻,強烈建議您檢查結構的數據結構Event。

txID := "some-transaction-id-if-exists" // if it is blank, bus will generate one
topic := "order.received" // event topic name (must be registered before)
order := make(map[string]string) // interface{} data for event
order["orderID"] = "123456"
order["orderAmount"] = "112.20"
order["currency"] = "USD"
bus.Emit(topic, order, txID) // emit the event for the topic

恭喜!您使用bus包發出了第一個事件。現在,所有匹配的處理程序將收到相同的事件。請嘗試自己並分享您的評論經驗。

bus的開源地址 https://github.com/mustafaturan/bus


分享到:


相關文章: