我有 2 个缓冲 channel 为入站请求提供服务:
rabbitQ = make(chan map[string]interface{}, 1000)
sqsQ = make (chan map[string]interface{}, 1000)
我的调度程序函数如下所示:
func dispatchMessage(params map[string]interface{}) {
if !shouldFailoverToSQS {
select {
case rabbitQ <- params:
sentToRabbitMQ++
case sqsQ <- params:
sentToSQS++
default:
log.Error("Failed to dispatch mesaage to either RabbitMQ or SQS")
}
} else {
sqsQ <- params
}
}
我希望消息总是会发送到 rabbitQ,除非缓冲区已满,但我发现调用失败并在大约一半的时间内将消息发送到 sqsQ。这不是我想要的 - 我只想在 rabbitQ 已满时发送到 sqsQ。
我该如何强制执行?
最佳答案
根据 Voker 的评论,这就是我想出的:
func dispatchMessage(params map[string]interface{}) {
//log.Debugf("Failover: %t, Len: %d", shouldFailoverToSQS, len(rabbitQ))
if !shouldFailoverToSQS {
select {
case rabbitQ <- params:
sentToRabbitMQ++
default:
select {
case sqsQ <- params:
sentToSQS++
default:
log.Error("Failed to dispatch mesaage to either RabbitMQ or SQS")
}
}
} else {
select {
case sqsQ <- params:
sentToSQS++
default:
log.Error("Failed to dispatch mesaage to either RabbitMQ or SQS")
}
}
}
关于转到缓冲 channel 通过选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44020814/