golang实现rabbitmq消费者模式 断线重连机制

在连接第三方组件的时候实现断线重连机制是很有必要的事情,因为你不知道在啥时候他突然就抽风挂掉了。以rabbitmq为例,在突然面对大流量写入,或者连接数被打满(比如在资讯,直播等模块使用rabbitmq(惨痛的教训))mq就挂掉了,如果你的消费者没有重连机制,你的消费者进程在mq挂掉后,也会自动挂掉。然后等运维修复了mq,但是你的消费者进程却无法再次连接消费了,这就有点恐怖了。要不就写个shell 脚本 ,每隔30S或者1分钟去检测进程活度,挂掉了就重启消费者。当然最简单的还是在消费者的代码里实现断线重连机制。代码如下

package rabbitmq

import (
   "encoding/json"
   "fmt"
   "github.com/streadway/amqp"
   "time"
)

//测试用例
type Obj struct {
   Item1 string `json:"item1"`
   Item2 string `json:"item2"`
   Item3 string `json:"item3"`
}

func StartAMQPConsume() {
   defer func() {
      if err := recover(); err != nil {
         time.Sleep(3 * time.Second)
         fmt.Println("休息3秒")
         StartAMQPConsume()
      }
   }()
   conn, err := amqp.Dial("amqp://guest:guest@127.0.0.1:5672/") //mq连接地址
   if err != nil {
      fmt.Println(err)
   }
   defer conn.Close()
   ch, err := conn.Channel()
   if err != nil {
      fmt.Println(err)
   }
   defer ch.Close()
   closeChan := make(chan *amqp.Error, 1)
   notifyClose := ch.NotifyClose(closeChan) //一旦消费者的channel有错误,产生一个amqp.Error,channel监听并捕捉到这个错误
   closeFlag := false
   msgs, err := ch.Consume(
      "xly.test.queue",
      "",
      true,
      false,
      false,
      false, nil)
   var obj Obj
   for {
      select {
      case e := <-notifyClose:
         fmt.Println("chan通道错误,e:%s", e.Error())
         close(closeChan)
         time.Sleep(5 * time.Second)
         StartAMQPConsume()
         closeFlag = true
      case msg := <-msgs:
         //fmt.Println()
         if err := json.Unmarshal(msg.Body, &obj); err != nil {

            fmt.Println(err.Error())
         }
         fmt.Println(obj.Item1)

      }
      if closeFlag {
         break
      }
   }
}

只需要在main 方法里 调用这个方法即可,或者go协程调用 ,效果如下

当我关闭mq服务时会有如下效果

再次启动mq

以上就是rabbitmq 消费者断线重连的完整代码

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang 中使用 RabbitMQ 消费者,你需要使用 RabbitMQ 的 Go 客户端库 `github.com/streadway/amqp`。下面是一个简单的例子: 首先,你需要导入 RabbitMQ 的 Go 客户端库: ```go import "github.com/streadway/amqp" ``` 然后,你需要建立与 RabbitMQ 服务器的连接和通道: ```go conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { panic(err) } defer conn.Close() ch, err := conn.Channel() if err != nil { panic(err) } defer ch.Close() ``` 在通道上声明队列和绑定: ```go q, err := ch.QueueDeclare( "hello", // 队列名称 false, // 是否持久化 false, // 是否自动删除 false, // 是否独占 false, // 是否等待服务器响应 nil, // 队列的参数 ) if err != nil { panic(err) } err = ch.QueueBind( q.Name, // 队列名称 "", // routing key "amq.direct", // exchange false, nil, ) if err != nil { panic(err) } ``` 使用 `ch.Consume()` 方法消费消息: ```go msgs, err := ch.Consume( q.Name, // 队列名称 "", // 消费者名称 true, // 是否自动应答 false, // 是否独占 false, // 是否不等待服务器响应 false, // 消费者参数 ) if err != nil { panic(err) } for msg := range msgs { fmt.Println(string(msg.Body)) } ``` 在这个例子中,我们使用 `ch.Consume()` 方法从队列中消费消息。当有新的消息到达时,它会被放入 `msgs` 通道中。 注意,这个例子中的消费者是自动应答的(即 `autoAck` 参数设置为 `true`)。这意味着当消费者成功接收到消息时,它会自动将消息标记为已处理。如果你需要手动确认消息,请将 `autoAck` 参数设置为 `false`,并在处理完消息后调用 `msg.Ack(false)` 方法来确认消息。 完整代码示例:https://github.com/streadway/amqp/blob/master/_examples/simple-consumer/consumer.go
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值