首页 > 数据库 >Netty_Redis_Zookeeper高并发实战-读书笔记

Netty_Redis_Zookeeper高并发实战-读书笔记

时间:2024-05-26 11:36:21浏览次数:13  
标签:Netty 读书笔记 Zookeeper 用户 阻塞 线程 内核 IO 缓冲区

转载自: https://www.cnblogs.com/leihongzhi/p/17381156.html

 

第1章    高并发时代的必备技能

1.netty

Netty是JBOSS提供的一个Java开源框架,基于NIO的客户端/服务器编程框架,能够快速开发高并发、高可用、高可靠的网络服务器程序,也能开发高可用、高可靠的客户端程序。

NIO是指:非阻塞输入输出(Non-Blocking IO)。

优点:

  • API使用简单,开发门槛低

  • 功能强大,预置了多种编解码功能,支持多种主流协议

  • 定制能力强,可以通过ChannelHandler对通信框架进行灵活扩展

  • 性能高,与其他业界主流NIO框架对比,Netty的综合性能最优

  • 成熟、稳定,Netty修复了JDK NIO的bug

  • 社区活跃,版本迭代周期短,发现的bug能够及时被修复

  • 面试必杀器

2.高并发利器Redis

Remote Dictionary Service 远程字典服务器。通过键值对的形式存储数据,Redis中的key只能是String类型,Value可以是String、Map、List、Set、SortedSet(有序集合)类型。

主要应用场景:缓存(数据查询、短连接、新闻内容、商品内容等)、分布式会话(Session)、聊天室好友列表、任务队列(秒杀、抢购、12306)、应用的排行榜、访问统计、数据过期处理。

优点:

  • 速度快 不需要等待磁盘IO

  • 丰富的数据结构 String list map set sortedSet

  • 单线程 避免了线程切换和锁机制的性能消耗

  • 可持久化 支持RDB和AOF两种方式,将内存中的数据写入外部的物理存储设备

  • 支持发布订阅

  • 支持Lua脚本

  • 支持分布式锁

  • 支持原子操作和事务

  • 支持主从(master-slave)复制与高可用(redis-sentinel)集群(3.0版本以上)

  • 支持管道 可以将多个命令一次性发送到服务器,然后由服务器一次性返回所有结果,在批量执行命令的场景中,可以减少网络传输开销

3.分布式利器Zookeeper

分布式协调框架,实现了分布式环境的数据一致性。简单的说:每时每刻我们访问Zookeeper的树结构时,不同的节点返回的数据都是一致的。也就是说,对Zookeeper进行数据访问时,无论是什么时间,都不会引起“脏读”    “幻读”    “不可重复读”问题。

第2章    高并发IO的底层原理

1.IO读写的基本原理

操作系统将内存(虚拟内存)分为两部分:内核空间和用户空间。在Linux系统在,内核模块运行在内核空间,对应的进程处在内核态;用户程序运行在用户空间,对应的进程处于用户态。
典型的系统调用流程

应用程序的IO操作实际上不是物理设备级别的读写,而是缓存的复制。

  • 客户端发送请求:Java客户端程序通过write系统调用将数据复制到内核缓冲区,Linux将内核缓冲区的请求数据通过客户端机器的网卡发送出去。在服务端,这份请求数据会从接收网卡中读取到服务端机器的内核缓冲区。

  • 服务端获取请求:Java服务端程序通过read系统调用从Linux内核缓冲区读取数据,再送入Java进程缓冲区。

  • 服务端业务处理:Java服务端在自己的用户空间中完成客户端的请求所对应的业务处理。

  • 服务端返回数据:Java服务器完成处理后。构建好的响应数据将从用户缓冲区写入内核缓冲区,这里用到的是write系统调用,操作系统会负责将内核缓冲区的数据发送出去。

  • 发送给客户端:服务端Linux系统将内核缓冲区中的数据写入网卡,网卡通过底层的通信协议将数据发送给目标客户端。
    2.四种主要的IO模型

常见的IO模型有四种。

1.同步阻塞IO

  • 首先,解释一下阻塞和非阻塞。阻塞IO指的是需要内核IO操作彻底完成后才返回到用户空间执行用户程序的操作指令。“阻塞”指的是用户程序(发起IO请求的进程或者线程)的执行状态。

  • 其次,解释一下同步与异步。简单来说,可以i将同步与一部看成发起IO请求的两种方式。同步IO是指用户空间(进程或者线程)是主动发起IO请求的乙方,系统内核是被动接收方。异步IO则反过来,系统内核是主动发起IO请求的一方,用户空间是被动接收方。

  • 同步阻塞IO(Blocking IO)指的是用户空间(或者线程)主动发起,需要等待内核IO操作彻底完成后才返回到用户空间的IO操作。在IO操作过程中,发起IO请求的用户进程(或者线程)处于阻塞状态。

2.同步非阻塞IO

  • 非阻塞IO(Non-Blocking IO,NIO)指的是用户空间的程序不需要等待内核IO操作彻底完成,可以立即返回用户空间去执行后续的指令,即发起IO请求用户进程或者线程处于非阻塞状态,于此同事,内核会立即返回给用户一个IO状态值。

  • 阻塞和不阻塞的区别:阻塞是指用户进程(或者线程)一直在等待,而不能做别的事情;非阻塞是指用户进程(或者线程)获得内核返回的状态值就返回自己的空间,可以去做别的事情。

  • 同步非阻塞IO也可以成为NIO,但是它不是Java编程中的NIO。Java编程中的NIO(New IO)类库组件所归属的不是基础IO模型中的NIO模型,而是IO多路复用模型

  • 同步非阻塞IO指的是用户进程主动发起,不需要等待内核IO操作彻底完成就能立即返回用户空间的IO操作。在IO操作过程中,发起IO请求的用户进程(或者线程)处于非阻塞状态。

3.IO多路复用

  • 一种新的系统调用。通过该系统带哦用,一个用户进程(或者线程)可以监视多个文件描述符,一旦描述符就绪(一般是内核缓冲区可读/科协),内核就能够将文件描述符(包括socket连接)的就绪状态返回给用户进程(或者线程),用户空间可以根据文件描述符的就绪状态进行相应的IO系统调用。

  • IO多路复用属于一种经典的Reactor模式实现,又是于邺城异步阻塞IO,Java中的Selector属于这种模型。

4.异步IO

  • 异步IO指的是用户空间的线程编程被动接收者,而内核空间成为主动调用者。在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕并放在了用户缓冲区内,内核在IO完成后通知用户线程直接使用即可。类似与Java中典型的回调模式。
    • 异步IO模型的基本流程是:用户线程通过系统调用向内核注册某个IO操作。内核在整个IO操作(包括数据准备、数据复制)完成后通知用户程序,用户执行后续的业务操作。
    • 在异步IO模型中,在整个内核的数据处理过程(包括内核将数据从屋里网络设备(网卡)读取到内核缓冲区、将内核缓冲区的数据复制到用户缓冲区)中,用户程序都不需要阻塞。

标签:Netty,读书笔记,Zookeeper,用户,阻塞,线程,内核,IO,缓冲区
From: https://www.cnblogs.com/Yi-ling/p/18213449

相关文章

  • 面试题剖析:Netty编解码如何解决拆包沾包问题?
    今天我们要聊的主题是Netty的编解码机制,特别是如何解决TCP的拆包和沾包问题。如果你曾在处理网络数据传输时遇到数据包混乱的情况,那么你已经体验过拆包和沾包的“乐趣”了。别担心,Netty提供了一系列强大的解码器,帮助我们轻松应对这些问题。本文将详细介绍这些解码器的工作原......
  • 知道做到 读书笔记
    [[知道做到:跃迁式学习]]元数据[!abstract]知道做到:跃迁式学习书名:知道做到:跃迁式学习作者:彼得•霍林斯简介:学习是改善你的生活环境、成为你想成为的人的关键。科学的方法能加速学习进程,让你事半功倍。技能、信息和能力永远不会突然降临,需要你自己去寻找它们,这本书将手......
  • DotNetty ByteBuffer
    DotNetty是一个高性能的.NET网络通信框架,基于Netty,支持TCP、UDP、HTTP、WebSocket等协议。适用于高并发、低延迟场景,如实时通信、游戏服务器、IoT应用及大型分布式系统,通过异步I/O、零拷贝等技术提升性能,具备易用性、可扩展性。架构上,围绕Channel、EventLoop、ChannelPipel......
  • Netty ChannelHandler的生命周期
    ChannelHandler方法的执行是有顺序的,而这个执行顺序可以被称为ChannelHandler的生命周期。 LifeCyCleTestHandlerimportio.netty.channel.ChannelInboundHandlerAdapter;importio.netty.channel.ChannelHandlerContext;publicclassLifeCyCleTestHandlerextendsChan......
  • Java核心面试知识集—zookeeper面试题
    1.ZooKeeper是什么?ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。客户端的读请求可......
  • Netty 客户端与服务端收发消息demo
    客户端与服务端收发消息,要实现的具体功能是:在控制台输入一条消息之后按回车键,校验完客户端的登录状态之后,把消息发送到服务端;服务端收到消息之后打印,并向客户端发送一条消息,客户端收到消息之后打印。 客户端NettyClientimportcom.xc.xcspringboot.x_netty.client.handler.*;......
  • ZooKeeper论文笔记.18205343
    概要是什么:ZooKeeper是一个分布式系统的基础构件(协调内核),分布式应用(如RocketMQ)可以使用ZooKeeper来处理分布式系统协同的各个方面,比如可以使用它来实现leader选举、分布式锁等等,分布式应用可以使用它暴露的API实现各种类型的协同原语(考虑Java中的AQS)。它让分布式应用的设计者无需......
  • 《人月神话读书笔记二》
    贯彻执行即使是大型的设计团队,设计结果也必须由一个或两个人来完成,以确保这些决定是一致的。允许体系结构师对实现人员的询问做出电话应答解释是非常重要的,并且必须进行日志记录和整理发布。对于存有疑问的实现人员,应鼓励他们打电话询问相应的结构师,而不是一边自行猜测一边工作......
  • netty 最简demo
    Netty是什么Netty到底是何方神圣?用一句简单的话来说就是:Netty封装了JDK的NIO,让你用得更方便,不用再写一大堆复杂的代码了。用官方正式的话来说就是:Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务端和客户端。使用Netty而不使用JDK原生NIO的原因1.使用J......
  • zookeeper控制台
    最近在使用ElasticJob的时候遇到了elasticjobconflictjobs的问题,就想着能不能把这个job从zk中剔除。ElasticJob的注册中心是zk,就想通过控制台把那个定时任务给移除掉。zk控制台下载(https://github.com/DeemOpen/zkui.git),用idea打开修改下config.cfg文件中zk服务的地址,端......