Kafka进阶
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.3 生产者

生产者将消息序列化之后,发送到对应Topic的指定分区。整个生产者客户端由两个线程协调运行,这两个线程分别为主线程和Sender线程(发送线程)。生产者有三种发送消息的方式。实际上,生产者发送的动作都是一致的,不由使用者决定。这三种方式的区别在于是否正常处理到达的消息。生产者的三种消息发送方式如下。

1. fire-and-forget

把消息发送给Broker之后不关心其是否正常到达。在大多数情况下,消息会正常到达,即使出错了,生产者也会自动重试。但是如果出错了,对于我们的服务而言,是无感知的。这种方式适用于可丢失消息、对吞吐量要求大的场景,比如用户单击日志上报。

2. 同步发送

我们使用send方法发送一条消息,它会返回一个Future,调用get方法可以阻塞当前的线程,等待返回。这种方式适用于对消息可靠性要求高的场景,比如支付,要求消息不可丢失,如果丢失了则阻断业务(或回滚)。

3. 异步发送

使用send方法发送一条消息时指定回调函数,在Broker返回结果时调用。这个回调函数可以进行错误日志的记录或重试。这种方式牺牲了一部分可靠性,但是吞吐量会比同步发送高很多。可以通过后续的补偿操作弥补业务。

关于生产者,我们会在后续的章节中继续进行详细的介绍。