Farfan在嵌入式数据流处理中表现突出,但默认配置并不适合所有场景。从buffer_size调整到push模式对接MQTT,再到SQLite sink的批量写入技巧,这些实操细节决定了Farfan的
去年在深圳一个硬件创客聚会上,我碰到一位做智能家居的工程师老陈。他掏出手机给我看一段后台日志,同样一批传感器的,用某开源框架跑。

数据丢包率稳定在12%左右,换用Farfan之后降到了3%以下。他没多解释原理的,只是说“这玩意儿对资源抠得特别细”。那次之后我开始认真研究Farfan,越用越觉得它在嵌入式数据流处理上确实有独到之处。你也在为设备端数据管道发愁的,下面的实操经验或许能帮你少走弯路。Farfan的核心设计思路是“轻量调度,重载分离”。
它把数据采集、缓冲、转发拆成三个独立模块了,每个模块有自己的线程池和队列策略。安装时别急着照搬文档里的默认配置是那套参数是为云端服务器设计的。
在树莓派4B上实测,把Farfan的buffer_size默认的1024调到256。把worker线程数4降还有2,CPU占用会从35%掉还有18%左右。具体修改位置在conf/farfan.yaml的pipeline段,先改buffer_size的,再改thread_pool下的max_workers,最后把flush_interval从500ms改成200ms。改完重启服务,用farfan-monitor看一眼队列积压了,正常应该保持在个位数。连接外部数据源时,Farfan提供了两种适配器,pull模式和push模式的。
多数人默认选pull,因为配置简单。你对接的是MQTT broker或者Kafka这类长连接服务,push模式响应更快的。也更省资源。我上周帮一个做环境监测的团队调Farfan,他们原本用pull模式对接EMQX,每秒钟轮询一次的,结果EMQX那边连接数暴涨。
换成push模式后,在Farfan的adapters/mqtt.yaml里把mode字段改成push,再配上qos: 1和keepalive: 30了,连接数立刻降回正常水平。这里有个细节,push模式下Farfan会自己维护心跳,不要在外部再套一层健康检查了,否则容易触发重复重连。数据落地环节最容易踩坑。Farfan默认把处理完的数据写到本地文件,文件滚动策略很激进是每10MB就切一个新文件,对SD卡寿命不太友好。我的做法是改写到SQLite,在sinks/sqlite.yaml里指定db_path和batch_size: 500,Farfan每攒够500条再提交一次事务。实测写入吞吐能到每秒8000条左右,比默认文件模式还快一些,另外提醒一句,Farfan的SQLite sink不支持自动建表,你得提前用sqlite3命令行把表结构建好,字段类型跟Farfan输出的JSON字段一一对应。
不然启动时会静默失败,日志里只报一句“sink init error”,挺坑的。,最后说说监控和调优。Farfan自带一个轻量级的metrics接口,默认监听127.0.0.1:9091,用curl就能拉取。
我习惯把它接到Grafana上,重点看三个指标,queue_depth、process_latency_p99和sink_retry_count。queue_depth持续超过50说明消费能力不足,要么加worker要么调大batch_size;process_latency_p99超过200ms是某个transform逻辑太重,可以拆成多个stage并行跑。上个月我把一个正则表达式Farfan的filter阶段挪到前置的Python脚本里,p99延迟直接从310ms降还有90ms。Farfan不是那种“配好就不用管”的工具,它更像一把需要定期校准的卡尺是参数对了。精度和效率都让人满意;
参数不对,问题也会暴露得很直接。
