Reactor

Kafka网络模型

跟風遠走 提交于 2020-10-28 12:59:21
Kafka网络模型 摘要:很多人喜欢把RocketMQ与 Kafka 做对比,其实这两款消息队列的网络通信层还是比较相似的,本文就为大家简要地介绍下Kafka的NIO网络通信模型,通过对Kafka源码的分析来简述其Reactor的多线程网络通信模型和总体框架结构,同时简要介绍Kafka网络通信层的设计与具体实现。 一、Kafka网络通信模型的整体框架概述 Kafka的网络通信模型是基于NIO的Reactor多线程模型来设计的。这里先引用Kafka源码中注释的一段话: 相信大家看了上面的这段引文注释后,大致可以了解到Kafka的网络通信层模型,主要采用了 1(1个Acceptor线程)+N(N个Processor线程)+M(M个业务处理线程) 。下面的表格简要的列举了下(这里先简单的看下后面还会详细说明): 线程数线程名线程具体说明1kafka-socket-acceptor_%xAcceptor线程,负责监听Client端发起的请求Nkafka-network-thread_%dProcessor线程,负责对Socket进行读写Mkafka-request-handler-_%dWorker线程,处理具体的业务逻辑并生成Response返回 Kafka网络通信层的完整框架图如下图所示: Kafka消息队列的通信层模型—1+N+M模型.png

网络

断了今生、忘了曾经 提交于 2020-10-27 08:36:24
一.理论 1.应用层 1)http协议与TCP联系? 2) http/1.0和http/1.1的区别 (非持久连接与持久连接、 范围请求(断点续传) 、缓存处理、更多状态码) 3)http1.1和 http2.0 的区别?( 二进制分帧层 、 服务端推送 、 首部压缩 ) 4)http的 请求方法 有哪些? GET和POST的区别 (获取资源与传输数据、额外参数的位置、支持的编码) 5)http的 状态码 6)http和https的区别,由http升级为https需要做哪些操作? 7) https 的具体实现,怎么确保安全性? 8) cookie 和 session 的 区别 ? 9)服务器攻击(DDos攻击) 10) 对称加密 和 非对称加密 11) 数字证书的了解 12)RSA加密算法,MD5原理(MD5不算加密算法) 13) 在浏览器中输入URL后执行的全部过程 ( DHCP 获取主机和网关路由IP, ARP 解析网关路由MAC地址, DNS 解析域名,TCP连接,HTTP请求响应) 14) URL 包括哪些部分?(协议、服务器名称、文件路径、还可能带有参数) 15)http 请求 / 响应报文 构成 16) DNS? ( 查询过程? DNS记录? ) 2.运输层 1)一个机器能够使用的端口号上限是多少,为什么?可以改变吗?那如果想要用的端口超过这个限制怎么办? 2) TCP

Swoole 的底层架构及运行原理

早过忘川 提交于 2020-10-26 07:11:56
Swoole 的底层架构 首先我们来看下 Swoole 的底层架构: 我们可以看到,Swoole 主要包含以下组件: Master: 当我们运行启动 Swoole 的 PHP 脚本时,首先会创建该进程(它是整个应用的 root 进程),然后由该进程 fork 出 Reactor 线程和 Manager 进程。 Reactor: Reactor 是包含在 Master 进程中的多线程程序,用来处理 TCP 连接和数据收发(异步非阻塞方式)。Reactor 主线程在 Accept 新的连接后,会将这个连接分配给一个固定的 Reactor 线程,并由这个线程负责监听此 socket。在 socket 可读时读取数据,并进行协议解析,将请求投递到 Worker 进程;在 socket 可写时将数据发送给 TCP 客户端。 Manager: Manager 进程负责 fork 并维护多个 Worker 子进程。当有 Worker 子进程中止时,Manager 负责回收并创建新的 Worker 子进程,以便保持 Worker 进程总数不变;当服务器关闭时,Manager 将发送信号给所有 Worker 子进程,通知其关闭服务。 Worker: 以多进程方式运行,每个子进程负责接受由 Reactor 线程投递的请求数据包,并执行 PHP 回调函数处理数据,然后生成响应数据并发给 Reactor

Netty 是如何支撑高性能网络通信的?

风流意气都作罢 提交于 2020-10-24 10:25:03
前言 作为一个高性能的 NIO 通信框架,Netty 被广泛应用于大数据处理、互联网消息中间件、游戏和金融行业等。大多数应用场景对底层的通信框架都有很高的性能要求,作为综合性能最高的 NIO 框架 之一,Netty 可以完全满足不同领域对高性能通信的需求。本文我们将从架构层对 Netty 的高性能设计和关键代码实现进行剖析,看 Netty 是如何支撑高性能网络通信的。 RPC 调用性能模型分析 传统 RPC 调用性能差的原因 1.网络传输方式问题 传统的 RPC 框架或者基于 RMI 等方式的远程过程调用采用了同步阻塞 I/O,当客户端的并发压力或者网络时延增大之后,同步阻塞 I/O 会由于频繁的 wait 导致 I/O 线程经常性的阻塞,由于线程无法高效的工作,I/O 处理能力自然下降。 采用 BIO 通信模型的服务端,通常由一个独立的 Acceptor 线程负责监听客户端的连接,接收到客户端连接之后,为其创建一个新的线程处理请求消息,处理完成之后,返回应答消息给客户端,线程销毁,这就是典型的 “ 一请求,一应答 ” 模型。该架构最大的问题就是不具备弹性伸缩能力,当并发访问量增加后,服务端的线程个数和并发访问数成线性正比,由于线程是 Java 虛拟机 非常宝贵的系统资源,当线程数膨胀之后,系统的性能急剧下降,随着并发量的继续增加,可能会发生句柄溢出、线程堆栈溢出等问题

Spring WebFlux (3): mysql+Springboot Security实现登录鉴权 Security主要有两个功能:

喜欢而已 提交于 2020-10-23 19:39:06
Security主要有两个功能: 登录 鉴权 Security通过一个user相关类存储用户信息,实现UserDetails接口功能: 看一下Security自带的User类, 主要变量: password:密码 username: 账户名 authorities: 访问权限 accountNonExpired:账户没有过期 isAccountNonLocked:账户没被锁定 (是否冻结) isCredentialsNonExpired:密码没有过期 isEnabled:账户是否可用(是否被删除) 其中password用于登录,authorities用于鉴权。 登录 简单说一下登录流程 一旦添加了Springboot Security依赖,访问api或者网页都会要求进行登录 输入账号和密码之后,会将信息放入Authentication类的对象中 得到的 Authentication 通过 AbstractUserDetailsReactiveAuthenticationManager 进行判断是否符合条件 通过 authentication 中的username(就是登录名),触发retrieveUser(username)方法 retrieveUser方法 通过 ReactiveUserDetailsService 获取对应名字对象

Reactor 3 (3): 创建Publisher之Flux

早过忘川 提交于 2020-10-23 19:27:32
创建Flux 上一篇介绍了Mono,mono表示0 1的序列,flux用来表示0 N个元素序列,mono是flux的简化版,flux可以用来表示流 因为是表示连续序列Flux和Mono的创建方法,有些不同,下面是flux的一些创建方法: just():可以指定序列中包含的全部元素。 range(): 可以用来创建连续数值 empty():创建一个不包含任何元素。 error(Throwable error):创建一个只包含错误消息的序列。 fromIterable(): 通过迭代器创建如list,set fromStream(): 通过流创建 fromArray(T[]): 通过列表创建 如 String[], Integer[] merge(): 通过将两个flux合并得到新的flux interval(): 每隔一段时间生成一个数字,从1开始递增 如下为创建flux示例: @Test public void flux ( ) throws InterruptedException { Flux < Integer > intFlux = Flux . just ( 1 , 2 , 3 , 4 , 5 ) ; Flux < Integer > rangeFlux = Flux . range ( 6 , 4 ) ; // 以6开始,取4个值:6,7,8,9 Flux .

Reactor 3 (2): 创建Publisher之Mono

徘徊边缘 提交于 2020-10-22 10:15:36
Reactor中的Publisher Reactor中有两种Publisher:Flux和Mono,其中Flux用来表示0 N个元素的异步序列,Mono用来表示0 1个元素的异步序列,相对于Flux而言Mono更简单一些。 创建Mono reactor中的mono可以通过一些方法创建,常用方法如下: just():可以指定序列中包含的全部元素。 empty():创建一个不包含任何元素。 error(Throwable error):创建一个只包含错误消息的序列。 fromCallable()、fromCompletionStage()、fromFuture()、fromRunnable()和 fromSupplier():分别从 Callable、CompletionStage、CompletableFuture、Runnable 和 Supplier 中创建 Mono。 delay(Duration duration):创建一个 Mono 序列,在指定的延迟时间之后,产生数字 0 作为唯一值。 ignoreElements(Publisher source):创建一个 Mono 序列,忽略作为源的 Publisher 中的所有元素,只产生结束消息。 justOrEmpty(Optional<? extends T> data)和 justOrEmpty(T data):从一个