网络部分:
1、现代浏览器在于服务器建立了一个tcp链接之后是否会在一个HTTP请求完成后断开?什么情况下会断开?
在 HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。(解决方式是设置Connection: keep-alive)
在 HTTP/1.1中将 Connection: keep-alive头写进标准,并且默认开启持久连接,除非请求中写明 Connection: close,那么浏览器和服务器之间是会维持一段时间的 TCP 连接,不会一个请求结束就断掉。
2、一个TCP链接可以对应几个HTTP请求?
由于tcp连接不会断开,所以可以发送N多个请求
3、一个TCP连接中HTTP请求发送可以一起发送吗(比如一起发送三个请求,然后接受三个响应)
HTTP/1.1 存在一个问题,单个 TCP 连接在同一时刻只能处理一个请求,意思是说:两个请求的生命周期不能重叠,任意两个 HTTP 请求从开始到结束的时间在同一个 TCP 连接里不能重叠。
虽然 HTTP/1.1 规范中规定了 Pipelining 来试图解决这个问题,但是这个功能在浏览器中默认是关闭的。
但是pipelining会有以下问题:
- 一些代理服务器不能正确的处理 HTTP Pipelining。
- Head-of-line Blocking 连接头阻塞:在建立起一个 TCP 连接之后,假设客户端在这个连接连续向服务器发送了几个请求。按照标准,服务器应该按照收到请求的顺序返回结果,假设服务器在处理首个请求时花费了大量时间,那么后面所有的请求都需要等着首个请求结束才能响应。
HTTP2.0加入了多路复用技术Multiplexing,可以在一个 TCP 连接中同时完成多个 HTTP 请求。
4、浏览器对用一个host建立TCP连接的数量有没有限制?
有。Chrome 最多允许对同一个 Host 建立六个 TCP 连接。不同的浏览器有一些区别。
kafka部分:
kafka为什么快?
写入的时候:采用页缓存技术 + 磁盘顺序写
Kafka 为了保证磁盘写入性能,首先Kafka是基于操作系统的页缓存来实现文件写入的。
操作系统本身有一层缓存,叫做page cache,是在内存里的缓存,我们也可以称之为os cache,意思就是操作系统自己管理的缓存。
你在写磁盘文件的时候,可以直接写入os cache 中,也就是仅仅写入内存中,接下来由操作系统自己决定什么时候把os cache 里的数据真的刷入到磁盘中。
磁盘顺序写
Kafka在写数据的时候是以磁盘顺序写的方式来落盘的,也就是说,仅仅将数据追加到文件的末尾(append),而不是在文件的随机位置来修改数据。
对于普通的机械硬盘如果你要是随机写的话,确实性能极低,这里涉及到磁盘寻址的问题。但是如果只是追加文件末尾按照顺序的方式来写数据的话,那么这种磁盘顺序写的性能基本上可以跟写内存的性能本身是差不多的。
消费读取的时候:零拷贝技术(zero-copy)
正常从内存读取数据要经历两次数据拷贝,一次是从内存拷贝到应用的进程中,一次是,从进程拷贝到socket缓存中,最后网卡从socket中拿数据给消费者。
而kafka直接将数据发送给网卡,并且发送一份拷贝描述符给socket缓存。跳过了两次拷贝的过程。
数据库部分:
1、sql的执行顺序。
https://www.toutiao.com/i6729452080848699918/
2、在索引场景下,mysql查询第N大的数的时间复杂度是多少?
O(N),因为mysql的索引是b+树,会在叶子节点形成一个链表。