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关闭
}