赞
踩
1、kafka使用规范主要从,生产、可靠性、和消费为轴线定义使用规范,另外Kafka建议核心业务系统不要使用(对数据可靠性要求高),因为Kafka高效性能源于批量设计思想,要充分利于Kafka高效性能,前提是要允许部分数据丢失。
2、kafka使用核心:削峰、解耦、向下游并行广播通知(无可靠性保证)和分布式事务,本规范仅从削峰、解耦、向下游并行广播通知论述。
可靠性包括Producer发送消息机制的可靠性,Kafka Server(Broker)消息持久化刷盘机制和Broker主从节点消息同步机制,Consumer消息的消费机制。
acks:用于Producer指明Broker主从节点消息同步的机制,有如下三个设置:
min.insync.replicas:用于指明Producer发送的消息,Leader收到消息后,会同步到Slave节点的个数,该值默认是1,值越大,消息可告性越高,但发送效率极低。同时该参数控制消息至少被写入到多少个Leader才算是"真正写入",acks=all需要考虑真正写入;
replica.lag.time.max.ms:Kafka判断ISR中的Follower和Leader是否需要同步?根据是参数 replica.lag.time.max.ms (主从之间同步落后时间差),首先ISR 的全称是:In-Sync Replicas ISR是一个Follower的列表,里面存储的是能跟Leader数据同步一致的Follower,确定一个Follower在ISR列表中,有3个判断条件:
注意:剔除不是意味着不可用,Follower还是会去默默同步数据,随着Follower不断与Leader进行消息同步, Leader副本的 LEO也会逐渐后移 ,并最终追赶上Leader,此时该Follower就有资格进入ISR集合。另外从消息投递的效率和可靠性综合考虑,建议asks设置为1。如果设置为all(或-1),建议min.insync.replicas取Topic分区数(Partition)的1/2或者1/3,replica.lag.time.max.ms可以使用默认10s。
retries:用于指明生产者可以重发消息的次数,如果达到这个次数,最终还是失败,生产者会放弃重试并返回错误。默认情况下,生产者会在每次重试之间等待100ms ,可以通过retry.backoff.ms 参数来配置时间间隔。
kafka的刷盘机制是通过以下三个参数确定:
我们可以把log.flush.interval.messages值设为1,实现同步刷盘,同步刷盘对性能影响极大,而且现在Kafka统一由集团管理,应该不会随意改配置。
注:如果未设置log.flush.interval.ms,则使用log.flush.scheduler.interval.ms中的值。
消息生产,指Kafka生产投递消息的方式,分为同步和异步两种方式。
1.1.3.1、同步发送:
同步发送的意思就是,一条消息发送之后,会阻塞当前线程,直至返回ack。同步发送效率不高,数据可靠性高。
1.1.3.2、异步发送:
异步发送数据可靠性不高,异步发送效率较高,不会阻塞发送工作线程,但有其它开销。因此在谈异步发送方式之前,先看看异步发送的底层原理。
Kafka的Producer发送消息采用异步发送的方式时,在消息发送的过程中,涉及到了两个线程——main线程和Sender线程,以及一个线程共享变量——RecordAccumulator【记录累计器,充当一个队列】。main线程将消息发送给RecordAccumulator,Sender线程不断从RecordAccumulator中拉取消息发送到Kafka broker。
相关参数:
1.1.3.2.1、异步发送不带回调:
异步发送不带回调,指发送了就不管了,直接返回后续不再捕获发送结果。
1.1.3.2.2、异步发送带回调:
异步发送带回调,指发送了,可以设置一个回调函数捕获发送执行结果,编码可以根据发送执行结果(success/fail)做补偿。
注:消息发送失败会自动重试,不需要我们在回调函数中手动重试。
消息消费包话消费方式,和消息消费提交方式。
1.1.4.1、消费方式:
消费方式包括消息拉取方式,点对点消费和广播消费。
1.1.4.1.1:消息拉取方式:
Kafka目前已发布的版本仅支持,pull方式获取消息。
1.1.4.1.2:点对点消费:
Kafka其实不支持点对点对消费,它是以消费组的发布订阅模式消费,即:消费组消费模式是点对点。
注:关于消费组的个数,与Topic分区数的关系,具体一点来说是主分区数。
消费组由多个consumer组成,每一个消费组,只能有一个消费者消费同一topic下的的主分区,复制分区在Kafka里,只做备份数据的功能,只有当主挂了,选举成主时,才提供消费服务。
1.1.4.1.3:广播消费:
Kafka不支持广播消费,若要实现,消费端可以用动态生成消费组实现。
注:动态生成消费组,很多Kafka生产环境是禁止的,主要以下三点不足:
auto.offset.reset有以下三个可选值:
其实可以为后台应用硬编码死不同的消费组,但这样一来应用扩展性和维护性就降低了。
1.1.4.1、消费提交方式:
消费提交方式指,消息被消费者Pull以后,是手动提交,还是自动提交,可以通过如下两个参数配置:
enable.auto.commit:是否开启自动提交offset功能;
auto.commit.interval.ms:自动提交offset的时间间隔;
1.1.4.1.1、自动提交:
自动提交对于编码来说是不可控的,如果消费者在执行消费业务逻辑时,出现异常时,是不能回滚的,直接后果就是消息丢失。如果要使用此种提交方式,请确认异常补救方式。
1.1.4.1.2、手动提交:
手动提交offset的方法有两种:分别是commitSync(同步提交)和commitAsync(异步提交)。
缓冲区和消息体大小限制,主要由:max.request.size、buffer.memory、batch.size、linger.ms、message.max.bytes、max.message.bytes、fetch.max.bytes指定。
生产端缓冲区和消息体大小的配置。
注:max.request.size,建议不超过1024*2 Kb,超过2Kb开启压缩机制。
buffer.memory的本质就是用来约束Producer能够使用的内存缓冲区的大小的,内存缓冲区的作用就是预分配内存,且在使用上不会被GC回收。
通过这个参数来设置批量发送的数据大小,当积压的消息达到这个值的时候就会统一发送(发往同一分区的消息)。
这个是设置消息发送延迟,这样可以收集更多的消息后批量发送(发往同一分区的消息)。
注:当 batch.size 和 linger.ms 同时设置的时候,只要两个条件中满足一个就会发送。比如:说batch.size设置16kb,linger.ms设置50ms,那么当消息积压达到16kb就会发送,如果没有到达16kb,那么在第一个消息到来之后的50ms之后消息将会发送。
二者大小的限制最好: batch.size < buffer.memory,如果:发送的真实消息体大小(以字节为单位)> batch.size,可能会导致频繁GC。如果:batch.size > buffer.memory,可能会导致消息发不出去。
Broker配置的参数,开发人员不能控制修改,建议使用前向运维人员问清楚。
这个参数决定了 Broker 能够接收到的最大消息的大小,限制Broker上的所有Topic,如果:max.request.size > message.max.bytes,可能会导致消息发送异常。
这个参数决定了 Broker 能够接收到的最大消息的大小,它只针对某个主题生效,可动态配置,可覆盖全局的 message.max.bytes。如果:max.request.size > max.message.bytes,可能会导致消息发送异常。
消费端消息体的大小,主要指拉取消息的大小。
fetch.max.bytes 这个参数决定消费者单次从 Broker 获取消息的最大字节数。如果:fetch.max.bytes < max.request.size,可能会导致消费者消费不了消息。
常见建议操作,包括消息生产溯源,消息积压告警阈值设置,消息集压处理策略。
消息生产溯源,指生产者向下游生产投递消息后,防止下游消息丢失,无法找回。同时考虑消息投递的效率和降级异常补尝处理,建议Producer如下操作发送消息。
消息积压告警阈值设置,一种是与业务相关性不大,完全是从消息中间件特性设置的阈值。另一种是与业务相关性很大,即:上游系统投递的消息,下游系统必需在某一个时差处理,否则会影响业务。
业务相关性不大,直接找运维提供一个阈值即可。
业务相关性很大,阈值的设置:
例如:下游系统的消费速率是1 Second,上下系统业务最大允许的时差5 Minute,则积压告警阈值是:300,考虑提前告警,可以设为280。
消息集压原因:
对于1和2得找出原因解决,对于3得动态横向扩展消费端扩大消费能力,分为无序消息的扩展和有序消息的扩展。
无序消息的扩展,直接加应用服务器即可。
有序消息的扩展:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。