这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
一、本堂课重点内容:
- rabiitmq
二、rabiitmq
rabbitmq是当前比较常用的消息队列工具,下面将对此进行一个初步的讲解。
消息队列可以用在哪里呢?
- 异步处理,例如a+b+c事件,如果同步的话需要Ta+Tb+Tc,如果是异步的话那就max(a,b,c),因此为了更快响应,采用rabbitmq是必要的。
- 应用解耦:不需要更新接口,类似gateway的作用,只需要关注业务逻辑本身。
- 流量控制:可以控制流量,削峰。防止激增流量把服务器打挂
消息队列包括什么?
- 消息代理(message broker)和目的的(destination)
- 两种方式达到:队列(点对点)以及主题(发布订阅)
- 点对点:消息只有唯一的发送者和接收者
- 发布订阅:多个接收者,类似订阅报纸
rabbitmq:
- publisher:message+router-key
- broker:exchange交互机、exchange负责接收消息、queue的binding(储存信息)
- consumer:connection,一个客户端只会建立一条连接
- channel:connection里的通道,信道
首先是安装,采用docker的形式进行安装。
// docker pull rabbitmq
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management
1.1 consumer
package main
import (
"fmt"
"github.com/rabbitmq/amqp091-go"
"log"
)
func main() {
conn, err := amqp091.Dial("amqp://root:123456@localhost:5672")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
log.Fatal(err)
}
q, err := ch.QueueDeclare(
"name",
false,
false,
false,
false,
nil,
)
if err != nil {
log.Fatal(err)
}
err = ch.Qos(
1,
0,
false,
)
if err != nil {
log.Fatal(err)
}
msgs, err := ch.Consume(q.Name, "", true, false, false, false, nil)
if err != nil {
log.Fatal(err)
}
for v := range msgs {
fmt.Printf("bodt = %s\n", v.Body)
}
}
1.2 producter
package main
import (
"github.com/rabbitmq/amqp091-go"
"log"
)
func main() {
conn, err := amqp091.Dial("amqp://root:123456@localhost:5672")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
log.Fatal(err)
}
q, err := ch.QueueDeclare(
"name",
false,
false,
false,
false,
nil,
)
if err != nil {
log.Fatal(err)
}
err = ch.Publish(
"",
q.Name,
false,
false,
amqp091.Publishing{
ContentEncoding: "text/plain",
Body: []byte("shuaige cong"),
},
)
if err != nil {
log.Fatal(err)
}
}