[メッセージ] NSQを使用して、メッセージングミドルウェアの展開を購読goalng

著作権:https://blog.csdn.net/qq_21852449/article/details/88629106

NSQは、メッセージングミドルウェアの高可用性を分散非常に成熟したサポートで書かgolangれます。それは本当に彼らと彼らは、このような頭痛の設定環境について感じてしまう前に、3つのドッキングウィンドウのコマンドの場合には完全な例を取得するために、より良い統合統合、ドッキングウィンドウの前に使ったことがないくらいの接触は非常に良い特有の問題ではありません物事を省略することができます。
まず、あなたがnsqd nsqlookupdのnsqadminを知っておく必要がありNSQにおける3つのコンポーネントがあります

nsqd nsqdはデーモンNSQサービスは、彼が受け取ると、クライアントにメッセージを送信するために並んでいます。

nsqlookupd文字通りの意味から、このコンポーネントは知っていて、ビュー、全体のメッセージング・トポロジーを管理するデーモンをnsqdために、クライアントのクエリは、特定のトピックのnsqdプロデューサーを見つけることnsqlookupd。

これは、管理コンソールがあるnsqadminあなたが明確にあらゆる種類の情報を見ることができるように単純なWeb UIは、あります。

それは私たちの思考は、私はその後、NSQ使用したい場合は、起動して、それは我々はまた、物事を行うにはnsqdを作成する必要があると同時に、ネットワーク全体のトポロジ構造を管理nsqlookupd行かせ、その後、nsqadminビュータスクを開始する必要があることが明らかになった理解すべきであることをした後、詳細、状態。
まず、お使いのコンピュータが正常にインストールしてくださいドッキングウィンドウを作成し、コマンドから画像を読み込むと、コードのこの部分は特殊性と、機械ではなく、環境が重要ではありません。

docker pull nsqio/nsq
docker run --name lookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd

次に、コマンドラインを再オープンし、またはバックグラウンドで実行されているlookupdの聞かせて、その後、nsqdコンテナを実行し、このセクションでは、ホストとポートに記入する必要があり、ホストがIPアドレスで、ポートサービスがリッスンしています。

docker pull nsqio/nsq
docker run --name nsqd -p 4150:4150 -p 4151:4151 \
    nsqio/nsq /nsqd \
    --broadcast-address=<host> \
    --lookupd-tcp-address=<host>:<port>

このステップでは、それはあなたが必要なすべての機能が含まれている、超簡単なメッセージングミドルウェアを設定することであった、そして今、私たちは、彼にUIユーザーフレンドリーなインストールを与えるホストと本当にポート彼らを修正するために覚えておきたいです

docker run -d --name nsqadmin -p 4171:4171 nsqio/nsq /nsqadmin  --lookupd-http-address=<host>:<port>

ここに画像を挿入説明
上記は、超簡単なインストールされています。

次は、時間暁明の姉妹アリスの量の最初の月は、常に彼女の母親の指示に従ってくださいと言って、それは異なる可能性があり、ほぼ大体表現の意味を知っているに話すのは非常に鮮やかな例を持つことが知られているメッセージのサブスクリプション・トランシーバメカニズムを理解します弟に彼の本は彼を見てみましょう、そのために彼に彼の兄弟を見て、その下に1ヶ月は、暁明は、2冊のを読んでいない暁明を見るために毎日チェックしに行くと、その後母親に報告する赤の本、とても小さな赤い花を見しますあなた自身ではないものに多くの時間は、2番目の月のストレート赤は、私は棚の上にそれを得た弟に本を置くと思うし、彼女はイエス彼の兄と弟が棚に本を読むたびに行くと妹が表示されますと述べた後、彼女に一ヶ月ダウンは、暁明は二冊の本を読んでいた本を、そこに与えていないが、私の妹に何かを行うにはダウン保存するすべての時間を、そして今回は新たな問題があるでしょう、赤お母さんへの時間の方法はありません暁明の進捗報告書が、それは最終的に読み込みます知っているので、これは予想されるが、結果は知られていない場合、結果があるメッセージの遅延を生じます。第三 月、暁明は一緒に読み、ジュニアパートナーに彼を招待するために、私の妹は第一層は暁明を本棚であることを、第二層は第一層のために始めた本を取るので、その都度暁明、暁明の友人である、暁明は友人に行ってきましたことを伝えました第二の層を取ります。これは、メッセージの最初の月は、私たちの以前のコードと同等です、メッセージ機構の進行の歴史ある要求を処理した後、第2月は少し進ん返すように要求を送信し、直接返すように要求を送信し、常にされています私はこの場所が何かを言うだろうが、私は再びそれを行うには時間を待たなければなりませんでした。同時に、いくつかの人々のためのより高度なサポートの最初の3ヶ月。
このように、我々は概念の一部から抽出することができる、及びトピックがNSQでチャネル、本棚一例に相当する話題の概念である、棚上の最初のチャネル層に対応します。そのようなトピックとチャネルによって一意にユーザAを識別することができるであろう。第二主機能を実行する主な機能暁明、私たちは三つの端子をオープンする必要がある場合に効果を確認するために、我々はチャットルームのシンプルな機能を実現することができ、コードに次のコードに直接最初の実行をナンセンス話をしないでください。赤、我々は彼らのホストを埋めるために覚えて、メッセージを送信する機能を公開三分の一を実行します。

package main

// 消息收发机制的例子
import (
	"fmt"
	"sync"

	"github.com/nsqio/go-nsq"
)

//nsqd 节点地址和端口
var (
	//nsqd的地址,使用了tcp监听的端口
	tcpNsqdAddrr = "<host>:4150"
)

func main() {
	// 新建消费者   订阅all 主题  使用通道 c1
	// NewCustomer("小明", "all", "xiaoming")
	// NewCustomer("小红", "private", "xiaohong")

	// 新建生产者  生产一条问候消息  主题为all
	// Publish("private", "小红你好, 我是小A")

}

// Publish 发布函数   发布消息到指定的topic
// topic 主题
// content 内容
func Publish(topic, content string) {
	//初始化NSQ配置
	config := nsq.NewConfig()
	tPro, err := nsq.NewProducer(tcpNsqdAddrr, config)
	if err != nil {
		fmt.Println(err)
	}
	// 发布消息
	err = tPro.Publish(topic, []byte(content))
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("发送成功")
	}

}

// NsqHandler 声明一个结构体,实现HandleMessage接口方法
type NsqHandler struct {
	name string
	//标识ID
	// nsqHandlerID string
}

// HandleMessage 实现HandleMessage方法
// message是接收到的消息
func (s *NsqHandler) HandleMessage(message *nsq.Message) error {
	// 打印消息的一些基本信息
	fmt.Printf(s.name, "  收到了 ----->", string(message.Body))
	return nil
}

// NewCustomer 新建一个消费者
func NewCustomer(name, topic, channel string) {

	// 初始化配置
	config := nsq.NewConfig()
	// 创造消费者,参数一时订阅的主题,参数二是使用的通道
	com, err := nsq.NewConsumer(topic, channel, config)
	if err != nil {
		fmt.Println(err)
	}
	// 添加处理回调
	com.AddHandler(&NsqHandler{name: name})
	// 连接对应的nsqd
	err = com.ConnectToNSQD(tcpNsqdAddrr)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("消费者", name)
	}
	// 只是为了不结束此进程,这里没有意义
	var wg = &sync.WaitGroup{}
	wg.Add(1)
	wg.Wait()

}

おすすめ

転載: blog.csdn.net/qq_21852449/article/details/88629106