精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 事件驅(qū)動編程:實現(xiàn)一個簡單的事件總線

開發(fā) 前端
本文深入探討了在 Go? 語言中實現(xiàn)簡單事件總線的過程。通過利用 Go? 語言的強大特性,如 channel 和并發(fā)機制,我們可以輕松地實現(xiàn)發(fā)布-訂閱模式。

前言

在當今微服務和分布式系統(tǒng)盛行的背景下,事件驅(qū)動架構(gòu)(Event-Driven Architecture,EDA)扮演著一個至關重要的角色,此架構(gòu)的設計使得服務間可以通過事件進行同步或異步通信,替代了傳統(tǒng)的直接接口調(diào)用。基于事件的交互方式,促進了服務之間的松耦合,提高系統(tǒng)的可擴展性。

發(fā)布-訂閱模式是實現(xiàn)事件驅(qū)動架構(gòu)的模式之一,它允許系統(tǒng)的不同組件或服務發(fā)布事件,而其他組件或服務可以訂閱這些事件并根據(jù)事件內(nèi)容進行響應。相信大部分開發(fā)者都接觸過這一模式,常見的技術實現(xiàn)有消息隊列(MQ)和 Redis 發(fā)布/訂閱(PUB/SUB)功能等。

在 Go 語言中,我們可以利用其強大的 channel 和并發(fā)機制來實現(xiàn)發(fā)布-訂閱模式。本文將深入探討如何在 Go 中實現(xiàn)一個簡單的事件總線,這是發(fā)布-訂閱模式的具體實現(xiàn)。

準備好了嗎?準備一杯你最喜歡的咖啡或茶,隨著本文一探究竟吧。

事件總線

事件總線是發(fā)布-訂閱模式的具體實現(xiàn),它作為發(fā)布者和訂閱者的中間件,管理著事件傳遞與分發(fā),確保事件從發(fā)布者順利地傳達到訂閱者。

圖片圖片

事件總線的優(yōu)勢主要包括:

  • 解耦:服務間不需要直接通信,而是通過時間進行交互,減少服務間的依賴。
  • 異步處理:事件可以被異步處理,提高系統(tǒng)的響應性和性能。
  • 可擴展性:新的訂閱者可以輕松訂閱事件,不需要修改現(xiàn)有的發(fā)布者代碼。
  • 錯誤隔離:事件處理的失敗不會直接影響其他服務的正常運行。

事件總線的代碼實現(xiàn)

接下來將介紹如何在 Go 語言中實現(xiàn)一個簡單的事件總線,它包含以下關鍵功能:

  • 發(fā)布:允許系統(tǒng)的各個服務發(fā)送事件。
  • 訂閱:允許感興趣的服務訂閱接收特定類型的事件。
  • 取消訂閱:允許各個服務將本身已訂閱的事件刪除。

項目源碼地址:https://github.com/chenmingyong0423/go-eventbus

事件數(shù)據(jù)結(jié)構(gòu)定義

type Event struct {
    Payload any
}

Event 是一個封裝事件的結(jié)構(gòu)體,其中 Payload 為事件的上下文信息,類型是 any。

事件總線定義

type (
    EventChan chan Event
)

type EventBus struct {
    mu    sync.RWMutex
    subscribers map[string][]EventChan
}

func NewEventBus() *EventBus {
    return &EventBus{
        subscribers: make(map[string][]EventChan),
    }
}

EventChan 是一個類型別名,定義為傳遞 Event 結(jié)構(gòu)體的通道 chan Event。

EventBus 為事件總線的定義,它包含兩個屬性:

  • mu:一個讀寫互斥鎖(sync.RWMutex),用于保證下面 subscribers 的并發(fā)讀寫安全。
  • subscribers:一個映射,鍵為字符串類型,表示訂閱的主題;值為 EventChan 切片類型。該屬性用于存儲各個主體的所有訂閱者,每個訂閱者通過 EventChan 接收事件。

NewEventBus 函數(shù)用于創(chuàng)建一個新的 EventBus 事件總線。

事件總線的方法實現(xiàn)

事件總線實現(xiàn)了三個方法,分別為發(fā)布事件(Publish)和訂閱事件(Subscribe)以及取消訂閱事件(Unsubscribe)。

Publish 發(fā)布事件

func (eb *EventBus) Publish(topic string, event Event) {
	eb.mu.RLock()
	defer eb.mu.RUnlock()
	// 復制一個新的訂閱者列表,避免在發(fā)布事件時修改訂閱者列表
	subscribers := append([]EventChan{}, eb.subscribers[topic]...)
	gofunc() {
		for _, subscriber := range subscribers {
			subscriber <- event
		}
	}()
}

Publish 方法用于發(fā)布事件。該方法接收兩個參數(shù):topic(主題)和 event (封裝事件的對象)。

在 Publish 方法的實現(xiàn)中,首先通過 mu 屬性獲取讀鎖,以確保接下來的 subscribers 寫操作是協(xié)程安全的。然后復制一份當前主題的訂閱者列表 subscribers。接下來開啟一個新 goroutine,在這個 goroutine 中遍歷復制的訂閱者列表,將事件通過通道發(fā)送給所有訂閱者。完成這些操作后,釋放讀鎖。

為什么會復制一個新的訂閱者列表?

答:復制訂閱者列表是為了在發(fā)送事件時保持數(shù)據(jù)的一致性和穩(wěn)定性。由于向通道發(fā)送數(shù)據(jù)的操作是在一個新的 goroutine 中進行的,在發(fā)送數(shù)據(jù)時,讀鎖已經(jīng)被釋放,原來的訂閱者列表可能會由于添加或刪除訂閱者而發(fā)生變化。如果直接使用原來的訂閱者列表,可能會發(fā)生預料之外的錯誤(如向一個已經(jīng)關閉的通道發(fā)送數(shù)據(jù)會產(chǎn)生 panic)。

Subscribe 訂閱事件

func (eb *EventBus) Subscribe(topic string) EventChan {
	eb.mu.Lock()
	defer eb.mu.Unlock()
	ch := make(EventChan)
	eb.subscribers[topic] = append(eb.subscribers[topic], ch)
	return ch
}

Subscribe 方法用于訂閱特定主題的事件。該方法有接收一個 topic 參數(shù),表示希望訂閱的主題。通過此方法,可以獲得一個 EventChan 通道,用于接收該主題的事件。

在 Subscribe 方法的實現(xiàn)中,首先通過 mu 屬性獲取寫鎖,以保證接下來的 subscribers 讀寫操作是協(xié)程安全的;接著創(chuàng)建一個新的 EventChan 通道 ch,將其添加到相應主題的訂閱者切片中。完成這些操作后,釋放寫鎖。

Unsubscribe 取消訂閱事件

func (eb *EventBus) Unsubscribe(topic string, ch EventChan) {
	eb.mu.Lock()
	defer eb.mu.Unlock()
	if subscribers, ok := eb.subscribers[topic]; ok {
		for i, subscriber := range subscribers {
			if ch == subscriber {
				eb.subscribers[topic] = append(subscribers[:i], subscribers[i+1:]...)
				close(ch)
				// 清空通道
				forrange ch {
				}
				return
			}
		}
	}
}

Unsubscribe 方法用于取消訂閱事件。該方法接收兩個參數(shù):topic(已訂閱的主題)和 ch(被頒發(fā)的通道)。

在 Unsubscribe 方法里,首先通過 mu 屬性獲取寫鎖,以保證接下來的 subscribers 讀寫操作是協(xié)程安全的;然后檢查 topic 主題是否存在對應的訂閱者。如果存在,遍歷該主題的訂閱者切片,找到與 ch 相匹配的通道,將其從訂閱者切片里移除并關閉該通道。然后清空通道。完成這些操作后,釋放寫鎖。

使用示例

// https://github.com/chenmingyong0423/blog/blob/master/tutorial-code/go/eventbus/main.go
package main

import (
	"fmt"
	"time"

	"github.com/chenmingyong0423/go-eventbus"
)

func main() {
	eventBus := eventbus.NewEventBus()

	// 訂閱 post 主題事件
	subscribe := eventBus.Subscribe("post")

	gofunc() {
		for event := range subscribe {
			fmt.Println(event.Payload)

		}
	}()

	eventBus.Publish("post", eventbus.Event{Payload: map[string]any{
		"postId": 1,
		"title":  "Go 事件驅(qū)動編程:實現(xiàn)一個簡單的事件總線",
		"author": "陳明勇",
	}})
	// 不存在訂閱者的 topic
	eventBus.Publish("pay", eventbus.Event{Payload: "pay"})

	time.Sleep(time.Second * 2)
	// 取消訂閱 post 主題事件
	eventBus.Unsubscribe("post", subscribe)
}

擴展建議

本文實現(xiàn)的事件總線較為簡單,如果要增強時間總線的靈活性,可靠性和易用性等方面,我們可以考慮擴展它,以下是一些建議:

  • 事件持久化:實現(xiàn)時間的持久化存儲功能,確保系統(tǒng)崩潰后可以恢復未處理的事件。
  • 通配符和模式匹配訂閱:允許使用通配符或正則表達式來訂閱一組相關主題,而不是單個具體的主題。
  • 負載均衡和消息分發(fā)策略:在多個訂閱者之間分配事件,實現(xiàn)負載均衡。
  • 插件支持:支持通過插件來擴展功能,如日志記錄、消息過濾、轉(zhuǎn)換等。

小結(jié)

本文深入探討了在 Go 語言中實現(xiàn)簡單事件總線的過程。通過利用 Go 語言的強大特性,如 channel 和并發(fā)機制,我們可以輕松地實現(xiàn)發(fā)布-訂閱模式。

文章從事件總線的優(yōu)勢開始,介紹了其解耦、異步處理、可擴展性和錯誤隔離等特點。然后詳細解釋了如何定義事件數(shù)據(jù)結(jié)構(gòu)和事件總線結(jié)構(gòu),并實現(xiàn)了發(fā)布、訂閱和取消訂閱事件的方法。最后,提出了一些可能的擴展方向,如事件持久化、通配符訂閱、負載均衡和插件支持,以增強事件總線的靈活性和功能性。

通過閱讀本文,你可以學會在 Go 語言中實現(xiàn)一個簡單但功能強大的事件總線,并根據(jù)可能的需求進行擴展。

★項目源碼地址:https://github.com/chenmingyong0423/go-eventbus

責任編輯:武曉燕 來源: 程序員陳明勇
相關推薦

2023-10-31 22:54:17

GoEventBus驅(qū)動編程

2024-08-27 12:49:20

2023-11-25 09:31:20

Go事件管理器

2023-02-07 07:25:36

Spring事件驅(qū)動

2013-03-26 14:17:21

架構(gòu)架構(gòu)設計事件驅(qū)動

2024-06-28 10:19:02

委托事件C#

2024-08-05 10:26:42

Go語言架構(gòu)

2023-11-28 09:17:05

Linux編程

2023-10-07 09:37:53

2024-09-23 16:43:33

.NET開發(fā)事件總線

2024-12-03 16:36:08

事件總線C#代碼

2009-08-18 17:19:33

C#事件模型

2024-06-25 08:43:25

C#編程模型

2025-06-05 08:00:00

Go事件驅(qū)動系統(tǒng)編程

2009-10-23 17:22:48

VB.NET編程

2020-10-12 10:58:15

IDEA插件監(jiān)聽

2024-11-07 22:58:33

2009-10-20 14:58:15

Javascript事

2023-12-13 10:44:57

事件驅(qū)動事件溯源架構(gòu)

2019-04-19 21:06:23

事件驅(qū)動架構(gòu)VANTIQ
點贊
收藏

51CTO技術棧公眾號

日韩精品中文字幕在线| 夜夜嗨av一区二区三区中文字幕| 国产精品海角社区在线观看| 免费成人美女女在线观看| 91成人在线网站| 亚洲香肠在线观看| 欧美中日韩免费视频| 国产精品呻吟久久| 国产亚洲成人一区| 久久久www成人免费精品张筱雨| 亚洲一区二区三区四区av| 欧美三级精品| 亚洲综合另类小说| 亚洲高清不卡一区| 国产91久久久| 精品一区二区三区久久| 97精品免费视频| www中文在线| 美女呻吟一区| 欧美一区二区三区免费在线看 | 一区二区三区午夜视频| 日韩精品在线观看视频| 欧美国产在线一区| 日韩欧美2区| 五月综合激情婷婷六月色窝| 一区国产精品| 撸视在线观看免费视频| 国产成人在线视频网址| 国产专区欧美专区| 国产又粗又爽视频| 亚洲国产第一| 欧美成人免费网| 99久久99久久精品免费| 婷婷精品视频| 亚洲国产欧美一区二区三区久久| www,av在线| 成人在线不卡| 日本道色综合久久| 少妇人妻在线视频| 欧美78videosex性欧美| 亚洲欧美日韩国产中文在线| 性欧美大战久久久久久久免费观看| 色欲久久久天天天综合网| 韩国成人在线视频| 国产欧美日韩亚洲精品| 最近日韩免费视频| 天堂蜜桃一区二区三区| 51视频国产精品一区二区| 国产精品30p| 经典一区二区| 国产午夜精品一区二区三区| 成年人在线观看av| 亚洲动漫在线观看| 日韩精品视频在线免费观看| 中文字幕在线永久| 狠狠久久伊人| 日韩高清有码在线| 加勒比一区二区| 欧美女王vk| 中文字幕国产日韩| 91狠狠综合久久久久久| 日韩精品午夜| 久久精品99久久久香蕉| 五月天av网站| 欧美日韩免费| 午夜精品福利视频| 日韩在线播放中文字幕| 久久国产66| 国产精品久久久av| 91免费视频播放| 国产一区二区三区黄视频 | 免费av网址在线| 日韩电影网站| 欧美日韩在线不卡| 无套内谢丰满少妇中文字幕| 亚洲三级av| 亚洲成人精品av| 在线观看国产网站| 欧美日韩第一| 免费99精品国产自在在线| 久久久久成人精品无码| 亚洲一区二区三区高清不卡| 国产国语刺激对白av不卡| 91精品国自产| 成人综合婷婷国产精品久久免费| 精品一区二区三区免费毛片| 成人亚洲综合天堂| 亚洲欧美日韩国产综合在线| 亚洲理论电影在线观看| 成人免费无遮挡| 欧美精品成人一区二区三区四区| 佐山爱在线视频| 一区二区三区韩国免费中文网站| 自拍亚洲一区欧美另类| 免费在线一级片| 久久夜色精品| 5g影院天天爽成人免费下载| 欧美美女色图| 一区二区在线免费观看| aⅴ在线免费观看| 国产一区二区视频在线看| 亚洲精品电影网在线观看| 国产馆在线观看| 99精品视频网| 成人综合网网址| 青青免费在线视频| 一区二区免费看| 日韩av片网站| 理论片一区二区在线| 色偷偷88888欧美精品久久久| 一区二区三区免费高清视频| 蜜桃久久久久久久| 久久久久久久免费| 中文字幕有码在线观看| 在线观看日韩高清av| 国产精品成人免费一区久久羞羞| 精品久久中文| 91爱视频在线| 亚洲黄色在线观看视频| 亚洲国产精品精华液ab| 日本中文字幕网址| 日韩精品一级| 色综合伊人色综合网站| 三级视频在线观看| 成人午夜免费视频| 只有这里有精品| 免费成人黄色网| 亚洲欧美日韩精品久久亚洲区| 青草草在线视频| 精品在线一区二区| 涩涩涩999| 欧美色999| 亚洲免费人成在线视频观看| 国产奶水涨喷在线播放| 国产精品91一区二区| 少妇熟女一区二区| 成人在线不卡| 中文字幕亚洲综合久久筱田步美| 99超碰在线观看| 91理论电影在线观看| 福利视频一二区| 99ri日韩精品视频| 欧美国产日韩一区二区| 97视频免费在线| 中文字幕制服丝袜成人av| 国产一区二区视频免费在线观看| 欧美有码在线| 69视频在线播放| 日韩大胆视频| 欧美性jizz18性欧美| 亚洲一区二区三区综合| 99在线精品免费视频九九视| 韩国成人一区| 松下纱荣子在线观看| 国产手机视频精品| 无码人妻丰满熟妇区bbbbxxxx| 91久色porny| 日韩在线第三页| 精品国产不卡| 国产精品天天狠天天看| 在线激情网站| 69堂精品视频| 黄页网站免费观看| 成人一二三区视频| www国产精品内射老熟女| 色愁久久久久久| 国产精品黄色av| 黄网站在线免费| 精品日韩在线观看| www.中文字幕在线观看| 久久久99久久精品欧美| 一区二区三区视频在线观看免费| 天天综合一区| av成人综合网| 欧美日韩国产观看视频| 一区二区三区四区精品| 国产乱淫片视频| 亚洲午夜免费电影| 泷泽萝拉在线播放| 久久66热偷产精品| 人人妻人人澡人人爽欧美一区| 精品伊人久久久| 国产精品xxx视频| 精品美女在线观看视频在线观看| 精品粉嫩超白一线天av| 久久久久久久久久成人| 亚洲欧美偷拍另类a∨色屁股| 丰满熟女人妻一区二区三区| 日韩激情在线观看| 色哟哟免费网站| 色老板在线视频一区二区| 国产日本欧美视频| h片在线观看下载| 一色桃子一区二区| 亚洲精品成av人片天堂无码| 在线观看日韩电影| 国产在线视频二区| 国产日产精品一区| 国产探花一区二区三区| 久久字幕精品一区| 国产精品啪啪啪视频| 九九久久电影| 99热最新在线| 久久精品xxxxx| 91精品国产91久久久久福利| 在线观看免费版| 亚洲激情自拍图| 国产超碰人人模人人爽人人添| 日韩欧美视频一区二区三区| 欧美黑人猛猛猛| 国产欧美一区二区精品性色| 国产人成视频在线观看| 经典一区二区三区| 国产免费视频传媒| 亚洲福利精品| 伊人久久在线观看| 日韩1区在线| 免费试看一区| 粉嫩久久久久久久极品| 成人妇女淫片aaaa视频| 欧美与亚洲与日本直播| 97av在线视频| 成年人国产在线观看| 久久精品国产清自在天天线 | 91在线国产福利| 日韩av影视大全| 奇米一区二区三区| 四虎永久在线精品无码视频| 亚洲视频高清| 玖玖精品在线视频| 日韩欧美一区二区三区在线视频 | 欧美一级片在线免费观看| 麻豆国产一区二区| 国产v亚洲v天堂无码久久久 | 青青草综合网| 欧美高清性xxxxhdvideosex| 国产精品毛片视频| 97碰碰视频| 国产日韩在线观看视频| 91情侣偷在线精品国产| 欧美一级做a| 国产欧美中文字幕| 久久国产三级| 国产综合福利在线| 欧美韩国日本| 国产综合久久久久久| 国产aa精品| 亚洲最大福利网站| 秋霞一区二区| 91精品久久香蕉国产线看观看| 国产亚洲久久| 成人91视频| 精品人人人人| 久久婷婷开心| 国产精品一区二区99| 日韩精品伦理第一区| 日韩欧美午夜| 欧美做受777cos| 韩国一区二区三区在线观看| 给我免费播放片在线观看| 宅男噜噜噜66国产日韩在线观看| 毛片在线视频播放| 久久精品国产清高在天天线| 亚洲 中文字幕 日韩 无码| 免费高清在线视频一区·| 色婷婷.com| 国产宾馆实践打屁股91| 国产精品手机在线观看| 久久午夜电影网| 欧美成人另类视频| 亚洲色图另类专区| 国产一级免费观看| 色综合中文综合网| 在线观看中文字幕2021| 欧美一区二区三区的| 日本黄色不卡视频| 亚洲人成电影网站色…| 在线播放毛片| 欧美精品久久久久久久免费观看| 538在线观看| 国产精品都在这里| 久久视频免费| 久久久久久久久四区三区| 久久精品高清| 国产女主播自拍| 日本欧美大码aⅴ在线播放| 激情文学亚洲色图| 99这里都是精品| 手机看片日韩av| 亚洲综合区在线| 中文字幕 国产精品| 欧美成人精品3d动漫h| 国产露出视频在线观看| 欧美精品在线网站| av高清一区| 成人做爰66片免费看网站| 国产精品欧美三级在线观看| 日本大胆人体视频| 日韩成人一级片| 亚洲乱妇老熟女爽到高潮的片 | 精品国产视频在线观看| 欧美日韩国产一区二区| 国产伦精品一区二区三区免.费| 亚洲精品电影网站| 最新av在线播放| 国产精品福利在线| 久久影院资源站| 三级网在线观看| 手机精品视频在线观看| 亚洲熟女乱综合一区二区| 欧美激情综合五月色丁香| www.99re7.com| 3d动漫精品啪啪一区二区竹菊| 日本成人一区| 国内自拍欧美激情| 国产免费区一区二区三视频免费 | www国产视频| 日韩一区在线免费观看| 中文字幕 国产精品| 日韩国产在线看| 丰满诱人av在线播放| 91青草视频久久| 水蜜桃久久夜色精品一区| 欧美成人黑人猛交| 97久久精品人人做人人爽| 免费一级肉体全黄毛片| 欧美一区二区日韩一区二区| 永久免费av在线| 国产精品欧美日韩久久| 妖精一区二区三区精品视频| 精品人妻少妇一区二区| 国产河南妇女毛片精品久久久| 欧美做爰啪啪xxxⅹ性| 欧美日韩一区二区三区在线看| 欧美拍拍视频| 国产www精品| 亚洲人成网www| 欧美性大战久久久久xxx| thepron国产精品| 日本一级黄色录像| 亚洲第一网中文字幕| 爱福利在线视频| 国产精品伊人日日| 一本不卡影院| 久久久久久久久免费看无码 | 欧美在线视频精品| 亚洲欧美中文日韩v在线观看| 亚洲妇女成熟| 免费看成人av| 天堂va蜜桃一区二区三区 | 亚洲一线二线三线久久久| 国内精品偷拍视频| 欧美激情一区二区久久久| 1769国产精品视频| 妞干网在线视频观看| 91在线视频免费91| 人妻 日韩精品 中文字幕| 亚洲欧美精品伊人久久| 精品视频一区二区三区四区五区| 视频一区视频二区视频三区视频四区国产 | 日韩在线播放av| 国产美女视频一区二区| 久久在线中文字幕| 99久久国产综合精品女不卡| 久久国产视频精品| 在线观看国产精品淫| 91麻豆精品国产综合久久久 | 视频在线观看成人| 麻豆精品视频在线观看| 91在线播放观看| 亚洲国产女人aaa毛片在线| 欧美日韩免费看片| 在线一区日本视频| 成人免费看视频| 草莓视频18免费观看| 日韩视频在线观看免费| 91大神精品| 日日碰狠狠丁香久燥| 中文字幕亚洲区| 成人免费观看在线视频| 全球成人中文在线| 91蜜臀精品国产自偷在线| 伊人久久久久久久久| 日韩欧美中文第一页| 欧美69xxxx| 精品国产乱码久久久久久郑州公司| 日韩精品一二三| 免费毛片在线播放免费| 日韩麻豆第一页| 精品久久亚洲| 国产免费人做人爱午夜视频| 亚洲人成网站影音先锋播放| 天堂在线中文| 91精品一区二区| 蘑菇福利视频一区播放| 国产成人自拍网站| 亚洲欧美激情另类校园| 久久久久九九精品影院| 欧美综合在线观看视频| 一区二区三区四区国产精品|