由于每次打开用于发布的连接成本高昂,我正在尝试实现某种方法来保持连接处于活动状态,并在我的应用程序中共享它以发布消息。var ( Connection *amqp.Connection Channel *amqp.Channel err error)func Connect() { Connection, err = amqp.Dial("amqp://guest:guest@localhost:5672") FailOnError(err, "Failed to connect to RabbitMQ") Channel, err = Connection.Channel() FailOnError(err, "Failed to open a channel")}func CloseConnection() { err = Channel.Close() FailOnError(err, "Failed to close channel ") err = Connection.Close() FailOnError(err, "Failed to close connection ")}func KeepAlive() { queue, err := Channel.QueueDeclare( "hello", // name false, // durable false, // delete when unused false, // exclusive false, // no-wait nil, // arguments ) FailOnError(err, "couldn't publish tics") tic := "tic" for { err := Channel.Publish( "", // exchange queue.Name, // routing key false, // mandatory false, // immediate amqp.Publishing { ContentType: "text/plain", Body: []byte(tic), Expiration: "5000", }) FailOnError(err, "couldn't publish tics") time.Sleep(5 *time.Second) }}func FailOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) }}该函数是一个无限循环,每5秒发送一条虚拟消息,该消息的TTL也为5秒,因此它被销毁。KeepAlive在这里,我正在创建连接并调用 goroutine,以便它可以在后台工作,使我的连接始终处于活动状态。KeepAlive我的问题:我觉得这种方式只是一种解决方法,尽管我试图寻找如何保持活力的例子,但似乎所有这些例子都对消费者感兴趣。有没有更简洁的方法来保持我的连接处于活动状态?只要我的应用程序运行不良,我的连接就会保持活动状态吗?性能明智(网络,内存使用情况)?注意:我计划与普罗米修斯一起监视它以观看表演,但是任何关于我可能面临的问题的说明都会有所帮助附注:发送的这些抽搐将被发送到虚拟队列,因为如果我将其发送到我使用其他服务的消息的队列,它将卡在没有TTL的实际消息后面,并且这些抽搐将变得非常大。
1 回答
交互式爱情
TA贡献1712条经验 获得超3个赞
使用斯特雷德韦/阿姆克普
,您不需要自己实现保持活力。该库已提供此机制。
方法阿姆克普。Dial
构造默认检测信号为 10 秒的 。您可以在此处查看代码:Connection
// connection.go
func Dial(url string) (*Connection, error) {
return DialConfig(url, Config{
Heartbeat: defaultHeartbeat,
Locale: defaultLocale,
})
}
这通过在打开的连接上发送检测信号帧来工作,这将比将假消息发送到仅出于该原因创建的队列更有效且更易于维护。
从上面可以看出,您可以使用amqp更改连接检测信号。拨号配置
:
conn, err := amqp.DialConfig(url, amqp.Config{ Heartbeat: 5 * time.Second, })
您可能希望自己实现的是错误时重新连接逻辑。为此,您可以在这里找到一些有用的信息:如何检查通道是否仍在阅读方式/ amqp RabbitMQ客户端中工作?
- 1 回答
- 0 关注
- 62 浏览
添加回答
举报
0/150
提交
取消