go rabbitmq 筆記一

rabbitMq主要是操作rabbitmq的Channel

1. docker部署rabbitmq

docker pull rabbitmq:3.8-management-alpine

2. 啓動容器

docker run -d --name rmq -e RABBITMQ_DEFAULT_USER=[username] -e RABBITMQ_DEFAULT_PASS=[password] -p 15672:15672 -p 5672:5672 rabbitmq:3.8-management-alpine

3. 下載gorabbitmq第三方庫

go get github.com/streadway/amqp

4. 連接初始化rabbitmq

dns := fmt.Sprintf("amqp://%s:%s@%s:%d/","shenyi","123","127.0.0.1",5672)
conn, err := amqp.Dial(dsn)
if err != nil {
	log.Fatal("amqp.Dial  ",err)
}

5. 連接mq後,獲取conn,然後獲取channel

channel, err := conn.Channel()
if err != nil {
	log.Println(err)
	return nil
}

6. 申請交換機

//CONST EXCHANGE_USER       = "UserExchange"
err := channel.ExchangeDeclare(EXCHANGE_USER, "direct", false, false, false, false, nil)
if err != nil {
	return fmt.Errorf("exchage error ", err)
}

7.  綁定隊列到交換機

queue, err := this.Channel.QueueDeclare(queue, false, false, false, false, nil)
if err != nil {
	return err
}
//CONST QUEUE_NEWUSER       = "newuser"
//CONST ROUTER_KEY_USERREG  = "userreg"    //註冊用戶的路由key
//CONST EXCHANGE_USER       = "UserExchange"
err = this.Channel.QueueBind(QUEUE_NEWUSER, ROUTER_KEY_USERREG, EXCHANGE_USER, false, nil)
if err != nil {
	return err
}

8. 發送消息

//CONST EXCHANGE_USER       = "UserExchange"
//CONST ROUTER_KEY_USERREG  = "userreg"    //註冊用戶的路由key
this.Channel.Publish(
    EXCHANGE_USER, 
    ROUTER_KEY_USERREG,
    //這個參數設置爲true如果無法投遞給queue,MQ會把消息返還生產者
    true, 
    false,
	amqp.Publishing{
		ContentType: "text/plain",
		Body:        []byte("消息內容"),
	},
)

9. 消費消息

   1. 首先,連接mq,然後獲取conn,再獲取channel,

    限流, 同時只能處理2個請求

err := channel.Qos(2, 0, false)
if err != nil {
	log.Fatal("mq.Channel.Qos ", err)
}

消費消息

msgs, err := channel.Consume(
    queue, 
    key, 
    //是否自動確認消息
    false, 
    false, 
    false, 
    false, 
    nil)
if err != nil {
	return err
}
for msg := range msgs {
	fmt.Println("msg:", string(msg.Body))
    //這裏進行處理流程,如果處理成功
    msg.ACck(false)   //Ack後消息會從rabbitmq中刪掉,如果不ack,下次連接還會收到消息
    //如果處理失敗  
    msg.Reject(false)  //丟棄消息
    //msg.Nack()       //標記這條消息未確認 
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章