Skip to content

Commit cf95d2b

Browse files
committed
update cr
1 parent 63090d4 commit cf95d2b

File tree

3 files changed

+41
-81
lines changed

3 files changed

+41
-81
lines changed

ch6-cloud/ch6-09-crawler.md

Lines changed: 41 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,6 @@ func main() {
6060
c.Visit(e.Request.AbsoluteURL(link))
6161
})
6262

63-
// Before making a request
64-
c.OnRequest(func(r *colly.Request) {
65-
/*
66-
r.Headers.Set("Cookie", "")
67-
r.Headers.Set("DNT", "1")
68-
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")
69-
r.Headers.Set("Host", "www.v2ex.com")
70-
*/
71-
})
72-
7363
err := c.Visit("https://www.v2ex.com/go/go")
7464
if err != nil {
7565
fmt.Println(err)
@@ -101,97 +91,67 @@ nats 是 Go 实现的一个高性能分布式消息队列,适用于高并发
10191

10292
nats 的服务端项目是 gnatsd,客户端与 gnatsd 的通信方式为基于 tcp 的文本协议,非常简单:
10393

104-
TODO,用图画协议
105-
106-
```shell
107-
~ ❯❯❯ telnet localhost 4222
108-
Trying 127.0.0.1...
109-
Connected to localhost.
110-
Escape character is '^]'.
111-
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}
112-
sub foo 127.0.0.1
113-
+OK
114-
pub foo 2
115-
hi
116-
+OK
117-
MSG foo 127.0.0.1 2
118-
hi
119-
pub foo 11
120-
hello world
121-
+OK
122-
MSG foo 127.0.0.1 11
123-
hello world
124-
```
94+
向 subject 为 task 发消息:
12595

126-
#### 消息生产
96+
![nats-protocol-pub](../images/ch6-09-nats-protocol-pub.png)
12797

128-
生产消息只要指定 subject 即可
98+
以 workers 的 queue 从 tasks subject 订阅消息
12999

130-
```go
131-
package main
100+
![nats-protocol-sub](../images/ch6-09-nats-protocol-sub.png)
132101

133-
import (
134-
"fmt"
102+
其中的 queue 参数是可选的,如果希望在分布式的消费端进行任务的负载均衡,而不是所有人都收到同样的消息,那么就要给消费端指定相同的 queue 名字。
135103

136-
nats "github.com/nats-io/go-nats"
137-
)
104+
#### 基本消息生产
138105

139-
func main() {
140-
nc, err := nats.Connect(nats.DefaultURL)
141-
if err != nil {
142-
fmt.Println(err)
143-
return
144-
}
106+
生产消息只要指定 subject 即可:
145107

146-
// use colly to extract the url on the page
147-
err = nc.Publish("tasks", []byte("start from here"))
148-
if err != nil {
149-
// log error, retry
150-
}
151-
// 要加了 flush 对面才能收到,看来内部也有缓冲区
152-
nc.Flush()
108+
```go
109+
nc, err := nats.Connect(nats.DefaultURL)
110+
if err != nil {
111+
// log error
112+
return
153113
}
154114

115+
// 指定 subject 为 tasks,消息内容随意
116+
err = nc.Publish("tasks", []byte("your task content"))
117+
118+
nc.Flush()
155119
```
156120

157-
#### 消息消费
121+
#### 基本消息消费
158122

159123
直接使用 nats 的 subscribe api 并不能达到任务分发的目的,因为 pub sub 本身是广播性质的。所有消费者都会收到完全一样的所有消息。
160124

161125
除了普通的 subscribe 之外,nats 还提供了 queue subscribe 的功能。只要提供一个 queue group 名字(类似 kafka 中的 consumer group),即可均衡地将任务分发给消费者。
162126

163127
```go
164-
package main
165-
166-
import (
167-
"fmt"
168-
"time"
169-
170-
nats "github.com/nats-io/go-nats"
171-
)
128+
nc, err := nats.Connect(nats.DefaultURL)
129+
if err != nil {
130+
// log error
131+
return
132+
}
172133

173-
func main() {
174-
nc, err := nats.Connect(nats.DefaultURL)
175-
if err != nil {
176-
fmt.Println(err)
177-
return
178-
}
134+
// queue subscribe 相当于在消费者之间进行任务分发的分支均衡
135+
// 前提是所有消费者都使用 workers 这个 queue
136+
// nats 中的 queue 概念上类似于 kafka 中的 consumer group
137+
sub, err := nc.QueueSubscribeSync("tasks", "workers")
138+
if err != nil {
139+
// log error
140+
return
141+
}
179142

180-
sub, err := nc.QueueSubscribeSync("tasks", "workers")
143+
var msg *nats.Msg
144+
for {
145+
msg, err = sub.NextMsg(time.Hour * 10000)
181146
if err != nil {
182-
fmt.Println(err)
183-
return
147+
// log error
148+
break
184149
}
185-
186-
var msg *nats.Msg
187-
for {
188-
msg, err = sub.NextMsg(time.Hour * 10000)
189-
if err != nil {
190-
break
191-
}
192-
fmt.Println(string(msg.Data), msg.Reply, msg.Sub, msg.Subject, err)
193-
}
194-
nc.Flush()
195-
sub.Unsubscribe()
150+
// 正确地消费到了消息
151+
// 可用 nats.Msg 对象处理任务
196152
}
197153
```
154+
155+
#### 结合 colly 的消息生产
156+
157+
#### 结合 colly 的消息消费
19.6 KB
Loading
15.1 KB
Loading

0 commit comments

Comments
 (0)