一、kafka-课程介绍
kafka 3.7.0版本,作为经典分布式订阅、发布的消息传输中间件,kafka在实时数据处理、消息队列、流处理等领域具有广泛的应用场景。由于其高性能、高可靠、高吞吐,被数千家公司应用于高性能的数据管道、流分析和数据集成等不同场景,在海量实时数据传输和事件驱动的微服务架构中也被广泛地使用。

图形推演方式

学习步骤:
1、kafka集群启动
2、主题创建
3、生产消息
4、存储消息
5、消费消息
Java中,kafka与springboot进行集成
大数据场景中,我们将kafka和Flume、Spark和Flink等软件进行集成,那么kafka依然用作数据传输的消息中间件,那Flume就作为producer生产者来生产数据,而我们的Spark和Flink分布式计算引擎就作为consumer消费者来消费数据
三、kafka-软件介绍
kafka是一个由Scala与Java语言开发的分布式消息发布和订阅系统
从官网的描述上来看,kafka的核心特点就是高吞吐、高可靠、高可用、可伸缩,它的主要作用就是在大数据应用场景中用于分布式系统之间的数据交换
【需要搞明白一个问题】为什么分布式系统之间它需要使用一个软件来完成数据交换的这个过程?那说到我们数据交换啊,在Java开发的这个普通场景中,主要指的就是线程和线程之间的数据交换以及进程和进程之间的数据交换。
我们线程和线程之间是如何做数据交换的,其实我们主要是用内存来完成这个操作的。首先我们的Java虚拟机当中,每个线程呢其实是有它独立的这个栈内存空间的,每个线程是独立的,那么这两个我们的线程它们是如何交互的呢?首先它们两块内存是独立的,不过呢java虚拟机还有一块内存是它们共享的,这块内存呢我们称之为堆内存。咱们这个堆内存呢,其实就是我们所有线程共享的,那既然是所有线程共享的,那么是不是就可以将线程的数据发送到这块内存当中呢?这个肯定是没有问题的,那我们另外一个线程啊,其实就可以想办法呢,从这个堆内存当中把数据给我获取过来,因为你是共享的吗?你共享的话,你的数据放进去,我这边应该是可以获取到的,这个应该是没有问题的,那么为了数据的操作方便,Java还提供了专门的数据模型Q来作为数据的缓冲区进行数据的传输,就是我们通过一种队列的方式来完成,比较常见的呢就是阻塞队列啊BlockingQueue或者那个双端队列DQ啊等等。
其实我们通过内存就可以实现我们数据的传输了,那么根本也不需要额外的第三方软件来完成。(缺点会导致内存不够用了,内存溢出)

接下来再说说进程和进程之间的数据交互,我们在执行Java程序的时候,就会启动一个java虚拟机的进程,那这个时候呢如果你想启用第二个进程的话,那它们两个能不能共享内存来完成我们的数据交互呢?其实是不行的,为什么呢?因为我们的java虚拟机啊,它在启动的时候会向操作系统申请内存,意味着两个不同的进程它们申请的内存其实是不一样的,那也就是说每个进程的内存空间是独立的,它们无法共享,因此我们进程之间传递数据呢都是采用网络数据流来进行传输的,比如我们使用Java提供的基础的socket、ServerSocket这样的接口来实现网络的数据传输(数据需要重复发送)

我们假设这个线程1往堆内存发数据,它的速度比较快,比如它的每秒钟会发我们的50条数据,我们接收数据的这个T2线程,它处理数据的这个速率是比较慢的,比如它每秒钟只能处理我们的30条数据,这样就会导致每秒钟其实是有20条数据是来不及处理的,它积压在我们的内存当中,那你可能会觉得这20条数据也不多呀,随着时间的推移,一旦积压的数据越来越多,内存就不够用了,就会产生内存溢出,从而导致服务不可用,那这个问题在进程之间的数据交互场景中,其实同样是存在的。那既然内存不够用,咱们将数据放到磁盘文件中不就好了吗,咱们这一块加上一个磁盘文件,反正也是作为数据的中转。磁盘确实比内存的存储数据要多得多,但是还是有上限的,所以内存、磁盘、网络我们一般都称为稀有资源,那么一旦数据的发送和接收的速率长时间的不均衡,就会因为数据积压导致资源被大量的消耗,进而对系统的吞吐量造成影响,导致系统服务不稳定,严重情况下,甚至会导致系统不可用

假设我们现在有三个进程,第一个进程用来生产数据,而我们的第二个和第三个进程,它用来接收数据,如果我们的第一个进程,它发送的数据需要同时发送给第二个进程和第三个进程,那么同一份数据它就得发两份。
如果我们的数据的其中一部分,发送给第二个进程。那么另外一部分呢发送给我们第三个进程,那么我们的进程一就需要考虑对我的数据呢加一些我们的标记,来区分下游的每个不同进程,那么无形当中就需要增加一些逻辑来进行判断,来标记我们的数据,它的哪一部分发送给下游的哪个进程,而且无形中会增加我们第一个进程的逻辑处理难度,那么消耗更多的计算资源,从而降低系统的响应速度。而且你的数据可能是需要重复发送的,那么我们系统的吞吐量也会受到影响对吧。其实究其原因都是因为系统资源不够或进程之间它是直接进行数据交互所产生的,资源不够的问题呢?我们可以花钱买更好的资源来解决,但是最大的问题就是我们没有钱对吧。 咱们先考虑进程之间直接交互所产生的这些问题该如何解决,其实这里的进程的问题啊,其实就是耦合性的问题,那么耦合性的问题呢就是它们直接进行了交互吗?那我们只要不让它们直接交互也就是解耦合不就行了吗?可是我们如何让他们之间去解耦合呢?那这个时候我们就需要增加一个第三方的软件了,作为我们数据的一个缓冲区,你加上这个数据的缓冲区之后,不就降低了我们进程之间的耦合性了嘛。通过这个软件,我们可以对数据的产生和接收的速率进行调整,让整个数据的传输过程呢就更加的平稳高效了,那数据接收方呢也可以根据自己的业务场景呢

2603

被折叠的 条评论
为什么被折叠?



