golang 發布訂閱模型

2021-10-05 18:10:17 字數 1610 閱讀 5406

《go語言高階程式設計》設計中案例,僅作為筆記進行收藏。發布訂閱(publish-and-subscribe)模型通常被簡寫為pub/sub模型。在這個模型中,訊息⽣產者成為發布者(publisher),⽽訊息消費者則成為訂閱者(subscriber),⽣產者和消費者是m:n的關係。在

傳統⽣產者和消費者模型中,是將訊息傳送到⼀個佇列中,⽽發布訂閱模型則是將訊息發布給⼀個主題。

package pubsub

import (

"sync"

"time"

)type (

// 訂閱者為乙個通道

subscriber chan inte***ce{}

// 主題為乙個過濾器

topicfunc func(v inte***ce{}) bool

)// 發布者物件

type publisher struct

// 構建⼀個發布者物件, 可以設定發布超時時間和快取佇列的長度

func newpublisher(publishtimeout time.duration, buffer int) *publisher

}// 新增乙個新的訂閱者,訂閱全部主題

func (p *publisher) subscribe() chan inte***ce{}

// 新增乙個新的訂閱者,訂閱過濾器篩選後的主題

func (p *publisher) subscribetopic(topic topicfunc) chan inte***ce{} , p.buffer)

p.m.lock()

p.subscribers[ch] = topic

p.m.unlock()

return ch

}// 退出訂閱

func (p *publisher) evict(sub chan inte***ce{})

// 發布乙個主題

func (p *publisher) publish(v inte***ce{})

wg.wait()

}// 關閉發布者物件,同時關閉所有的訂閱者管道

func (p *publisher) close()

}// 傳送主題,可以容忍一定的超時

func (p *publisher) sendtopic(sub subscriber, topic topicfunc, v inte***ce{}, wg *sync.waitgroup)

select

}

package main

import (

"fmt"

"strings"

"time"

"main/ch01/pubsub"

)func main() ) bool

return false

}) p.publish("hello, world!")

p.publish("hello, golang!")

go func()

}()go func()

}()// 執行一定時間後退出

time.sleep(3 * time.second)

}

10 發布訂閱模型

icestorm 是乙個高效的用於ice應用的發布 訂閱服務,icestorm有幾個比較重要的概念 訊息 icestorm的訊息和普通的訊息佇列中介軟體中描述的訊息有點區別,icestorm 的訊息是強型別的,由對某個slice 操作的呼叫 代表 操作名 標識 訊息的型別,操作引數 定義 訊息內容。...

發布者 訂閱者模型

發布者和訂閱者模型是軟體架構中的訊息模式。1.第一種是1 n,乙個發布者對應多個訂閱者。例如匯率和rss 2.第二種是n 1,多個發布者對應乙個訂閱者。例如收集狀態,歷史記錄和資料。3.第三種是1 1,特定發布者對應特定訂閱者。例如 4.第四種是n n,多個發布者對應多個訂閱者。例如微博的話題。而在...

go 併發練習(發布訂閱模型)

原型見 go高階程式設計 柴樹杉 曹春暉著 1.6 package main import fmt time sync type subcriber chan inte ce topicfunc func v inte ce bool 發布者結構體 type publisher struct 構建乙...