讲一讲你在网络通讯中遇到的坑或者比较棘手的问题
1、网络延迟问题
2、网络拥塞问题
某公司的Java项目需要向远程服务器发送大量的HTTP请求并获取响应,由于请求量较大,导致网络拥塞,请求响应延迟较高。针对这个问题,我们可以采取以下措施:
- 优化请求:可以考虑将多个小请求合并成一个大请求,减少请求次数,从而减少网络负载。
一个请求的大小应该在网络传输的最大MTU(MTU是网络中数据帧传输的最大长度)之内,经验上这个范围一般在500-1500字节之间。 - 异步请求:可以采用异步请求的方式,通过线程池来处理请求,避免阻塞主线程,从而提升服务性能。
- 使用网络缓存:可以使用网络缓存来缓存请求结果,降低对远程服务器的访问频率,从而减少网络负载。
- 增强服务器性能:可以增加远程服务器的带宽和处理能力,从而提高响应速度和处理能力,降低网络拥塞风险。
3、NIO 一定优于 BIO 么?
特定场景:连接数少,并发度低,BIO 性能不输 NIO。
4、Dubbo和SpringCloud的差别,网络通讯上
Dubbo和Spring Cloud都是目前非常流行的服务治理框架,它们都提供了分布式微服务的解决方案。在网络通讯上,Dubbo和Spring Cloud有以下差别:
- 通信协议: Dubbo使用自定义的RPC通信协议,支持多种序列化方式,如Hessian、Java序列化、JSON等。而Spring Cloud使用的是HTTP或其他的基于HTTP的RESTful风格的通信协议。
- 服务提供者和消费者的关系: Dubbo采用的是服务提供者和消费者的直连模式,消费者需要知道服务提供者的IP地址和端口号才能进行调用。而Spring Cloud是通过服务注册和发现机制构建的分布式系统,服务消费者只需要使用服务名即可调用相应的服务,无需关心服务提供者的IP地址和端口号。
- 服务注册中心: Dubbo采用Zookeeper作为默认的服务注册中心,而Spring Cloud可以使用Eureka、Consul、Zookeeper等多种服务注册中心。
- 服务调用方式: Dubbo采用同步和异步两种调用方式,消费者发送请求到提供者并等待响应结果,而Spring Cloud支持同步和异步两种调用方式。
- 在性能方面,Dubbo的性能较Spring Cloud更加优秀。
需要注意的是,Dubbo和Spring Cloud并不是竞争关系,而是在不同的应用场景和业务需求下选择不同的技术架构。
哪些应用比较适合用udp实现
多播的信息一定要用udp实现,因为tcp只支持一对一通信。
如果一个应用场景中大多是简短的信息,适合用udp实现,因为udp是基于报文段的,它直接对上层应用的数据封装成报文段,然后丢在网络中,如果信息量太大,会在链路层中被分片,影响传输效率。
如果一个应用场景重性能甚于重完整性和安全性,那么适合于udp,比如多媒体应用,缺一两帧不影响用户体验,但是需要流媒体到达的速度快,因此比较适合用udp。
如果要求快速响应,那么udp听起来比较合适。
如果又要利用udp的快速响应优点,又想可靠传输,那么只能考上层应用自己制定规则了,比如UDT。
常见的使用udp的例子:ICQ,QQ的聊天模块、DNS等等。
如果要你来设计一个QQ,在网络协议上你会考虑如何设计?
登陆采用TCP协议和HTTP协议,你和好友之间发送消息,主要采用UDP协议,内网传文件采用了P2P技术。总来的说:
1.登陆过程,客户端client 采用TCP协议向服务器server发送信息,HTTP协议下载信息。登陆之后,会有一个TCP连接来保持在线状态。
2.和好友发消息,客户端client采用UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。
3.如果是在内网里面的两个客户端传文件,QQ采用的是P2P技术,不需要服务器中转。
HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别?
HTTP/2.0中的多路复用和HTTP/1.x中的长连接复用都是为了提高HTTP协议的性能,但这两个概念有本质上的区别。
HTTP/1.x使用长连接复用机制,在同一个连接上可以发送多个HTTP请求,不需要每次都建立连接和关闭连接。这样可以节省网络资源和提高性能。但是由于长连接复用机制是串行处理请求的,如果某个请求被阻塞,后面的请求只能等待,无法并行处理,从而影响整体性能。
相比之下,HTTP/2.0采用的是多路复用机制,可以在一个连接上同时传输多个请求和响应,请求之间可以并发处理,从而提高了效率。在HTTP/2.0中,每个请求都有一个唯一的标识符,称为Stream ID,可以根据Stream ID来区分不同的请求和响应。因此,在HTTP/2.0中,多个请求可以同时在一个连接上传输并相互独立地进行响应,不再受到阻塞的影响,从而提高了响应速度和效率。
Netty 的应用场景有哪些?
典型的应用有:
阿里分布式服务框架 Dubbo,默认使用 Netty 作为基础通信组件,
还有 RocketMQ 也是使用 Netty 作为通讯的基础。
Netty常见的使用场景如下:
互联网行业 在分布式系统中,各个节点之间需要远程服务调用,高性能的RPC框架必不可少,Netty作为异步高新能的通信框架,往往作为基础通信组件被这些RPC框架使用。 典型的应用有:阿里分布式服务框架Dubbo的RPC框架使用Dubbo协议进行节点间通信,Dubbo协议默认使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信。
游戏行业 无论是手游服务端还是大型的网络游戏,Java语言得到了越来越广泛的应用。Netty作为高性能的基础通信组件,它本身提供了TCP/UDP和HTTP协议栈。 非常方便定制和开发私有协议栈,账号登录服务器,地图服务器之间可以方便的通过Netty进行高性能的通信
大数据领域 经典的Hadoop的高性能通信和序列化组件Avro的RPC框架,默认采用Netty进行跨界点通信,它的Netty Service基于Netty框架二次封装实现
默认情况 Netty 起多少线程?何时启动?
Netty 默认是 CPU 处理器数的两倍,bind 完之后启动。
分布式系统中会存在的问题
NPC问题