Dubbo重点掌握什么内容?需要熟悉源码吗?
重点掌握: 基于nio的reator模型以及自定义的网络协议和TCP的协议解析(粘包等),建议先看看mina、netty。 先看mina哈,mina就是一个基于nio的简单的reator模型本地请求比如说:http://localhost:8080/demo,我用wireshark抓包的时候抓不到这个http请求。
1.浏览器在访问这个本地请求的时候没有发送http请求吗?
2.是不是意味着,在本地的http请求不会通过传输层也就是TCP协议进行传输?
上次的作业,一次HTTP请求是什么样的?我看网上很多都是这样的
3.如果是这样的话,一个本地http请求是怎样的?
数据库中的字段建立索引后,区分度很小,数据总量150w,字段中最大的基数为3w,区分度为2%。建立联合索引后,基数为5.5w,区分度为3.7%。但是整体提升不明显,而且查询到内存中的数据有可能会达到十几万,而且内存中的数据可能会一直被引用不释放,进而引发线上服务OOM,导致服务不可用。
这种情况应该怎么处理呢?项目背景,就是查询的过滤字段在整个表中的区分度都不高,150w数据中,有的情况下会召回十几万数据,耗时4秒左右
1、我遇到的一个场景,业务场景是主要用top的一些,这个用limit解决了。
2、我同事遇到的场景,他在查询的时候,会用到sum和group by,这个比较耗时。第二个场景,他这边用sum和group by之后的数据,会在千这个数量级,耗时5.7s。如果没有sum和group by,数量级会到30w。(这个可以考虑用ElasticSearch,或者 空间 换时间。先把sum和group by异步聚合好,来查询的时候。直接查询。还有个大杀器, 那就是 使用SSD的硬盘,看电商里的,推荐啥的,都是后台实时算好的。查询的时候直接拿结果。不可能在查询里,还要做各种复杂的计算和排序)支付订单15分钟取消,为什么不用redis的订阅通知实现,是出于什么原因考虑的,
SUBSCRIBE keyevent@0:expired,redis key过期会发送通知;
Redis不是强一致的哈。故障切换了之后,主从切换有可能会丢数据。 强一直的通知等,一般都是用zk和etcd来做哈
redis用作存储。职责单一,尽量不要用来做多个事情,有可能你写入存储的请求把订阅的影响了,或者相互影响了。
最后,我们自己的redis是改造过的,集群化的。都不支持redis这个订阅和分发的功能服务器内存溢出(OOM)和cpu占用过高,有什么区别?分别应该用哪种排查思路解决?
a. cpu占用过高,可以说明服务器还没有挂,这时候可以通过top命令,jstack命令来找到对应的cpu耗时严重的线程,进而定位具体的代码逻辑。
b. 基本概念:
Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。
如何查看:grep "Out of memory" /var/log/messages
c. 然后,java启动命令有一个参数,可以指定进程挂了,自动把堆信息给打出来-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof
JVM调优,除了选择适合的垃圾回收器外,还有哪些调优方案?
a. 有新生代和老年代的比例调整哈,比如你要打很多日志,这些日志的生命周期都比较短。那就把新生代放大点
b. https://gceasy.io/docker,k8s技术栈怎么学习,感觉太难了?
目前需要用的时候会用就行,不用深入学习,主要是运维岗位k8s的网络插件(flannel, calico)是怎么工作的?
同上TCP 拆包和粘包的作用是什么?
TCP 拆包的作用是将任务拆分处理,降低整体任务出错的概率,以及减小底层网络处理的压力。拆包过程需要保证数据经过网络的传输,又能恢复到原始的顺序。这中间,需要数学提供保证顺序的理论依据。TCP 利用(发送字节数、接收字节数)的唯一性来确定封包之间的顺序关系。粘包是为了防止数据量过小,导致大量的传输,而将多个 TCP 段合并成一个发送。网络地址解析协议(NAT)的工作原理?
这个也是网络协议的,和上个周末讲解的 接入层的网关也类似。七层代理,四层代理
网络地址解析协议(NAT)解决的是内外网通信的问题。NAT 通常发生在内网和外网衔接的路由器中,由路由器中的 NAT 模块提供网络地址转换能力。从设计上看,NAT 最核心的能力,就是能够将内网中某个 IP 地址映射到外网 IP,然后再把数据发送给外网的服务器。当服务器返回数据的时候,NAT 又能够准确地判断外网服务器的数据返回给哪个内网 IP。
a. NAT 需要作为一个中间层替换 IP 地址。 发送的时候,NAT 替换源 IP 地址(也就是将内网 IP 替换为出口 IP);接收的时候,NAT 替换目标 IP 地址(也就是将出口 IP 替换回内网 IP 地址)。
b. NAT 需要缓存内网 IP 地址和出口 IP 地址 + 端口的对应关系。也就是说,发送的时候,NAT 要为每个替换的内网 IP 地址分配不同的端口,确保出口 IP 地址+ 端口的唯一性,这样当服务器返回数据的时候,就可以根据出口 IP 地址 + 端口找到内网 IP。BIO、NIO 和 AIO 有什么区别?
bio -> blocking io
nio -> non-blocking io
aio -> async io
bio 一个线程处理一个网络连接
nio 负责网络io的线程处理网络请求,并把请求的操作和数据交给专门的线程进行处理
aio 有事件时操作系统会调用应用程序注册的回调函数
学习 mina 源码