Kafka,构建TB级异步消息系统

Kafka,构建TB级异步消息系统

一:阻塞队列

这个是Java自带的API,用于解决线程通信的问题

①BlockingQueue接口

  • 解决线程通信的问题。
  • 阻塞方法:put、take。

原理图:
在这里插入图片描述
线程Thread-1从左边存入数据
线程Thread-2从右边取出数据
阻塞队列Blocking Queue就在中间形成一道缓冲区,从而良好的解决线程通信的问题。

阻塞队列满足生产者消费者模式

②生产者消费者模式

  • 生产者:产生数据的线程。
  • 消费者:使用数据的线程。

③常见的实现类

  • ArrayBlockingQueue
  • LinkedBlockingQueue
  • PriorityBlockingQueue、SynchronousQueue、DelayQueue等。

示例代码:模拟阻塞队列

public class BlockingQueueTests {
    public static void main(String[] args) {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(10);  //队列中最多只能存10条数据
        new Thread(new Producer(blockingQueue)).start();
        new Thread(new Consumer(blockingQueue)).start();
        new Thread(new Consumer(blockingQueue)).start();
        new Thread(new Consumer(blockingQueue)).start();
    }
}

//消息生产者
class Producer implements Runnable{
    private BlockingQueue<Integer> blockingQueue;

    public Producer(BlockingQueue<Integer> blockingQueue) {
        this.blockingQueue = blockingQueue;
    }

    @Override
    public void run() {
        try {
            for (int i = 0;i < 100;i++){
                Thread.sleep(20);
                blockingQueue.put(i);
                System.out.println(Thread.currentThread().getName() + "生产:" + blockingQueue.size());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

//消息消费者
class Consumer implements Runnable{
    private BlockingQueue<Integer> blockingQueue;

    public Consumer(BlockingQueue<Integer> blockingQueue) {
        this.blockingQueue = blockingQueue;
    }

    @Override
    public void run() {
        try {
            while (true) {
                Thread.sleep(new Random().nextInt(1000));
                blockingQueue.take();
                System.out.println(Thread.currentThread().getName() + "消费:" + blockingQueue.size());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
在这里插入图片描述

二:Kafka

Kafka官网:http://kafka.apache.org
Kafka常用的命令(快速入门):https://kafka.apache.org/documentation/#quickstart

Kafka简介
-Kafka是一个分布式的流媒体平台。
-应用:消息系统、日志收集、用户行为追踪、流式处理。

Kafka特点
-高吞吐量、消息持久化、高可靠性、高扩展性。
-采用发布订阅模式。

• Kafka术语
Broker —> Kafka的服务器,Kafka集群中的每一台服务器称其为一个Broker。
Zookeeper —> Kafka中内置Zookeeper来管理它的集群。
Topic —> 消息的主题。(发布订阅模式)
Partition —> 主题的分区,一个主题可以有多个分区。
每个分区是按照从前往后依次追加写入进去数据的。
在这里插入图片描述
Offset —>消息在分区中的索引
在这里插入图片描述

Leader Replica —> 主副本,负责相应请求
Replica :副本
Kafka集群中会以副本的形式把数据多存几份。

Follower Replica —> 从副本,只负责从主副本中备份数据。

当某一时刻主副本挂掉了,系统会从从副本中选出一个充当主副本。

三:Spring整合Kafka

启动Kafka
①首先要启动Zookeeper

bin\windows\zookeeper-server-start.bat config\zookeeper.properties

②启动Kafka

bin\windows\kafka-server-start.bat config\server.properties

1、引入依赖

        <dependency>
			<groupId>org.springframework.kafka</groupId>
			<artifactId>spring-kafka</artifactId>
		</dependency>

2、配置Kafka

# KafkaProperties
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=community-consumer-group
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=3000

3、访问Kafka

  • 生产者
kafkaTemplate.send(topic, data); 
  • 消费者
@KafkaListener(topics = {"test"}) 
public void handleMessage(ConsumerRecord record) {
    record.value()
}

实例代码:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class KafkaTests {

    @Autowired
    private KafkaProducer kafkaProducer;

    @Test
    public void testKafka() {
        kafkaProducer.sendMessage("test","你好");
        kafkaProducer.sendMessage("test","在吗");
        kafkaProducer.sendMessage("test","我是zzu");

        try {
            Thread.sleep(1000 * 10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

@Component
class KafkaProducer {

    @Autowired
    private KafkaTemplate kafkaTemplate;

    public void sendMessage(String topic, String content) {
        kafkaTemplate.send(topic, content);
    }
}

@Component
class KafkaConsumer {

    @KafkaListener(topics = {"test"})
    public void handleMessage(ConsumerRecord record) {
        System.out.println(record.value());
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小本科生debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值