Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
酥脆的小菠萝
hexbook
提交
905eac76
H
hexbook
项目概览
酥脆的小菠萝
/
hexbook
通知
5
Star
4
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hexbook
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
905eac76
编写于
9月 12, 2021
作者:
S
star
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
kafka
上级
a9a8f0c4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
140 addition
and
3 deletion
+140
-3
notes/中间件/消息队列中间件/消息队列中间件-Kafka.md
notes/中间件/消息队列中间件/消息队列中间件-Kafka.md
+140
-3
未找到文件。
notes/中间件/消息队列中间件/消息队列中间件-Kafka.md
浏览文件 @
905eac76
...
...
@@ -972,12 +972,149 @@ Kafka 最佳实践配置:
---
#### 9.Kafka 与
#### 9.Kafka 与
SpringBoot
创建 Kafka Producer 程序:
1. 创建 SpringBoot 应用程序,选择 web、kafka 组件。
2. 进行配置:
~~~properties
server.port=8080
spring.kafka.producer.bootstrap-servers=192.168.253.136:9092
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
~~~
3. 创建生产者组件:
~~~java
@Component
public class KafkaProducer {
public static final String TOPIC = "test-topic";
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void sendMessage(KafkaMessage message) {
kafkaTemplate.send(TOPIC, JSONUtil.toJsonStr(message));
}
}
~~~
`kafkaTemplate.send` 方法将会返回一个 `ListenableFuture<SendResult<String, String>>` 对象,我们可以从这个 future 中获取消息发送结果,也可以添加回调函数:
~~~java
ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(TOPIC, JSONUtil.toJsonStr(message));
future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
@Override
public void onFailure(Throwable throwable) {
System.out.println("消息发送失败:" + throwable.getMessage());
}
@Override
public void onSuccess(SendResult<String, String> stringStringSendResult) {
System.out.println("消息发送成功:" + stringStringSendResult.getRecordMetadata());
}
});
~~~
4. 创建 controller 用来生产消息:
~~~java
@Slf4j
@RestController
@RequestMapping("/demo")
public class KafkaController {
@Autowired
private KafkaProducer producer;
@PostMapping("/send")
public void send(@RequestBody KafkaMessage message) {
log.info("received message...");
producer.sendMessage(message);
}
}
~~~
创建 Kafka Consumer 程序:
1. 创建 SpringBoot 应用程序,选择 kafka 组件。
2. 进行配置:
~~~properties
server.port=8081
spring.kafka.consumer.bootstrap-servers=192.168.253.136:9092
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
~~~
3. 创建监听程序:
~~~java
@Component
public class KafkaConsumer {
public static final String TOPIC = "test-topic";
@KafkaListener(topics = TOPIC, groupId = "my-group")
public void acceptMessage(ConsumerRecord<String, String> record) {
System.out.println("topic:" + record.topic() + ",partition:" + record.partition() +
",key:" + record.key() + ",value:" + record.value() + ",timestamp:" + record.timestamp());
}
}
~~~
通过 KafkaListener 注解,当监听到消息时传入到 record 中进行后续处理。
>
如果在
SpringBoot
中用到的主题未创建,SpringBoot
将会为我们自动创建主题。
S
pringBoot 设置多线程消费:
~
~~java
@
KafkaListener(topics = TOPIC, groupId = "my-group", concurrency = "3")
p
ublic void acceptMessage(ConsumerRecord<String, String> record, Consumer<String, String> consumer) {
System.out.println(consumer.metrics().keySet());
System.out.println("topic:" + record.topic() + ",partition:" + record.partition() +
",key:" + record.key() + ",value:" + record.value() + ",timestamp:" + record.timestamp());
}
~
~~
注
意:concurrency 为消费者数量,应当小于等于主题分区数量。
>
:boxing_glove: 更多 Kafka 与 SpringBoot 的使用方法参考:https://docs.spring.io/spring-kafka/docs/current/reference/html/#preface
-
--
#### 10.Kafka 常见面试题
\ No newline at end of file
#### 10.Kafka 常见面试题
Kafka 常见应用场景?Q
1.
日志收集或流式系统
2.
消息系统
3.
用户活动跟踪或运营指标监控
Kafka 如何保证消息有序性?(Kafka 只支持单 Partion 有序)
1.
对每一组需要顺序的消息指定同一个 key,这样这些消息将会被分发到同一个 Partion 中。
2.
读取消息时的处理方法:
1.
单线程消费消息时,消息是有序的。
2.
采用多线程消费 Partion 中的消息时,可以设计 N 个 queue,相同 key 的消息放入同一个 queue,每个 queue 由一个单独的线程执行。
几大消息中间件比较:https://my.oschina.net/blogByRzc/blog/3012251
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录