非阻塞和阻塞的主要区别不在于速度快慢,而在于对系统稳定性和可用性的影响:
阻塞方式:
requestsChan <- item // 如果channel满了,这里会一直等待
非阻塞方式:
select {
case requestsChan <- item:
// 成功发送
default:
// channel满时立即返回
}
所以非阻塞不是为了追求速度,而是为了: 1. 提高系统稳定性 2. 防止级联故障 3. 保证核心功能可用性 4. 系统的优雅降级
具体选择要看业务场景: - 如果是必须处理的关键数据 -> 用阻塞方式 - 如果是统计分析类非关键数据 -> 用非阻塞方式