最近一段时间都在整理知识体系,还没整理完备,然后就被拉着做新的消息队列的接入,原来使用kafka,切到了rabbitmq。切换还算顺利,同时又有同事想做日志系统的想法。我突然灵光一线,为什么不能filebeat + 消息队列实现集中式日志管理呢?

调研

  • kafka 适合日志型 队列服务,采取订阅式的消息拉取
  • rabbitmq 功能能丰富,适合业务逻辑使用,不建议用作日志收集
功能 kafka Rabbitmq
优先级队列 不支持 支持,建议优先级大小设置在0-10之间
延迟队列 不支持 支持
死信队列 不支持 支持(死信队列,是指一些无法正常消费的消息,为了不影响正常的队列运行,将这些消息添加到死信队列,通过处理死信队列处理异常消息)
重试队列 不支持 不支持,RabbitMQ中可以参考延迟队列实现重试队列,二次封装比较简单。如果要在Kafka中实现延迟队列功能,相对比较复杂
消费模式 拉模式(订阅) 推模式+拉模式广播消费支持。Kafka对于广播消费的支持相对而言更加正统支持,但力度较Kafka弱消息
回溯 支持。Kafka支持按照Offset和timestamp两种维度进行消息回溯不支持。 RabbitMQ中消息一旦被确认消费就会被标记删除
消息堆积 支持 支持。一般情况下,内存堆积达到特定阀值时会影响其性能,但这不是绝对的。如果考虑吞吐因素,Kafka的堆积效率比RabbitMQ总体上要高很多
持久化 支持 支持
消息追踪 不支持。消息追踪可以通过外部系统来支持,但是支持力度没有内置细腻支持。 RabbitMQ中可以采用Firehose或者rabbitmq_tracing插件实现。不过开启rabbitmq_tracing插件会大幅影响性能,不建议生产环境开启,反倒是可以使用Firehose与外部链路系统结合提供高细腻度的消息追踪支持
消息过滤 客户端级别支持 不支持,但是二次封装一下也非常简单
多租户 不支持 支持
多协议 支持只支持定义协议,目前几个主流版本见存在兼容性问题 RabbitMQ本身就是AMQP协议的实现,同时支持MQTT、STOMP等协议。
跨语言 支持采用Scala和java编写,支持多种语言的客户端 采用Erlang编写,支持多种语言的客户端
流量控制 支持client和user级别,通过主动设置可将流控作用域生产者或消费者 RabbitMQ的流控基于Credit-Based的算法,是内部被动触发的保护机制,作用于生产者层面
消息顺序性 支持单分区级别的顺序性 顺序的条件比较苛刻,需要单线程发送,单线程消费并且不采用延迟队列,优先队列等一些高级功能,从某种意义上来说不算支持顺序性
安全支持 (TLS/SSL、SASL)身份认证和(读写)权限控制 与Kafka相似
幂等性 支持单个生产者单分区单回话的幂等性(单次或多次执行后是一样的) 不支持
事务性消息 支持 支持
  • filebeats 支持kafka 不支持 rabbitmq

折腾filebeats

  • Go 的kafka 已经折腾过了,为了给自己练练手准备让filebeats支持rabbitmq 。
  • 找到了https://github.com/sidleal/mqttout
  • 自己尝试使用发现新版filebeat的接口有些改变,而且他用的链接rabbitmq的底层库也比较老,唯有自己动手
  • 在原有的基础上做了改动https://github.com/xiangdong1987/mqttout感觉能用,用的到大家随便用。

总结

学习的过程就是想到就去实践,不懂得就去学习,最后达成目标,估计这就是一个大龄程序员还能继续码代码的动力了。继续整理知识体系去了。留下一个思路,用kafka+filebeats实现模调系统以及日志系统。或者听听各位大神的意见。