目录

1、前置概念

同步(Synchronous)和异步(Asynchronous)

同步异步不能和阻塞非阻塞混为一谈

2、Kafka Producer配置解读

3、Kafka Consumer配置解读

4、异常


1、前置概念

同步(Synchronous)和异步(Asynchronous)

定义:同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)。同步,就是调用某个东西是,调用方得等待这个调用返回结果才能继续往后执行。异步,和同步相反  调用方不会理解得到结果,而是在调用发出后调用者可用继续执行后续操作,被调用者通过状体来通知调用者,或者通过回掉函数来处理这个调用。

python kafka异步订阅 python异步发送kafka_数据

同步执行当调用方法执行完成后并返回结果,才能执行后续代码

python kafka异步订阅 python异步发送kafka_python kafka异步订阅_02

异步调用的话可用参考ajax,调用方法后不会等到sum方法执行完成,而是直接执行后续代码。sum方法执行完成后主要通过状态通知主线程,或者通过回调处理这次异步方法执行的结果

同步异步不能和阻塞非阻塞混为一谈

怎样理解阻塞非阻塞与同步异步的区别? - Yi Lu的回答 - 知乎

阻塞和非阻塞 强调的是程序在等待调用结果(消息,返回值)时的状态.  阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。 对于同步调用来说,很多时候当前线程还是激活的状态,只是从逻辑上当前函数没有返回而已,即同步等待时什么都不干,白白占用着资源。

同步和异步强调的是消息通信机制 (synchronous communication/ asynchronous communication)。所谓同步,就是在发出一个"调用"时,在没有得到结果之前,该“调用”就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由“调用者”主动等待这个“调用”的结果。而异步则是相反,"调用"在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在"调用"发出后,"被调用者"通过状态、通知来通知调用者,或通过回调函数处理这个调用

 

 

2、Kafka Producer配置解读

消息发送流程

Kafka的Producer发送消息采用的是异步发送的方式。在消息发送的过程中,涉及到了两个线程main线程和Sender线程,以及一个线程共享变量RecordAccumulator。main线程将消息发送给RecordAccumulator,Sender线程不断从RecordAccumulator中拉取消息发送到Kafka broker。

python kafka异步订阅 python异步发送kafka_kafka_03

batch.size:只有数据积累到batch.size之后,sender才会发送数据。

linger.ms:如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据。

acks:

producer希望leader返回的用于确认请求完成的确认数量. 可选值 all, -1, 0 1. 默认值为1

  • acks=0 不需要等待服务器的确认. 这是retries设置无效. 响应里来自服务端的offset总是-1. producer只管发不管发送成功与否。延迟低,容易丢失数据。
  • acks=1 表示leader写入成功(但是并没有刷新到磁盘)后即向producer响应。延迟中等,一旦leader副本挂了,就会丢失数据。
  • acks=all等待数据完成副本的复制, 等同于-1. 假如需要保证消息不丢失, 需要使用该设置. 同时需要设置unclean.leader.election.enable为true, 保证当ISR列表为空时, 选择其他存活的副本作为新的leader.

 

3、Kafka Consumer配置解读

手动提交offset的方法有两种:分别是commitSync(同步提交)和 commitAsync(异步提交)。两者的相同点是,都会将本次poll的一批数据最高的偏移量提交;不同点是,commitSync阻塞当前线程,一直到提交成功,并且会自动失败重试(由不可控因素导致,也会出现提交失败);而commitAsync则没有失败重试机制,故有可能提交失败。

  • commit(offsets=None)

Commit offsets to kafka, blocking until success or error. # 提交偏移量到kafka,阻塞直到成功或者出错,这只向Kafka提交偏移量。使用此API提交的偏移量将在每次重新平衡之后的第一次取出时以及在启动时使用。因此,如果需要在Kafka以外的任何地方存储偏移,则不应该使用此API。 为了避免在重新启动使用者时重新处理读取的最后一条消息,提交的偏移量应该是应用程序应该使用的下一条消息,即:last_offset+1 Parameters:    offsets (dict, optional) – {TopicPartition: OffsetAndMetadata} dict to commit with the configured group_id. Defaults to currently consumed offsets for all subscribed partitions.

 

 

  • commit_async(offsets=None, callback=None)

Commit offsets to kafka asynchronously, optionally firing callback. # 异步提交,可选择的触发回调,其余的和上面的commit一样。

  • committed(partition)

Get the last committed offset for the given partition. This offset will be used as the position for the consumer in the event of a failure. 如果有问题的分区未分配给此使用者,或者使用者尚未初始化其已提交偏移量缓存,则此调用可能会阻止执行远程调用。

 

 

4、异常

kafka 异常:org.apache.kafka.common.errors.UnknownTopicOrPartitionException: This server does not host