Java

Kafka 总结

consumer 是推还是拉? https://kafka.apache.org/documentation/#design_pull kafka 生产者端生成消息推送(push)到 broker,消费者端从 broker 拉取(pull)消息。 统一采用 pull 的方式? boker 从生产者 pull 消息。在生产者数量庞大的场景下,broker 需要管理维护很多的关系,简直是梦魇。所以采用的是生产者往 broker push 消息。 统一采用 push 的方式? broker 往 consumer push 消息。在 consumer 多样化的场景下,如果生产者的生产速率远远大于消费者,broker 控制不好,push 会造成 consumer 不堪重负。反之,由 consumer 根据自身处理速率来决定何时从 broker 拉取消息,会更好。采用 pull 的弊端在于,如果 broker 没有消息,那么就会空转,这可以通过在调用 poll 接口时传入等待时间阻塞或者传入批次数据包大小来等待阻塞。 kafka 的 ack 机制 客户端连接到 leader broker 上,发送消息之后,等待或不等待 leader broker 的 ack(是否等待取决于参数request.required.acks 配置)。比如: 客户端设置 acks=0,客户端不作任何等待,即使消息没有写入 kafka 集群。 客户端设置 acks=1,客户端会等待 Leader 副本成功写入后返回的确认,但如果 Leader 副本在消息被同步到其他副本之前崩溃,消息可能会丢失。 客户端设置 acks=all 或 acks=-1参数,leader 在接收到客户端的消息之后,先写入日志文件,然后往同步副本(ISR)发送数据,等所有的 follower 都确认消息写入成功后,leader 再给客户端发送 ack 确认。

Lombok

介绍 Lombok 是提升 Java 编码效率常用的工具,借助它开发人员可以使用注解来自动生成一些模版代码。比如 getter、setter、equals、toString 等方法。 安装 在 maven 中添加依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> <scope>provided</scope> </dependency> 在编辑器中添加插件 如:Intellij Idea,在 setting 的 plugin 里搜索lombok plugin,安装插件 使用 常用的几个注解 @Data :注在类上,自动生成类的 get、set、equals、hashCode、canEqual、toString 方法 @AllArgsConstructor :注在类上,自动生成类的全参构造方法 @NoArgsConstructor :注在类上,自动生成类的无参构造 @Setter :注在属性上,自动生成 set 方法 @Getter :注在属性上,自动生成 get 方法 @EqualsAndHashCode :注在类上,自动生成对应的 equals 和 hashCode 方法 @Log4j/@Slf4j :注在类上,自动生成对应的 Logger 对象,变量名为 log @Cleanup(“close”):注在本地变量上,自动释放资源(如:关闭 InputStream) @Synchronized:注在方法上,自动生成一个私有锁变量 @SneakyThrows:自动生成异常处理语句 注意继承关系中使用 Lombok @EqualsAndHashCode 与 @ToString 注解默认情况下忽略父类的成员变量。譬如打印时 toString 返回的结果中缺少父类的成员变量,解决办法是在注解中设置 callSuper 属性为 true, @ToString(callSuper = true) 、@EqualsAndHashCode(callsuper = true)。