io
文章平均质量分 72
darkness0604
这个作者很懒,什么都没留下…
展开
-
KAFKA那些事-07-从KAFKA总结分布式下的发送和连接
分布式模型下的客户端应用运行的关键?分布式下,通常有多个角色进行互相协调。因此作为一个分布式角色来说,首先要解决的就是如何和其他分布式角色进行通信。对于客户端而言,首先需要明确集群的信息,以及如何进行连接,因此也涉及到具体使用到的IO模型是什么?如下是kafka producer发送一条消息需要进行的操作:1、拉取集群元数据2、底层利用NIO建立sokcet连接进行向指定节点进行发送信息。分布式模型下的服务端应用运行的关键?作为服务端来说,更关心的是如何更好的接收和管理众多的连接,以及对连接原创 2021-10-26 10:32:51 · 778 阅读 · 1 评论 -
KAFKA那些事-06-KAFKA Producer基于源码分析的参数配置调优
Producer配置分析Properties conf = new Properties();//设置ACK级别: 0,1,-1conf.setProperty(ProducerConfig.ACKS_CONFIG,"0");//Key序列化器conf.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());//Value序列化器conf.setProperty(P原创 2021-08-18 10:46:38 · 366 阅读 · 0 评论 -
KAFKA那些事-05-KAFKA的索引文件分析、ACK不同级别的现象、基于时间戳的索引
KAFKA中的索引与数据文件的分析创建topic来到KAFKA存储目录,发现已经有了两个分区的数据:进到0号分区的文件夹:发现有.log结尾的数据文件,.index结尾的偏移量索引文件,.timeindex结尾的时间戳二级索引文件但我们发现,我们现在还没有写入消息,但两个索引文件就已经有了10M的大小,这是为何?这是因为kafka对索引文件使用的是mmap映射,已经预分配好了10M的磁盘块大小的空间,通过lsof查看kafka进程号观察这个细节:可以看到SIZE/OFF的位置上,确实已原创 2021-07-21 15:11:04 · 462 阅读 · 0 评论 -
IO那些事15-RPC调用的组合方式
RPCRPC,远程服务调用,只是一种调用行为的名称,而进行连接的双方使用的协议是不受限定的,可以是自定义的某种协议(自定义消息头和消息体,自行对传输消息的格式进行约定),也可以是比较公知的例如http协议(但其本质,应该说HTTP协议也是一种比较公认的自定义协议),但这无非就是调用协议层面的事情,整体来说,都是一种RPC的表现,所谓的通信有无状态,完全是看协议的实现是如何约定的。HTTP协议消费端,可以使用第三方HTTP类库,也可以使用netty支持的http协议客户端形式进行调用。服务端,既可以原创 2021-04-21 15:38:42 · 158 阅读 · 0 评论 -
IO那些事14-RPC优化点
RPC的层次感作为RPC调用来说,更多的还需要考虑用户体验度,对于用户来说,就是面向接口调用。然而实际上一个RPC的端点,可能既需要作为consumer去调用远程的provider的服务,而自身也作为一个provider提供着一些服务,作为这个端点来说,它对外提供的服务,对它自身肯定是一些本地的方法调用。所以我们在设计RPC通信时,调用的时候,不单单需要考虑只有远程调用,而应该首先去判断一下这个服务的实现方法在本地有没有,如果有的话,没必要再走RPC最终再调到自己身上来。 public stati原创 2021-04-21 15:36:32 · 252 阅读 · 0 评论 -
IO那些事13-IO的思考
多个ServerBootstrap可以实现一套计算资源,不同的处理逻辑IO密集型和计算密集型IO密集型就是和kernel打交道很多,会有比较多的系统调用。计算密集型则相反,更多的是在单纯用CPU做计算,而不怎么与内核打交道。正常来说,网卡到程序的过程中一定伴随着中断操作的干预,而当网卡数据来临非常频繁时,底层会进行优化,内核会关闭中断,然后直接让CPU疯狂从网卡的buffer中取出数据到内核的buffer中,且这个过程是底层系统硬件实现的。 但即使是这样,如果我们程序不尽快取走内核buffer中的数原创 2021-04-21 15:33:52 · 113 阅读 · 2 评论 -
IO那些事12-手写实现RPC
RPC调用整体图作为一段RPC调用模型来说,一般是分为consumer端和provider端,consumer端只需要面向接口编程,consumer端直接拿着接口, 然后直接调用其方法。而其内部,实质是通过socket通信(可以是netty也可以是其他),然后去请求provider端的具体接口实现类对应的方法。对于consumer端来说,可能多个不同的请求都是复用着一个channel连接,那这时候因此需要consumer端发起请求的时候需要带上各自的请求id,方便响应回来的时候,能够匹配是谁发出的请原创 2021-03-11 15:45:49 · 402 阅读 · 0 评论 -
IO那些事11-初识netty
引入依赖<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.43.Final</version></dependency>Netty中的ByteBufnetty对JDK原生nio中的ByteBuffer的包装。声明方式1、ByteBuf buf =原创 2021-03-01 15:14:51 · 180 阅读 · 0 评论 -
IO那些事10-手写简易版Reactor-IO实现
主线程代码实现:public class MainThread { public static void main(String[] args) { SelectorThreadGroup boss = new SelectorThreadGroup(1); SelectorThreadGroup worker = new SelectorThreadGroup(3); boss.setWorkerGroup(worker); bos原创 2021-03-01 15:09:37 · 272 阅读 · 0 评论 -
IO那些事09-JAVA API层面的IO历程02
import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;impor原创 2021-01-12 15:34:34 · 130 阅读 · 0 评论 -
IO那些事08-JAVA API层面的IO历程01
selector前面大篇幅的描述了IO的发展史,并谈到了多路复用的级别模型IO,当描述的这一切,都只是内核级别的调用,或者说是C级别的调用,而作为一个java程序员来说,更多的应该是API层面的使用。作为java api来说,无论是哪种模型,都统一抽象成了selector。来看一段java代码来了解:import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import jav原创 2021-01-12 15:19:24 · 166 阅读 · 0 评论 -
IO那些事07-多路复用IO之select,poll,epoll
多路复用器下的实现所有的多路复用器都是基于POSIX的规范进行实现的。SELECT最通用的多路复用器,也就是基本所有操作系统都有的,就是selectman 2 selectselect的参数可以发现是传入若干个文件描述符(读的和写的),但是一次调用可以操作的文件描述符FD_SETSIZE最大不能超过1024个。nfds:操作多少个文件描述符readfds:读的文件描述符集合writefds:写的文件描述符集合timeout:等待的时间,超过时间后,直接返回当前的文件描述符的状态。.原创 2021-01-04 11:17:25 · 197 阅读 · 0 评论 -
IO那些事06-网络IO之IO角度下的NIO
NIO的语义在java中,NIO意思是New IO在操作系统中,NIO意思是非阻塞IO代码实例import java.net.InetSocketAddress;import java.net.StandardSocketOptions;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.原创 2020-12-21 10:55:45 · 121 阅读 · 0 评论 -
IO那些事05-网络IO之IO角度下的BIO
/** * BIO 多线程的方式 */public class SocketIOPropertites { //server socket listen property: private static final int RECEIVE_BUFFER = 10; private static final int SO_TIMEOUT = 0; private static final boolean REUSE_ADDR = false; //当线程不够原创 2020-12-21 10:53:30 · 165 阅读 · 0 评论 -
IO那些事04-网络IO之TCP
传统的BIO模型下的,服务端代码:/** * BIO 多线程的方式 */public class SocketIOPropertites { //server socket listen property: private static final int RECEIVE_BUFFER = 10; private static final int SO_TIMEOUT = 0; private static final boolean REUSE_ADDR =原创 2020-12-21 10:48:22 · 236 阅读 · 0 评论 -
IO那些事03-几种常见的文件IO模型
java中的普通write和buffer read的重要差距?每次写数据data:“123456789\n”通过查看追踪系统调用线程文件,发现普通write,每一次write,实质都是一次系统调用,也就是都会发生一次内核态切换:通过查看追踪系统调用线程文件,发现buffered的write,每一次write,写的是一个缓冲区的若干个“123456789\n”:NIO在jdk新版,除了传统IO,又出现了新的IO,也就是NIO,也暴露了新的API,ByteBuffer public voi原创 2020-11-30 15:28:01 · 375 阅读 · 0 评论 -
IO那些事02-PageCache
PageCache为了提升IO的效率,计算机的整体各处都是存在页缓存的概念的。作为应用进程来说,一般都会存在以4k为单位的缓存页,也就是buffer,可以想象java中的bufferreader等。。接着,作为系统内核来说,它内部也存在页缓存(pagecache)。最后,对于硬盘的驱动本身,也存在缓冲区。因此可以想象,读取一份文件,会从磁盘驱动本身开始,每次读到缓冲区大小的内容才会向上级返回,这样大大提高IO的效率。而除了多级缓存之外,我们也不难想到,IO是个很慢的操作,如果一直让CPU去频原创 2020-11-30 15:20:42 · 320 阅读 · 0 评论 -
IO那些事01-IO总述和文件描述符
VFS内核既管内存,又管磁盘IO。作为LINUX内核来说,它在内存中构建了一个虚拟文件系统VFS,不同于windows上的物理文件系统结构,C盘代表的就是物理的C盘分区,D盘就是D盘的物理分区,VFS本质就是一颗目录树,每个目录可以映射代表不同的物理设备。为什么要有VFS?因为VFS相当于一个中间的解耦层,下层的存储源的存储形式可能是各不相同的,可能是来自不同的硬件设备,但需要将这些包成一个统一的对外接口暴露给上层应用使用。pagecache在VFS中,每一个文件都有一个inode id作为.原创 2020-11-30 15:17:59 · 1767 阅读 · 0 评论