什么是Kakfka
Kafka是一款分布式消息发布和订阅系统,具有高性能、高吞吐量的特点而被广泛应用与大数据传输场景。它是由LinkedIn公司开发,使用Scala语言编写,之后成为Apache基金会的一个顶级项目。kafka提供了类似JMS的特性,但是在设计和实现上是完全不同的,而且他也不是JMS规范的实现。
Kafka产生的背景
kafka作为一个消息系统,早起设计的目的是用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipeline)。活动流数据是所有的网站对用户的使用情况做分析的时候要用到的最常规的部分,活动数据包括页面的访问量(PV)、被查看内容方面的信息以及搜索内容。这种数据通常的处理方式是先把各种活动以日志的形式写入某种文件,然后周期性的对这些文件进行统计分析。运营数据指的是服务器的性能数据(CPU、IO使用率、请求时间、服务日志等)。
Kafak的应用场景
由于kafka具有更好的吞吐量、内置分区、冗余及容错性的优点(kafka每秒可以处理几十万消息),让kafka成为了一个很好的大规模消息处理应用的解决方案。所以在企业级应用长,主要会应用于如下几个方面
行为跟踪
kafka可以用于跟踪用户浏览页面、搜索及其他行为。通过发布-订阅模式实时记录到对应的topic中,通过后端大数据平台接入处理分析,并做更进一步的实时处理和监控
日志收集
日志收集:日志收集方面,有很多比较优秀的产品,比如 Apache Flume ,很多公司使用kafka 代理日志聚合。日志聚合表示从服务器上收集日志文件,然后放到一 个集中的平台(文件服务器)进行处理。在实际应用开发中,我们应用程序的 log 都会输出到本地的磁盘上,排查问题的话通过 linux 命令来搞定,如果应用程序组成了负载均衡集群,并且集群的机器
有几十台以上,那么想通过日志快速定位到问题,就是很麻烦的事情了。所以一般都会做一个日志统一收集平台管理 log 日志用来快速查询重要应用的问题。所以很多公司的套路都是把应用日志几种到 kafka 上,然后分别导入到 es 和 hdfs 上,用来做实时检索分析和离线统计数据备份等。而另一方面, kafka 本身又提供了很好的 api 来集成日志并且做日志收集
Kafka的安装
集群部署方式请参考官网:Kafka quickStart
这里说一下自己踩得坑:我使用的是云服务器,按照官网教程安装完成后服务器本机创建topic、发送消息都ok。就是自己电脑一直连接不上,检查了端口什么的都是放开了的。网上搜了一下,说的是advertised.listeners 需要配置。具体配置如下:
listeners=PLAINTEXT://:9092
# Hostname and port the broker will advertise to producers and consumers. If not set,
# it uses the value for "listeners" if configured. Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
advertised.listeners=PLAINTEXT://服务器外网ip:9092
advertised.host.name=VM_0_11_centos
一般情况下应用部署,都是内网访问的,这里不推荐配置外网访问
Kafak API的使用
kafka ProducerConfig配置参数详解
-
ACKS_CONFIG:
0:消息发送给broker后不需要确认,性能较高,但是可能会丢失数据
1:获取broker集群中的leade后确认后后即可返回
-1:需要ISR中的所有Replica进行去人(需要获得集群中所有节点的确认)。最安全的。但是 也肯能出现数据丢失(ISR中只有一个副本)
-
BATCH_SIZE_CONFIG:
producer对同一分区的消息来说,会按照batch_size的大小,统一收集后进行批量发送(为减少网络开销)。默认16k
-
LINGER_MS_CONFIG:``
将消息delay毫秒数后再批量发送到broker,跟batch_size只要符合一个就可以。默认是0,立即发送
-
MAX_REQUEST_SIZE_CONFIG:
请求数据的最大值,默认值1M。调优的参数
-
RETRIES_CONFIG
发送失败重试次数
ConsumerConfig 参数
-
AUTO_OFFSET_RESET_CONFIG
earliest : 对于新的groupId来说,消费者会从最早的消息开始消费。老的groupId,从当前最大的offset开始读取
lastest: 对于新的groupId来说,直接去已经消费并且提交的最大的offset
none: 无法找到之前的offset信息后,会抛出异常
-
ENABLE_AUTO_COMMIT_CONFIG
是否自动提交,若消息未提交,消费端可重新消费
-
AUTO_COMMIT_INTERVAL_MS_CONFIG
每隔多久自动提交 (毫秒)
-
MAX_POLL_RECORDS_CONFIG
消费端拉取消息的最大条数
-
PARTITIONER_CLASS_CONFIG
自定义分区策略类的全路径
消息发送方式
同步发送
producer.send(new ProducerRecord<>("my-topic", Integer.toString(i),Integer.toString(i)));
异步发送
producer.send(new ProducerRecord<>("my-topic", Integer.toString(i), Integer.toString(i)), new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
}
});
GROUP的概念
每个consumer必须要属于一个group,即要设置groupId
针对同一topic中的同一条消息,同一个组内的消费者,只有一个consumer可以消费,不同组的间消费者可以共同消费同一条消息