golang實時訊息平臺NSQ的使用
#NSQ 是什麼 (本文作者 changjixiong,以下是正文)
NSQ 是一個實時訊息平臺,引用一段 InfoQ 上的介紹:
“NSQ是一個基於Go語言的分散式實時訊息平臺,它基於MIT開源協議釋出,程式碼託管在GitHub。NSQ可用於大規模系統中的實時訊息服務,並且每天能夠處理數億級別的訊息,其設計目標是為在分散式環境下執行的去中心化服務提供一個強大的基礎架構。NSQ具有分散式、去中心化的拓撲結構,該結構具有無單點故障、故障容錯、高可用性以及能夠保證訊息的可靠傳遞的特徵。NSQ非常容易配置和部署,且具有最大的靈活性,支援眾多訊息協議。”
# 如何開始使用 這裡有一個例子用來說明如何安裝、啟動以及傳送與接收訊息: An Example of Using NSQ From Go(地址:http://tleyden.github.io/blog/2014/11/12/an-example-of-using-nsq-from-go/)
# 構建訊息的響應函式 如果單是用一個匿名函式來處理收到的訊息顯然是不夠的,下面用程式碼來演示一下如果根據收到的訊息來使用相應的處理函式。
## 生產者 首先我們來建立生產者
config := nsq.NewConfig()
w, _ := nsq.NewProducer("127.0.0.1:4150", config)
jsonData := []string{}
jsonData = append(jsonData, `
{
"func_name":"BarFuncAdd",
"params":[0.5,0.51]
}`)
jsonData = append(jsonData, `
{
"func_name":"FooFuncSwap",
"params":["a","b"]
}`)
for _, j := range jsonData {
w.Publish("Topic_json", []byte(j))
}
上面的程式碼向 NSQ 傳送了 2 個 json 格式的訊息,從字面上不難看出其目的是呼叫 2 個函式,分別是 BarFuncAdd 和 FooFuncSwap。
## 消費者 現在我們來建立消費者
config := nsq.NewConfig()
config.DefaultRequeueDelay = 0
config.MaxBackoffDuration = 20 * time.Millisecond
config.LookupdPollInterval = 1000 * time.Millisecond
config.RDYRedistributeInterval = 1000 * time.Millisecond
config.MaxInFlight = 2500
MakeConsumer("Topic_json", "ch", config, HandleJsonMessage)
MakeConsumer 的定義如下:
func MakeConsumer(topic, channel string, config *nsq.Config,
handle func(message *nsq.Message) error) {
consumer, _ := nsq.NewConsumer(topic, channel, config)
consumer.AddHandler(nsq.HandlerFunc(handle))
err := consumer.ConnectToNSQD("127.0.0.1:4150")
if err != nil {
log.Panic("Could not connect")
}
}
### 處理器函式 NSQ 訊息的處理器函式定義如下:
func HandleJsonMessage(message *nsq.Message) error {
resultJson := reflectinvoke.InvokeByJson([]byte(message.Body))
result := reflectinvoke.Response{}
err := json.Unmarshal(resultJson, &result)
if err != nil {
return err
}
info := "HandleJsonMessage get a result\n"
info += "raw:\n" + string(resultJson) + "\n"
info += "function: " + result.FuncName + " \n"
info += fmt.Sprintf("result: %v\n", result.Data)
info += fmt.Sprintf("error: %d,%s\n\n", result.ErrorCode,
reflectinvoke.ErrorMsg(result.ErrorCode))
fmt.Println(info)
return nil
}
### 功能函式 處理器函式根據收到的 json 資料通過反射最終呼叫了 Foo 的 FooFuncSwap 方法及 Bar 的 BarFuncAdd 方法。
type Foo struct {
}
type Bar struct {
}
func (b *Bar) BarFuncAdd(argOne, argTwo float64) float64 {
return argOne + argTwo
}
func (f *Foo) FooFuncSwap(argOne, argTwo string) (string, string) {
return argTwo, argOne
}
### 怎麼呼叫的 reflectinvoke.InvokeByJson 是如何根據形如:
{
"func_name":"BarFuncAdd",
"params":[0.5,0.51]
}
的 json 資料呼叫 Bar.BarFuncAdd 的? 請參考《golang 通過反射使用 json 字串呼叫 struct 的指定方法及返回 json 結果》(如果前面這段沒有連線地址,那肯定是文章被爬蟲幹掉了連線,請找本文的原文閱讀)
文中程式碼的完整內容在https://github.com/changjixiong/goNotes/tree/master/nsqNotes以及https://github.com/changjixiong/goNotes/tree/master/reflectinvoke中。 ### 注意事項 同一個訊息 channel 如果有多個消費者則消費者收到的訊息是不確定的。例如,如果將文中的生產者執行一個例項,將消費者執行兩個例項 (命名為 A,B),則會出現 A 收到 2 個訊息或者 B 收到 2 個訊息或者 AB 各收到一個訊息。
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- golang使用NsqGolang
- nsq 優秀的訊息佇列佇列
- 訊息推送平臺的實時數倉?!flink消費kafka訊息入到hiveKafkaHive
- golang 封裝 rabbitmq,正常訊息,延時訊息,非炫技,僅記錄(golang新人)Golang封裝MQ
- JEESZ-kafka訊息服務平臺實現Kafka
- nsqlookupd:高效能訊息中介軟體 NSQ 解析SQL
- RestCloud MQ訊息整合平臺,實現訊息自動記錄及重發RESTCloudMQ
- vivo魯班RocketMQ平臺的訊息灰度方案MQ
- 短視訊軟體開發,當使用者選擇免打擾時,平臺自行攔截平臺內部訊息
- golang在windows平臺使用zmqGolangWindowsMQ
- vivo 魯班平臺 RocketMQ 訊息灰度方案MQ
- 實現在安卓平臺下的即時通訊安卓
- 使用 Kotlin+RocketMQ 實現延時訊息KotlinMQ
- 直播平臺開發,TabLayout的使用和自定義紅點訊息提示TabLayout
- 微眾銀行-訊息服務平臺建設實踐
- 如何用 Golang 的 channel 實現訊息的批次處理Golang
- 如何用 Golang 的 channel 實現訊息的批量處理Golang
- 搭建直播平臺,iYiuMessage 訊息提示元件元件
- 訊息推送平臺亂象和趨勢
- Defne平臺新特性:非同步訊息框架非同步框架
- 實時訊息推送方案-SSE
- 使用開源ntfy訊息推送服務釋出通知實現全平臺接收通知
- Java使用HTTPClient3.0.1開發的公眾平臺訊息模板的推送功能JavaHTTPclient
- 中通訊息服務運維平臺實踐(已開源)運維
- Android 訊息推送:第三方訊息推送平臺 詳細解析Android
- 訊息推送平臺終於要上線啦!
- 訊息推送平臺終於要釋出啦!
- 用 Laravel 自帶訊息模組搭建小程式實時推送訊息Laravel
- 短視訊平臺原始碼,平臺顯示時間,時間格式的轉換原始碼
- 訊息佇列 RocketMQ 5.0:從訊息服務到雲原生事件流平臺佇列MQ事件
- wechat_pusher : 基於Golang開發的微信訊息定時推送框架Golang框架
- Ifood如何使用Golang實現每天消耗超過10億條 Kafka 訊息GolangKafka
- RocketMQ 訊息整合:多型別業務訊息——定時訊息MQ多型型別
- 雅虎開源釋出/訂閱訊息平臺Pulsar
- ASP.NET 多語言的實現(後臺訊息+前臺訊息+頁面自動繫結)ASP.NET
- RabbitMQ實現延時訊息的兩種方法MQ
- 直播平臺原始碼,針對訊息對話方塊的實際應用效果原始碼
- Eclipse平臺中“MessageDialog”訊息對話方塊的簡單實現Eclipse