转到缓冲 channel 通过选择

标签 go channels

我有 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/

相关文章:

http - 如何将数据返回给 channel 的发送者

Django/Heroku : FATAL: too many connections for role

go - 通过 SSH 流式传输 Stdout 和 Stderr,操作流然后打印到本地 Stdout 和 Stderr

go - Go 中的死锁,两个例程拆分工作

go - 如何从 CallExpr 中找到完整的包导入

go - 手动下载并放置一个 golang mod 文件

elasticsearch - Golang : Using ElasticSearch library called Goes, 如何为 bool should 方法编写可执行代码?

go - 如何在golang中制作绝对路径http重定向

django - 如何计算 django channel 组中有多少客户端

websocket - 如何检测用户是否因网络断开而离开 Phoenix channel ?