首页 > 其他分享 >Kafka通信模型/流程

Kafka通信模型/流程

时间:2023-06-12 11:34:41浏览次数:27  
标签:Reactor 模型 处理 流程 通信模型 Kafka 线程 连接

Kafka的Producer、Broker和Consumer之间采用的是一套自行设计的基于TCP层的协议

由于UDP协议是一种不可靠的传输协议,所以Kafka系统采用TCP协议作为服务间的通信协议

通信

通信模型

Reactor线程模型

Java NIO中的selector模型。最简单的Reactor模型中,有多个client向服务端发送请求,首先请求会达到Dispatcher组件,它负责将不同的请求分发到多个线程中处理

为什么使用Reactor

img

 

传统阻塞IO模型存在的不足

  1. 每个连接都需要独立线程处理,当并发数大时,创建线程数多,占用资源

  2. 采用阻塞IO模型,连接建立后,若当前线程没有数据可读,线程会阻塞在读操作上,造成资源浪费

解决方案

  1. 基于池化思想,避免为每个连接创建线程,连接完成后将业务处理交给线程池处理

  2. 基于IO复用模型,多个连接共用同一个阻塞对象,不用等待所有的连接。遍历到有新数据可以处理时,操作系统会通知程序,线程跳出阻塞状态,进行业务逻辑处理

Reactor线程模型的思想就是基于IO复用和线程池的结合

Reacotr模型主要分为三个角色

  1. Reactor:把IO事件分配给对应的handler处理

  2. Acceptor:处理客户端连接事件

  3. Handler:处理非阻塞的任务

Reactor线程模型分类

根据Reactor的数量和处理资源的线程数量的不同,分为三类:

单Reactor单线程模型

在Reactor中处理事件,并分发事件,如果是连接事件交给acceptor处理,如果是读写事件和业务处理就交给handler处理,但始终只有一个线程执行所有的事情

img

不足

  1. 仅用一个线程处理请求,对于多核资源机器来说是有点浪费的

  2. 当处理读写任务的线程负载过高后,处理速度下降,事件会堆积,严重的会超时,可能导致客户端重新发送请求,性能越来越差

  3. 单线程也会有可靠性的问题

单Reactor多线程模型

把业务处理从之前的单一线程脱离出来,换成线程池处理,也就是Reactor线程只处理连接事件和读写事件,业务处理交给线程池处理,充分利用多核机器的资源、提高性能并且增加可靠性img

不足

Reactor线程承担所有的事件,例如监听和响应,高并发场景下单线程存在性能问题

多Reactor多线程模型

把Reactor线程拆分了mainReactor和subReactor两个部分,mainReactor只处理连接事件,读写事件交给subReactor来处理。业务逻辑还是由线程池来处理

img

mainRactor只处理连接事件,用一个线程来处理就好。处理读写事件的subReactor个数一般和CPU数量相等,一个subReactor对应一个线程,业务逻辑由线程池处理

这种模型使各个模块职责单一,降低耦合度,性能和稳定性都有提高 这种模型在许多项目中广泛应用,比如Netty的主从线程模型等

通信流程

Kafka系统采用的是Reactor多线程模型,即通过一个Acceptor线程处理所有的新连接,通过多个Processor线程对请求进行处理(比如解析协议、封装请求、转发等)

  • Client向Server发送请求时,Acceptor负责接收TCP请求,连接成功后传递给Processor线程;

  • Processor线程接收到新的连接后,将其注册到自身的Selector中,并监听READ事件

  • 当Client在当前连接对象上写入数据时,会触发READ事件,根据TCP协议调用Handler进行处理

  • Handler处理完成后,可能会有返回值给Client,并将Handler返回的结果绑定Response端进行发送

Kafka老的版本中,以NIO作为网络通信的基础,通过将多个Socket连接注册到一个Selector上进行监听,只用一个线程就能管理多个连接,这极大的节省了多线程的资源开销。

在Kafka之后的新版本中,依然以NIO作为网络通信的基础,也使用了Reactor多线程模型,不同的是,新版本将具体的业务处理模块(Handler模块)独立出去了,并用单独的线程池进行控制

独立Handler模块的优势

  • 能够单独指定Handler的线程数,便于调优和管理

  • 防止一个过大的请求阻塞一个Processor线程

  • Request、Handler、Response之间都是通过队列来进行连接的,这样它们彼此之间不存在耦合现象,对提升Kafka系统的性能很有帮助

标签:Reactor,模型,处理,流程,通信模型,Kafka,线程,连接
From: https://www.cnblogs.com/yogayao/p/17474570.html

相关文章

  • 超详细的ERP流程剖析
    1概览ERP是什么意思,大家有研究过吗?ERP的全称是EnterpriseResourcePlanning,翻译成中文是企业资源计划。那企业的资源都包含哪些方面?然后又该对哪些环节进行计划呢?我们先从宏观的视角研究一下,请看下面这张图: (ps:这张图整理了小一个钟头。 )简单来说,一个完整的ERP,包含进销存、生产制......
  • 8 Go 流程控制
    在程序中,程序运行的流程控制决定程序时如何执行的,是我们必须掌握的,Go语言中主要有三大流程控制语句顺序控制分支控制循环控制跳转控制语句gotoGo语言的goto语句可以无条件的转移到程序中指定的行。goto语句通常与条件语句配合使用。可以用来实现条件转移,跳出循环体......
  • 2-kafka日志和分区
    1.topic中日志存储形式分区内部有序,但是同一分区不同partion之间的消息的顺序是无法得知的;2.分区有序概念 kafka是消息队列,数据在写入topic是按照轮循或者hash(key)%分区数方式将数据写入,分区中是无法保证分区与分区数据的顺序,只能保证分区内部数据的顺序,但是无法得知分区......
  • 海康 门禁的对接流程: Unity接入海康威视门禁(获取门禁状态信息、门禁反控等)
    一、海康开放平台Demo测试我们在使用demo脚本之前要进行两次测试,首先使用接口测试工具进行api测试,这样可以确定我们的接口测试是否正常,测试成功后我们在进行Demo测试,这个可以确定我们下载的Demo的脚本可以使用,两个测试都成功后,就可以将脚本拖入到Unity中使用了1.接口测试工具下载......
  • dubbo源码深度分析:62个文档+中文注释+流程图+思维导图
    你好,我是田哥为满足群里大部分同学的需求,国庆期间,我重新对Dubbo源码进行梳理,一共7个内容:1、Dubbo核心知识总结2、Dubbo源码分析指南3、Dubbo服务发布流程4、Dubbo服务调用流程5、Dubbo中文版注释6、共62节Dubbo文档7、看Dubbo源码必备的知识点咱们话不多说,直接看内容。Dubbo核心知......
  • apache安装证书参考流程
    1,申请好证书96net.com.cn.pem96net.com.cn.key2,若无/etc/httpd/ssl目录,可通过mkdir/etc/httpd/ssl命令行创建。3,首次安装的Apache服务器,conf.d、conf、conf.modules.d等目录默认在/etc/httpd目录下。4,在/etc/httpd/conf目录下的httpd.conf配置文件找到Include......
  • kafka 监控系列kafka manager
    Kafka在雅虎内部被很多团队使用,媒体团队用它做实时分析流水线,可以处理高达20Gbps(压缩数据)的峰值带宽。为了简化开发者和服务工程师维护Kafka集群的工作,构建了一个叫做Kafka管理器的基于Web工具,叫做KafkaManager。这个管理工具可以很容易地发现分布在集群中的哪些topic分......
  • Apache Kafka监控之KafkaOffsetMonitor
    当你将Kafka集群部署之后,你可能需要知道当前消息队列的增长以及消费情况,这时候你就得需要监控它。今天我这里推荐两款Kafka开源的监控系统:KafkaOffsetMonitor和KafkaWebConsole。 KafkaOffsetMonitor是用来实时监控Kafka集群的consumers以及它们在partition中的offset(偏移量)......
  • kafka的使用—系统保卫战
    前言最近有个需求,在不同的系统中做数据同步。我们是java+mysql、他们是c#+sqlserver。需求是sqlserver提出的,并且他们提出要实时,并且要我们主动推数据给他们。他们接口都提供好了,说要我们对数据库表操作的时候调用他们的接口把数据传他们。咋看没有什么事,不就是一个接口的调用么。......
  • 浏览器打开一个网页的全流程
    浏览器打开一个网页的全流程简介互联网日常生活中最为常见的行为便是在浏览器输入一个网址,然后浏览网页内容,这样一个简单的行为背后有哪些技术细节呢,本文将做一些介绍.全流程可拆分为4个主要步骤将域名解析为IP地址与目标主机建立TCP连接(三次握手)发送与接受数据......