-
Notifications
You must be signed in to change notification settings - Fork 115
Qiao Junlong edited this page Nov 23, 2015
·
10 revisions
我们使用librdkafka作为消息发送的客户端,librdkafka只提供了async接口,并将消息保存在内存队列里。如果设置了message_timeout_ms=0 (默认值)
,librdkafka会一直保持着未发送的消息,直到其发送成功。如果logkafka意外崩溃或被强制退出(如接收到SIGKILL),而此时librdkafka仍然保持了未发送的消息,那么这些消息就会丢失。
解决方法: 可选的解决方法是librdkafka提供磁盘持久化队列,librdkafka正在改进这一点。
假设当前时间是2015.01.01.03,logkafka正在收集文件f1,f2,f3还未被收集。
f1: /usr/local/logkafka/systest/src/logkafka_test.2015.01.01.01 (Collecting)
f2: /usr/local/logkafka/systest/src/logkafka_test.2015.01.01.02 (Uncollected)
f3: /usr/local/logkafka/systest/src/logkafka_test.2015.01.01.03 (Uncollected)
现在删除f1和f2,那么f2的消息会丢失。
logkafka会尽可能快地收集日志文件,但是日志文件如果过大,或者因为其他原因(网络故障)无法发送到kafka服务器,那么就会导致此文件的收集卡住。
解决方法:为了及时感知异常情况,需要监控日志收集状态(利用tools里的监控工具)。
仅当网络出现故障时才会乱序。