文章上下架(kafka实现)

86 阅读4分钟

文章上下架(kafka实现)

一、认识Kafka

Kafka 是一个分布式流处理平台,也是一个高吞吐量的分布式消息队列系统。它最初由 LinkedIn 公司开发,后来成为 Apache 软件基金会的顶级项目。

以下是 Kafka 的一些关键特点和概念:

  1. 消息发布和订阅模型:Kafka 使用发布-订阅模型,消息的发送者称为生产者(producer),消息的接收者称为消费者(consumer)。生产者将消息发送到 Kafka 集群的一个或多个主题(topic),而消费者可以订阅一个或多个主题,并从中读取消息。
  2. 分布式架构:Kafka 以分布式方式运行,可以通过水平扩展来处理大规模的数据流。它将消息分散存储在多个节点上,同时采用副本机制确保数据的可靠性和容错性。
  3. 高吞吐量:Kafka 的设计目标之一是提供高吞吐量的消息传输能力。它能够处理大量的实时数据,每秒可以处理数十万甚至数百万条消息。
  4. 持久性和可靠性:Kafka 使用持久性的存储机制,消息被写入磁盘并复制到多个副本中,以确保消息的持久性和可靠性。即使在发生故障或节点失效的情况下,数据也不会丢失。
  5. 分区和分区再平衡:Kafka 将每个主题划分为多个分区(partition),每个分区都是有序且独立存储的。分区可以在集群中的多个节点之间进行负载均衡,并支持动态的分区再平衡。
  6. 多种消息传输语义:Kafka 提供了多种消息传输语义,包括至少一次传递、最多一次传递和精确一次传递。这些语义可以根据应用程序需求进行配置,以满足不同的可靠性和性能要求。
  7. 流处理支持:Kafka 还提供了流处理功能,允许开发者以流式方式实时处理和转换数据流。通过 Kafka Streams 或其他流处理框架,可以在 Kafka 中进行实时流处理和复杂事件处理。

二、Kafka应用

Kafka 被广泛应用于大规模数据处理、日志收集与分析、事件驱动架构、实时流处理等场景。它的高吞吐量、可靠性和扩展性使得它成为处理大规模数据流的理想选择。

三、使用kafka实现文章上下架

代码仓库:gitee.com/weiweitest5…

具体实现

  1. 准备工作:

    • 安装 Kafka 并启动 Kafka 服务器。
    • 创建一个 Spring Boot 项目并添加所需的依赖。
  2. 配置 Kafka:

    • 在 Spring Boot 的配置文件(application.properties 或 application.yml)中添加 Kafka 的相关配置,包括 Kafka 服务器地址、端口号等信息。
  3. 创建生产者:

    • 使用 Spring Kafka 提供的 KafkaTemplate 类来创建一个消息生产者。
    • 在需要记录日志的地方,使用 KafkaTemplate 发送消息到指定的 Kafka 主题。
注:(1-1)

Kafka对于zookeeper是强依赖,保存kafka相关的节点数据,所以安装Kafka之前必须先安装zookeeper

  • Docker安装zookeeper

下载镜像:

docker pull zookeeper:3.4.14

创建容器

docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14
  • Docker安装kafka

下载镜像:

docker pull wurstmeister/kafka:2.12-2.3.1

创建容器 114.116.45.207

docker run -d --name kafka \
--env KAFKA_ADVERTISED_HOST_NAME=114.116.45.207 \
--env KAFKA_ZOOKEEPER_CONNECT=114.116.45.207:2181 \
--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://114.116.45.207:9092 \
--env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
--env KAFKA_HEAP_OPTS="-Xmx256M -Xms256M" \
--net=host wurstmeister/kafka:2.12-2.3.1
docker run -d --name kafka \
--env KAFKA_ADVERTISED_HOST_NAME=114.116.45.207 \
--env KAFKA_ZOOKEEPER_CONNECT=114.116.45.207:2181 \
--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://114.116.45.207:9092 \
--env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
--env KAFKA_HEAP_OPTS="-Xmx256M -Xms256M" \
--net=host wurstmeister/kafka:2.12-2.3.1
注:(2-1)

生产者和消费者都需要配置kafka相关配置

kafka:
  bootstrap-servers: 114.116.45.207:9092
  producer:
    retries: 10
    key-serializer: org.apache.kafka.common.serialization.StringSerializer
    value-serializer: org.apache.kafka.common.serialization.StringSerializer
  consumer:
    group-id: leadnews-article-test
    key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

image.png

注:(3-1)

生产者和消费者代码实现

image.png

①:生产者核心代码:

// 发送消息,通知article端修改文章配置
if(wmNews.getArticleId() != null){
    Map<String,Object> map = new HashMap<>();
    map.put("articleId",wmNews.getArticleId());
    map.put("enable",dto.getEnable());
    try {
        kafkaTemplate.send(WmNewsMessageConstants.WM_NEWS_UP_OR_DOWN_TOPIC,JSON.toJSONString(map));
    } catch (Exception e) {
        log.info(e.toString());
        throw new RuntimeException(e);
    }
}

①:消费者核心代码:

@Component
@Slf4j
public class ArtilceIsDownListener {

    @Autowired
    private ApArticleConfigService apArticleConfigService;


    @KafkaListener(topics = WmNewsMessageConstants.WM_NEWS_UP_OR_DOWN_TOPIC, groupId = "leadnews-article-test")
    public void onMessage(String message){
        if(StringUtils.isNotBlank(message)){
            Map map = JSON.parseObject(message, Map.class);
            apArticleConfigService.updateByMap(map);
            log.info("article端文章配置修改,articleId={}",map.get("articleId"));
        }
    }
}

③:演示展示

image.png