Spring Kafka进阶:实现多态消息消费

Spring Kafka进阶:实现多态消息消费

Spring Kafka 官方提供了一种基于消息类型的消费模式,通过类上的 @KafkaListener 注解配合方法上的 @KafkaHandler,实现多态消息的自动路由处理。其典型实现方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@KafkaListener(id = "multi", topics = "myTopic")
static class MultiListenerBean {

@KafkaHandler
public void listen(String foo) {
...
}

@KafkaHandler
public void listen(Integer bar) {
...
}

@KafkaHandler(isDefault = true)
public void listenDefault(Object object) {
...
}
}

根据 Spring Kafka 官方文档 @KafkaListener on a Class 的说明:

When messages are delivered, the converted message payload type is used to determine which method to call.
接收到消息后,会使用转换后的消息类型来决定调用哪个方法。

开发者可以基于此特性,轻松实现从简单文本消息到复杂领域事件的各种消息处理场景。

阅读更多
EasyKafka:让消息收发更简单

EasyKafka:让消息收发更简单

一、背景与现状

目前,我们团队在使用 Kafka 时主要存在以下几类问题:

  • 问题一:一个工程对接多套 Kafka 集群,工程代码缺少对多套集群的规范管理;
  • 问题二:生产环境分为基线和灰度,对接灰度 Kafka 时,工程改动繁琐;
  • 问题三:生产/消费消息时,出现大量偏技术性的重复代码:序列化、反序列化、判空、重试等;
  • 问题四:在发送消息、消费消息过程中,存在链路丢标的情况;

因此,建设统一消息组件,以解决上述问题,简化消息收发。

阅读更多
深入Spring Kafka:消费者是如何创建的?

深入Spring Kafka:消费者是如何创建的?

在 Java 生态中,Apache Kafka 通过 kafka-clients.jar 提供了原生客户端支持。开发者需要手动创建 KafkaConsumer 实例并订阅指定主题(Topic)来实现消息消费。典型实现如下:

1
2
3
4
5
6
7
8
9
10
public void pollMessages() {
// 1. 初始化消费者实例
Consumer<String, String> consumer = new KafkaConsumer<>(getConsumerConfig());
// 2. 订阅主题并设置重平衡监听器
consumer.subscribe(Collections.singleton(topic), new RebalanceListener());
// 3. 轮询获取消息(超时时间1秒)
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
// 4. 同步提交偏移量
consumer.commitSync();
}

Spring Kafka 在原生客户端基础上进行了深度封装,通过声明式注解显著简化了开发流程。例如,只需使用 @KafkaListener 注解即可实现消息监听:

1
2
3
4
@KafkaListener(id = "orderService", topics = "order.topic")
public void handleOrderEvent(ConsumerRecord<String, String> record) {
// 业务处理逻辑
}

这种简洁的语法背后,Spring Kafka 实际上构建了一套完整的消费者(Consumer)管理机制。那么问题来了:Spring Kafka 是如何创建这些消费者的呢?

阅读更多
如何优雅地使用本地缓存?
【译】Apache Shiro介绍

【译】Apache Shiro介绍

一、什么是 Apache Shiro?

Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,表现在身份认证、授权、加密和会话管理,可用于保护任何应用程序,小到命令行应用程序、移动应用程序,大到 Web 和企业应用程序。

应用程序安全性的 4 个基石:

  • 身份验证 - 证明用户身份,通常称为用户“登录”
  • 授权 - 访问控制
  • 加密 - 保护或隐藏数据免遭窥探
  • 会话管理 - 每个用户的时间敏感状态
阅读更多
MySQL是如何给表加字段的?

MySQL是如何给表加字段的?

在我最近的项目中,经常会有给大表加字段的需求,这个过程非常耗时。

可以看到,900 万数据量的一张表,加一个字段就需要 3 个小时左右。

我们知道,给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。假设表数据量比较大,加字段的过程将会非常耗时。

不过我最关心的是,在加字段的过程中,会不会对业务的增删改查造成影响?在询问 DBA 后,他给出的答复是不会造成影响。这不禁让我思考这背后的实现原理。

下面,我们就来一探究竟。

阅读更多
MyBatis拦截器在实际项目中的应用

MyBatis拦截器在实际项目中的应用

MyBatis 是一个流行的 Java 持久层框架,它简化了数据库访问的复杂性,为开发者提供了强大的功能。其中,MyBatis 拦截器是一个非常有用的特性,可以帮助开发者灵活地解决各种问题。

本文将探讨 MyBatis 拦截器在实际项目中的应用场景和具体实现方法。

文中代码:https://github.com/studeyang/mybatis-interceptor-demo

阅读更多
Kafka 位移提交的正确姿势

Kafka 位移提交的正确姿势

你说你 Kafka 用了很多年了,但是位移提交的这些细节你未必清楚。

不久前有个同事出去面试了,他说在 Kafka 问题上被面试官藐视了。

阅读更多
Spring Security入门:保护Web应用

Spring Security入门:保护Web应用

本文我们将构建一个简单但完整的小型 Web 应用程序,以演示 Spring Security 的入门教程。大致逻辑是:当合法用户成功登录系统之后,浏览器会跳转到一个系统主页,并展示一些个人健康档案(HealthRecord)数据。

让我们开始吧!

阅读更多
今日算法13-剪绳子

今日算法13-剪绳子

一、题目描述

题目链接:https://leetcode.cn/problems/jian-sheng-zi-lcof/

难易程度:中等

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n 都是整数,n > 1 并且 m > 1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18。

1
2
3
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
阅读更多