在golang中对rabbitmq进行测试,测试每个连接可创建的信道数量

本文通过四种不同场景测试RabbitMQ在并发环境下的性能表现,包括连接与通道的创建限制,探讨加锁对并发连接及数据发送的影响,揭示RabbitMQ在高并发场景下的行为特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rabbitmq环境:3.7.7,三台个人开发机组成的集群,使用haproxy代理转发

进行生产者测试,测试在go中可以连接rabbitmq的协程数。测试了四种情况

第一种:创建amqp连接不关闭,加锁创建channel,channel不关闭,一共可以创建2048个channel,执行2048次发送数据到队列,之后会报”channel id space exhausted“,经多次测试,每个连接只能创建2048个channel

第二种情况:创建amqp连接不关闭,不加锁创建channel,channel不关闭,测不出可以创建多少channel,但是只发送了几十次数据(不固定,推测是channel创建2048次后就会报错),就会报"channel id space exhausted"

结论:创建通道不加锁的情况下,大概只能成功创建几十个通道,然后就会开始报"channel id space exhausted",发送到rabbitmq的数据量少,错误频率大,加锁以后数据反而发送的多,同时支持2048个通道创建

 

第三种情况:每次重新连接rabbitmq,加锁连接rabbitmq和创建channel,只能连接两千个连接,发送成功两千次,之后报"username or password not allowed",经多次测试,大概rabbitmq只支持两千个连接。

第四种情况:每次重新连接rabbitmq,不加锁,仅仅连接了几十次,数据发送到rabbitmq的数量屈指可数,之后报"socket: too many open files“。

结论:整体运行速度偏慢,连接rabbitmq不加锁的情况下,错误较大(这个是由于发生了错误我没有return,而仅仅只是打印了错误),基本发送不到rabbitmq的队列,加锁以后,可同时创建2000个连接,且都能顺利发送到mq的队列。后来我测了一下测试环境的rabbitmq,大概只能支持七八百个连接,这个连接数量在rabbitmq中应该是可以设置的。

 

说明:加锁是为了验证rabbitmq一共支持创建多少个连接以及每个连接可以创建多少个通道。之前没有加锁的时候,发生了不少错误,导致自己对结果产生了错误估计,实际上是因为创建信道、创建连接发生错误没有return结束该函数的执行,导致出现了不加锁仅仅只有几十条消息投进rabbitmq的队列。

测试代码如下:

package main
 
import (
   "github.com/streadway/amqp"
 "fmt"
 "time"
 "sync"
)
var count int =0
var mutex sync.Mutex
func main() {
   fmt.Println(time.Now())
   conn,err:=amqp.Dial("amqp://chen:0812@10.17.90.14:8080/")
   if err!=nil {
      fmt.Println(err)
   }
   channel,err:=conn.Channel()
   if err!=nil {
      fmt.Println(err)
   }
   channel.ExchangeDeclare("test",amqp.ExchangeTopic, true, false, false, false, nil)
   channel.QueueDeclare("testQueue", true, false, false, false, nil)
   channel.QueueBind("testQueue","testKey","test",false,nil)
   channel.Close()
   for ;;{
      //go testNotCloseConn()
      go testCloseConn()
      time.Sleep(time.Nanosecond)
   }
   fmt.Println(time.Now())
}
func testNotCloseConn(conn *amqp.Connection){
   mutex.Lock()
   channel,err:=conn.Channel()
   count++
 fmt.Println(count)
   if err!=nil {
      fmt.Println(err)
      panic(err)
   }
   mutex.Unlock()
   amqpTest:=amqp.Publishing{
      ContentType:"application/json",
      Body:[]byte("{name:'chenzonqgi',host:'localhist'}"),
   }
 
   err=channel.Publish("test","testKey",false,false,amqpTest)
   if err!=nil{
      fmt.Println(err)
   }
   defer channel.Close()
   fmt.Println("发送成功!")
   time.Sleep(time.Second*600)
}
 
func testCloseConn(){
   mutex.Lock()
   conn,err:=amqp.Dial("amqp://chen:0812@10.17.90.14:8080/")
   count++
 fmt.Println(count)
   if err!=nil {
      fmt.Println("*****",count,"****")
      return
   }
   mutex.Unlock()//加锁位置
 channel,err:=conn.Channel()
   defer conn.Close()
   defer channel.Close()
   if err!=nil {
      fmt.Println(err)
   }
   amqpTest:=amqp.Publishing{
      ContentType:"application/json",
      Body:[]byte("{name:'chenzonqgi',host:'localhist'}"),
   }
   err=channel.Publish("test","testKey",false,false,amqpTest)
   if err!=nil{
      fmt.Println(err)
   }
   fmt.Println("发送成功!")
   time.Sleep(time.Second*600)//睡眠协程,不让conn和channel关闭
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值