前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang连接rabbitmq导致channel不断增加的解决方案

Golang连接rabbitmq导致channel不断增加的解决方案

原创
作者头像
用户2825890
发布2023-08-31 12:47:24
4100
发布2023-08-31 12:47:24
举报
文章被收录于专栏:点滴随笔点滴随笔

背景

项目中所有的智能终端产生的事件都会通过rabbitmq进行推送,项目运行初期并未发现事件丢失情况,但运行一段时间,就会出现事件无法推送,经排查,发现是由rabbitmq的channel超过系统最大限制引起的。

代码片段

代码语言:javascript
复制
// 创建mq服务 
// getCh提供发送和订阅所需的channel
func (q *Mq) getCh(ex, extype string) *amqp.Channel { 
	ch, err := q.Conn.Channel()

	if err != nil {
		fmt.Println("创建channel失败", err)
	}
	// defer ch.Close()
	err = ch.ExchangeDeclare(
		ex,     
		extype, 
		true,         
		false,        
		false,       
		false,        
		nil,          
	)
	if err != nil {
		fmt.Println("创建Exchange失败", err)
	}
	return ch
}

getCh会不断创建新的连接,导致超过系统限制。直觉告诉我们,ch.Close即可,但是这会带来系统开销。我的解决方案是,创成一个sync.Map,将channel存放在内存中,这样可以不必重复创建channel,最大程度复用channel.

优化代码

代码语言:javascript
复制
impore ("sync")
var channelMap sync.Map
func (q *Mq) getCh(ex, extype string) *amqp.Channel { 
    // 增加代码 1
    if c,ok:=channelMap.Load(Exchange);ok && c!=nil{
		return c.(*amqp.Channel)
	}
	
	ch, err := q.Conn.Channel()
	
	if err != nil {
		fmt.Println("创建channel失败", err)
	}
	// defer ch.Close()
	err = ch.ExchangeDeclare(
		ex,     
		extype, 
		true,         
		false,        
		false,       
		false,        
		nil,          
	)
	if err != nil {
		fmt.Println("创建Exchange失败", err)
	}
	// 增加代码 2
	channelMap.Store(Exchange,ch)
	return ch
}

致此系统运行良好,再无事件丢失情况发生

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 代码片段
  • 优化代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档