1)数百台服务器同时产生日志
2)传感器网络每秒上传万级数据点
3)微服务架构中多个模块需要协同输出

Go语言中的Fan-In模式是一种并发设计模式,用于将多个输入通道(channel)的数据合并到单个输出通道中。它通常用于处理多路数据源的聚合场景(如日志收集、监控数据汇总等)。
Fan-In模式 就像一套精密的齿轮组,将多个并发数据流有序合并。这篇文章我就带大家一起深入掌握这一并发利器。
模式原理:从分到合的哲学
核心思想图解
多路输入:每个输入通道(Channel)代表独立数据源
并发转发:每个通道由专属协程(Goroutine)监听
聚合出口:所有数据最终汇入单一输出通道

核心实现步骤:
1)创建多个输入通道:每个通道代表一个独立的数据源。
2)为每个输入通道启动一个协程(goroutine):负责将数据从输入通道读取并写入统一的输出通道。
3)同步关闭输出通道:当所有输入通道的数据发送完毕后,关闭输出通道。
与Fan-Out的对比

**Fan-In(扇入)和Fan-Out(扇出)**是Go并发编程中的两种核心模式:
Fan-In 将多个输入通道(Channel)的数据聚合到单个输出通道,适用于多源数据汇总(如日志合并、监控指标聚合),通过协程监听各输入通道并统一转发,需注意同步关闭输出通道;
Fan-Out 则将单个输入通道的数据分发给多个处理协程,用于提升任务并行度(如请求分发、分片计算),需管理协程池及负载均衡。
**Fan-In是多对一的聚合,解决数据合并问题;Fan-Out是一对多的分发,优化并行处理效率。**两者常结合使用,例如先用Fan-Out拆分任务并行处理,再用Fan-In合并结果,构建高效流水线。
表格对比:
维度 | Fan-In | Fan-Out |
---|---|---|
数据流向 | 多对一合并 | 一对多分发 |
典型场景 | 结果聚合 | 任务并行 |
性能目标 | 提高消费吞吐量 | 提高生产并行度 |
实现差异 | 需要WaitGroup同步 | 通常配合Worker Pool使用 |
代码实现
这段Go代码实现了Fan-In并发模式 ,其功能是将多个输入通道(channels
)的数据合并到单个输出通道 (out
)。具体流程如下:
1)协程集群:为每个输入通道启动一个协程,持续监听并将数据转发到统一输出通道;
2)同步控制 :通过sync.WaitGroup
跟踪所有转发协程,确保它们全部执行完毕;
3)安全关闭 :由独立协程在所有数据转发完成后关闭输出通道,避免panic
风险。
javascript
func merge(channels ...<-chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// 启动转发协程集群
for _, ch := range channels {
wg.Add(1)
go func(c <-chan int) {
defer wg.Done()
for num := range c {
out <- num // 关键转发逻辑
}
}(ch)
}
// 关闭通道的哨兵协程
go func() {
wg.Wait()
close(out) // 安全关闭阀门
}()
return out
}
高效聚合多路数据流,适用于日志收集、监控指标汇总等场景,是Go并发编程中处理多源数据合并的经典实现。
实战应用场景
实时监控系统架构
比如我们设计一个多服务器监控数据聚合与报警流程:
1)数据源:三台服务器(服务器1/2/3)通过独立的指标通道(如Prometheus指标接口)发送监控数据;
2)数据聚合 :所有通道的数据通过Merge
节点(通常使用Fan-In模式实现)合并为统一数据流;
3)报警处理:聚合后的数据输入报警引擎(如基于规则的Alertmanager),触发异常检测与通知。

这个架构的核心逻辑就是通过并发合并多源数据,实现分布式系统的集中监控与实时响应,是运维系统中常见的架构设计。
分布式日志收集
这段Go代码实现了多源日志的并发聚合与增强处理 ,通过Fan-In模式将多个输入日志通道合并为统一输出流:
javascript
// 日志合并伪代码
func aggregateLogs(logChans ...<-chan LogEntry) <-chan LogEntry {
merged := make(chan LogEntry)
var wg sync.WaitGroup
for _, ch := range logChans {
wg.Add(1)
go func(src <-chan LogEntry) {
defer wg.Done()
for entry := range src {
merged <- enrichedLog(entry) // 可在此处添加处理逻辑
}
}(ch)
}
// ...同步关闭逻辑...
return merged
}
小总结
Fan-In是Go语言中处理多路数据聚合的并发设计模式,其核心是通过多协程监听多个输入通道,将分散的数据流合并到单一输出通道,适用于日志收集、监控指标汇总等场景。实现时需通过sync.WaitGroup同步协程生命周期,确保所有数据转发完成后安全关闭输出通道,避免资源泄漏。该模式以简洁的并发逻辑提升吞吐量,是构建高扩展性数据流水线的关键组件,常与Fan-Out模式配合,实现"分发-处理-聚合"的全链路高效并发。