Kafka实际应用以及简洁配置
- 该博客内容
- 简单理解Kafka
- Kafka配置参数
- 实际生产者放入队列代码:代码中对象自己创建。。具体发送内容对象不予展示了
- 消费者配置和生产者配置基本相同,基本只需配置三项必填选项就好。这里就不多做介绍了。
- 消费者获取消息代码
- 本文结束
该博客内容
本博客是为了使各位兄弟姐妹能快速理解Kafka并且可以快速的配置Kafka并且使用
简单理解Kafka
首先来看一张简洁的Kafka原理图:
本图是一张Kafka集群图。
图片中间部分为Kafka集群。集群中分为多个集群分区(Broker也可以说是分区首领),每个分区中会有多个主题(Topic),主题Topic可分多个分区也就是个消息队列。消息队列存在遵循先进先出的规则。
图片左侧是Kafka生产者。通俗讲就是网队列中放置消息的。
图片右侧是Kafka消费者,也就是获取消息的。
Zookeeper只是为Kafka注册服务端口的。这里不会进行详细的解释。如果想知道详细的就需要专门去看看Zookeeper。
Kafka配置参数
Kafka的配置参数主要有8点具体配置如下:
# 指定kafka 代理地址(参数必填),可以多个(Kafa集群)
spring.kafka.bootstrap-servers=localhost:9001,localhost:9002,localhost:9003
# 指定默认topic id
spring.kafka.template.default-topic=qianyue-contract-create
# 指定listener 容器中的线程数,用于提高并发量
spring.kafka.listener.concurrency=3
# 每次批量发送消息的数量
spring.kafka.producer.batch-size=1000
#异步调用
spring.kafka.producer.type=async
#acks为0时不会等待任何响应,为1时只要首领节点收到消息生产者就会收到一个成功的反馈,为all时只有当所有参与复制的节点全部收到消息时生产者才会收到服务器的成功响应。这种模式最安全,但是延迟很高。不建议使用
spring.kafka.request.required.acks=1
#生产者键的字节数组配置(必填)
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
#生产者值的字节数组配置(必填)
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
实际生产者放入队列代码:代码中对象自己创建。。具体发送内容对象不予展示了
package com.yq.common.emuns;
/**
* 请求后的响应结果状态
* 接收结果(0:无需发送 1:已发送未接收 2:已发送已接收 )
*/
public enum CallbackReceiveStatus {
/**
* 无需发送
*/
noNeedSend("0", "无需发送", "noNeedSend"),
/**
* 已发送未接收
*/
sended_noReceive("1", "已发送未接收", "sended_noReceive"),
/**
* 已发送已接收
*/
sended_Receive("2", "已发送已接收", "sended_Receive");
/**
* 枚举对象值
*/
String _value;
/**
* 中文
*/
String _Content;
/**
* 英文名称
*/
String _Content_English;
/**
* 私有构造函数
*
* @param value 枚举值
* @param content 缓存操作
*/
private CallbackReceiveStatus(String value, String content, String _Content_English) {
this._value = value;
this._Content = content;
this._Content_English = _Content_English;
}
/**
* 取得枚举对象值
*
* @return 枚举对象值
*/
public String getValue() {
return this._value;
}
/**
* 取得缓存内容
*
* @return 缓存内容
*/
public String getContent() {
return this._Content;
}
/**
* 取得字典名称
*
* @return 缓存内容
*/
public String getContentEnglish() {
return this._Content_English;
}
}
/**
*Kafka对象
*/
@Autowired
private KafkaTemplate kafkaTemplate;
@Override
public void sendResultNoticByCount(Integer sendCountStart, Integer sendCountEnd) throws Exception {
try {
Map<String, Object> map = new HashMap<String, Object>();
Map<String, Object> cond = new HashMap<String, Object>();
cond.put("sendCountStart", sendCountStart);
cond.put("sendCountEnd", sendCountEnd);
cond.put("receiveStatus", CallbackReceiveStatus.sended_noReceive.getValue());
List<ApiResultNoticVo> apiResultNoticVoList = apiResultNoticMapper.getResultNoticByCount(cond);
for (ApiResultNoticVo apiResultNoticVo : apiResultNoticVoList) {
map.put("apiResultNoticVo", apiResultNoticVo);
log.info("执行业务结果通知任务:id:" + apiResultNoticVo.getId() + "业务类型:" + apiResultNoticVo.getServiceId() + "业务id" + apiResultNoticVo.getServiceId());
//发送消息
this.kafkaTemplate.send("qianyue-resultNotic-sendCallback", JSON.toJSON(map).toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
消费者配置和生产者配置基本相同,基本只需配置三项必填选项就好。这里就不多做介绍了。
消费者获取消息代码
try{
while(true){
//获取消息对象
ConsumerRecords<String,String> records = consumer.poll(100);
//获取消息队列
for(ConsumerRecord<String,String> record : records){
record.topic();
record.partition();
record.offset();
record.key();
record.value();
}
//同步提交
consumer.commitAsync();
}
}catch(Exception e){
log.error(e.getMessage());
}finally{
try{
//异步提交
consumer.commitSync();
}finally{
//关闭队列
consumer.close();
}
}
本文结束
本文只为了简洁的配置和使用。不涉及得到深入的内容。如果想深入了解Kafka需要自己找些相应资料。或者以后我在补充。谢谢各位兄弟姐妹。