From cf95d2b714f7e34a51c3c9b03ecaec91d70b84e4 Mon Sep 17 00:00:00 2001 From: Xargin Date: Sat, 1 Sep 2018 16:12:48 +0800 Subject: [PATCH] update cr --- ch6-cloud/ch6-09-crawler.md | 124 ++++++++++------------------ images/ch6-09-nats-protocol-pub.png | Bin 0 -> 20118 bytes images/ch6-09-nats-protocol-sub.png | Bin 0 -> 15435 bytes 3 files changed, 42 insertions(+), 82 deletions(-) create mode 100644 images/ch6-09-nats-protocol-pub.png create mode 100644 images/ch6-09-nats-protocol-sub.png diff --git a/ch6-cloud/ch6-09-crawler.md b/ch6-cloud/ch6-09-crawler.md index 47eeb5c..023dc0e 100644 --- a/ch6-cloud/ch6-09-crawler.md +++ b/ch6-cloud/ch6-09-crawler.md @@ -60,16 +60,6 @@ func main() { c.Visit(e.Request.AbsoluteURL(link)) }) - // Before making a request - c.OnRequest(func(r *colly.Request) { - /* - r.Headers.Set("Cookie", "") - r.Headers.Set("DNT", "1") - r.Headers.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36") - r.Headers.Set("Host", "www.v2ex.com") - */ - }) - err := c.Visit("https://www.v2ex.com/go/go") if err != nil { fmt.Println(err) @@ -101,97 +91,67 @@ nats 是 Go 实现的一个高性能分布式消息队列,适用于高并发 nats 的服务端项目是 gnatsd,客户端与 gnatsd 的通信方式为基于 tcp 的文本协议,非常简单: -TODO,用图画协议 +向 subject 为 task 发消息: -```shell -~ ❯❯❯ telnet localhost 4222 -Trying 127.0.0.1... -Connected to localhost. -Escape character is '^]'. -INFO {"server_id":"MNbZZUS4Ed5tvSaSRHyZS1","version":"1.3.0","proto":1,"go":"go1.10.3","host":"0.0.0.0","port":4222,"max_payload":1048576,"client_id":31} -sub foo 127.0.0.1 -+OK -pub foo 2 -hi -+OK -MSG foo 127.0.0.1 2 -hi -pub foo 11 -hello world -+OK -MSG foo 127.0.0.1 11 -hello world -``` +![nats-protocol-pub](../images/ch6-09-nats-protocol-pub.png) -#### 消息生产 +以 workers 的 queue 从 tasks subject 订阅消息: + +![nats-protocol-sub](../images/ch6-09-nats-protocol-sub.png) + +其中的 queue 参数是可选的,如果希望在分布式的消费端进行任务的负载均衡,而不是所有人都收到同样的消息,那么就要给消费端指定相同的 queue 名字。 + +#### 基本消息生产 生产消息只要指定 subject 即可: ```go -package main - -import ( - "fmt" - - nats "github.com/nats-io/go-nats" -) - -func main() { - nc, err := nats.Connect(nats.DefaultURL) - if err != nil { - fmt.Println(err) - return - } - - // use colly to extract the url on the page - err = nc.Publish("tasks", []byte("start from here")) - if err != nil { - // log error, retry - } - // 要加了 flush 对面才能收到,看来内部也有缓冲区 - nc.Flush() +nc, err := nats.Connect(nats.DefaultURL) +if err != nil { + // log error + return } +// 指定 subject 为 tasks,消息内容随意 +err = nc.Publish("tasks", []byte("your task content")) + +nc.Flush() ``` -#### 消息消费 +#### 基本消息消费 直接使用 nats 的 subscribe api 并不能达到任务分发的目的,因为 pub sub 本身是广播性质的。所有消费者都会收到完全一样的所有消息。 除了普通的 subscribe 之外,nats 还提供了 queue subscribe 的功能。只要提供一个 queue group 名字(类似 kafka 中的 consumer group),即可均衡地将任务分发给消费者。 ```go -package main +nc, err := nats.Connect(nats.DefaultURL) +if err != nil { + // log error + return +} -import ( - "fmt" - "time" +// queue subscribe 相当于在消费者之间进行任务分发的分支均衡 +// 前提是所有消费者都使用 workers 这个 queue +// nats 中的 queue 概念上类似于 kafka 中的 consumer group +sub, err := nc.QueueSubscribeSync("tasks", "workers") +if err != nil { + // log error + return +} - nats "github.com/nats-io/go-nats" -) - -func main() { - nc, err := nats.Connect(nats.DefaultURL) +var msg *nats.Msg +for { + msg, err = sub.NextMsg(time.Hour * 10000) if err != nil { - fmt.Println(err) - return + // log error + break } - - sub, err := nc.QueueSubscribeSync("tasks", "workers") - if err != nil { - fmt.Println(err) - return - } - - var msg *nats.Msg - for { - msg, err = sub.NextMsg(time.Hour * 10000) - if err != nil { - break - } - fmt.Println(string(msg.Data), msg.Reply, msg.Sub, msg.Subject, err) - } - nc.Flush() - sub.Unsubscribe() + // 正确地消费到了消息 + // 可用 nats.Msg 对象处理任务 } ``` + +#### 结合 colly 的消息生产 + +#### 结合 colly 的消息消费 diff --git a/images/ch6-09-nats-protocol-pub.png b/images/ch6-09-nats-protocol-pub.png new file mode 100644 index 0000000000000000000000000000000000000000..14d931e7d56c4ce7ff14753b67f9d825966743e6 GIT binary patch literal 20118 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 literal 0 HcmV?d00001 diff --git a/images/ch6-09-nats-protocol-sub.png b/images/ch6-09-nats-protocol-sub.png new file mode 100644 index 0000000000000000000000000000000000000000..2721c29c69151b32939a30c5c5b154d1a75194a2 GIT binary patch literal 15435 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 ZFn4-YUk2Wch~B^Om61>suMss0`9Fg5i^~82 literal 0 HcmV?d00001