1.时序图和流程图的区别是什么?
时序图是交互图的一种。时序图中包括如下元素:角色,对象,生命线,激活期和消息。
时序图和交互图都描述了软件的动态特征,是软件处理业务逻辑能力的体现。通过业务处理的参与者的顺序协作来展示软件的不同组件如何协作来完成业务。描述了软件的组成者如何协作来完成业务逻辑。涉及到了软件的组成和软件的功能(能力)。
流程图面向业务逻辑,不涉及软件内部的组件和结构,不涉及业务逻辑处理的参与者,只考虑业务处理的步骤及流程。
2.Seata架构(XA、AT、TCC)
Seata事务管理中有三个重要的角色:
TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
XA模式 | |||
RM一阶段的工作 |
①
注册分支事务到
TC
②
执行分支业务
sql
但不提交
③
报告执行状态到
TC
| ||
TC二阶段的工作 |
TC
检测各分支事务执行状态
如果都成功,通知所有
RM
提交事务
如果有失败,通知所有RM回滚事务 | ||
RM二阶段的工作 |
接收
TC
指令,提交或回滚事务
| ||
![]() | |||
AT模式 | |||
原理 | AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。 | ||
阶段一RM的工作 |
注册分支事务
记录
undo-log
(数据快照)
执行业务
sql
并
提交
报告事务状态
| ||
阶段二提交时RM的工作 |
删除
undo-log
即可
| ||
阶段二回滚时RM的工作 |
根据
undo-log
恢复数据到更新前
| ||
![]() | |||
TCC模式 | |||
Try | 资源的检测和预留 | ||
Confirm | 完成资源操作业务;要求 Try 成功 Confirm 一定要能成功。 | ||
Cancel | 预留资源释放,可以理解为try的反向操作 | ||
![]() | |||
项目中采用的哪种方案(seata | MQ)? | |||
seata的XA模式 | CP | 需要互相等待各个分支事务提交,可以保证强一致性,性能差 | 银行业务 |
seata的AT模式 | AP | 底层使用undo log 实现,性能好 | 互联网业务 |
seata的TCC模式 | AP | 性能较好,不过需要人工编码实现 | 银行业务 |
MQ模式实现分布式事务 | 在A服务写数据的时候,需要在同一个事务内发送消息到另外一个事务,异步,性能最好 | 互联网业务 |
3.euraka 的三级缓存作用和原理
Eureka的缓存机制详解:三级缓存架构的实践与应用
Eureka,作为服务发现框架,其缓存机制是其高可用性和性能优化的关键。在本文中,我们将深入探讨Eureka的三级缓存架构,帮助读者更好地理解这一机制,并提供实践建议。
一、Eureka的三级缓存架构
Eureka的三级缓存架构包括只读缓存、读写缓存和本地注册表。这三层缓存共同协作,实现了Eureka的高可用性和性能优化。
只读缓存(ReadOnlyCacheMap):使用ConcurrentHashMap作为数据结构,相当于数据库的角色。它保存了最新的服务注册信息,供Eureka Client和UI界面读取。
读写缓存(readWriteCacheMap):使用Guava Cache作为数据结构,相当于Redis主从架构中的主节点。它支持读写操作,并会定期将更新同步至只读缓存,以保证服务注册信息的实时性。
本地注册表(registry):使用ConcurrentHashMap作为数据结构,相当于Redis主从架构的从节点。它只负责读取操作,用于存储Eureka Server的本地服务注册信息。
二、Eureka的缓存同步机制
Eureka的缓存同步机制主要通过定时任务实现。默认情况下,每30秒会将二级缓存(读写缓存)同步至三级缓存(只读缓存)。这种同步机制保证了服务注册信息的实时性和一致性。
三、Eureka的缓存清理机制
Eureka的缓存清理机制主要包括两个方面:
Eureka Server每60秒清理超过90秒*2(官方设定)未续约的节点。这是为了防止因服务节点故障导致的注册信息滞留,保证服务注册信息的准确性。
Eureka Client每30秒从只读缓存更新服务注册信息。这是为了保证Eureka Client能够获取到最新的服务注册信息,从而实现服务调用的正确性。
四、实践建议
在实际应用中,我们可以根据业务需求调整缓存同步周期、监控Eureka Server的缓存状态以及关注Eureka Server的清理机制,从而实现Eureka的高可用性和性能优化。
我们需要注意以下几点:
1.根据业务需求调整缓存同步周期。如果业务对服务注册信息的实时性要求较高,可以适当缩短缓存同步周期,以提高服务注册信息的实时性。
2.监控Eureka Server的缓存状态。定期检查Eureka Server的缓存大小、命中率等指标,确保缓存性能处于最佳状态。
3.关注Eureka Server的清理机制。定期检查Eureka Server的清理日志,确保故障节点能够被及时清理,防止注册信息滞留。
4.I/O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源。 目前支持I/O多路复用的系统调用有select、pselect、poll、epoll,在Linux网络编程过程中,很长一段时间都使用select做轮询和网络事件通知,然而select的一些固有缺陷导致了它的应用受到了很大的限制,最终Linux不得不在新的内核版本中寻找select的替代方案,最终选择了epoll。
5.NIO包含三个核心的组件:Buffer(缓冲区)、Channel(通道)、Selector(多路复用器)。 Buffer是一个对象,它包含一些要写入或者要读出的数据。在NIO类库中加入Buffer对象,体现了新库与原I/O的一个重要区别。在面向流的I/O中,可以将数据直接写入或者将数据直接读到Stream对象中。在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。 Channel是一个通道,可以通过它读取和写入数据,它就像自来水管一样,网络数据通过Channel读取和写入。通道与流的不同之处在于通道是双向的,流只是在一个方向上移动而且通道可以用于读、写或者同时用于读写。因为Channel是全双工的,所以它可以比流更好地映射底层操作系统的API。特别是在UNIX网络编程模型中,底层操作系统的通道都是全双工的,同时支持读写操作。 Selector会不断地轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。一个多路复用器Selector可以同时轮询多个Channel,由于JDK使用了epoll()代替传统的select实现,所以它并没有最大连接句柄1024/2048的限制。这也就意味着只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端,这确实是个非常巨大的进步。 加分回答 Java 7的NIO2提供了异步Channel支持,这种异步Channel可以提供更高效的IO,这种基于异步Channel的IO机制也被称为异步IO(AsynchronousIO)。NIO2为O提供了两个接口和三个实现类,其中AsynchronousSocketChannel和AsynchronousServerSocketChannel是支持TCP通信的异步Channel。
进程和线程,区别,哪个效率高,为什么?
死锁的条件,如何解决
java的基本数据类型和字节数
mysql索引结构,特点,为什么使用这个
聚集索引和非聚集索引
String,StringBuffer, StringBuilder区别
HashMap,为什么使用红黑树
垃圾回收机制GC, cms, G1,垃圾回收的算法
------------------------------------------------------------------------
子类和父类的实例变量和方法有什么区别?
父类的实例变量子类可以使用,子类的只能自己使用;
子类可以调用父类的方法,父类不能调用子类的方法。因为父类不知道它将被哪个子类继承,也不知道子类将增加怎么样的方法。
对于静态变量
父类的静态变量子类可以使用,方式为类.变量名。
如果子类的静态变量和父类的静态变量重名,且父类静态变量与子类静态变量值改变时,不相互影响。因为子类和父类变量的内存不同,子类的静态变量重新分配内存。
重载和覆盖区别,返回值类型不同,可以重载吗,为什么?
覆盖(Override),又叫重写,是指子类对父类方法的一种重写,方法名、参数列表必须相同,返回值小于父类,只能比父类抛出更少的异常,访问权限不能比父类的小。被覆盖的方法是private的话,就不是重写,而是定义的一个新方法;
重载(Overload)表示同一个类中可以有多个名称相同的方法,但这些方法的参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
追加:那么构成重载的条件有哪些?
答:参数类型不同、参数个数不同、参数顺序不同
追加:函数的返回值不同可以构成重载函数吗?为什么?
答:不可以,因为Java中调用函数并不需要强制赋值。
-----------------------------------------------------------------------------------------------------
Spring Bean 的创建过程?
IOC容器加载过程 | ||
1 | new ApplicationContext创建容器 | |
2 | 解析配置-->读取bean的定义信息-->BeanDefinition | |
3 | 条件判断(不是懒加载 abstract) | |
4 | 获取bean | 单例池有直接返回; 没有会反射创建对象 早期bean |
5 | 实例化 | 反射创建对象 早期bean 动态代理 bean |
6 | 属性注入DI @autowired | |
7 | 初始化 初始化回调afterPropertiesSet() 成熟bean | 1 实现InitializingBean 接口 2 通过注解PostConstruct 3 add bean initMethod() 指定回调方法 |
8 | put 单例池 一级缓存 动态代理put 单例池 | 获取 动态代理bean |
Spring 怎么解决循环依赖 | ||
二级缓存 | 存早期普通bean 循环依赖的出口(临时解决循环依赖) 减小锁粒度,提升性能 | 成熟bean创建完成,移除二级缓存bean |
三级缓存 | AOP 动态代理; 存的是一个函数式接口; 把方法引用存起来(创建aop代码逻辑缓存起来) | 保证了bean 生命周期的规范; 只有循环依赖的bean 才在依赖注入创建aop代理 |
java泛型
悲观锁和乐观锁
mysql底层原理,为什么效率高,主键能不能太大,为什么
linux查询tcp连接处理CLOSE_WAIT的状态的数目
RabbitMQ, kafka, RocketMQ, ActiveMQ, 以及其他消息中间件
redis为什么效率高,线程,数据结构,网络模型,aio, nio, bio, 为什么这么设计?如何处理高并发?
------------------------------------------------------------------------
数据仓库和数据湖的区别
分布系统的设计,分布式系统CAP,分布式系统的模型
linux环境下的线上业务管理有没有,如何管理
redis的集合有没有限制,限制是多少
redis的1w条的插入和更新有什么区别?
-- Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作。
mysql join的底层原理是什么,有哪几种(不是左右连接这种)
linux命令查询一个文件内出现重复最多的数字的
linux命令查询一个文件的行数
解答
Linux查询tcp连接处理CLOSE_WAIT的状态的数目?
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
它会显示例如下面的信息:
TIME_WAIT 814
CLOSE_WAIT 1
FIN_WAIT1 1
ESTABLISHED 634
SYN_RECV 2
LAST_ACK 1
常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。
Linux命令分析
以url为例,统计url中出现频率次数前10的url,并按出现次数的降序排序。
cat url.log | sort | uniq -c |sort -n -r -k 1 -t ' ' | awk -F '//' '{print $2}' | head -10
前WEB服务器中联接次数最多的ip地址
netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr
查看日志中访问次数最多的前10个IP
cat access_log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 | less
查看日志中出现100次以上的IP
cat access_log |cut -d ' ' -f 1 | sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr | less
uniq -c
表示合并相邻的重复记录,并统计重复数。因为uniq -c
只会合并相邻的记录,所以在使用该命令之前需要先排序。对记录重新排序,需要用到sort命令的 -k 1 、-n、-r 三个命令参数;sort -k 1表示对于每行的第一个字段进行排序,这里即指代表重复记录数的那个字段。因为sort命令的默认排序是按照ASCII,这就会导致按从大到小进行排序时,数值2会排在数值11的前面,所以需要使用-n 参数指定sort命令按照数值大小进行排序。-r 表示逆序,即按照从大到小的顺序进行排序。使用awk -F命令分隔IP地址,并取数组的第二部分;使用head -n命令选取前n行。
Redis的集合有没有限制,限制是多少?
Strings类型:一个String类型的value最大可以存储512M
Lists类型:list的元素个数最多为2^32-1个,也就是4294967295个
Sets类型:元素个数最多为2^32-1个,也就是4294967295个
Hashes类型:键值对个数最多为2^32-1个,也就是4294967295个
Sorted sets类型:跟Sets类型相似
// springboot获取类路径下的文件路径 File path = new File(ResourceUtils.getURL("classpath:").getPath());
//path = D:\work_01\code\contract-services\target\classes
MySQL解析json串中的字段
使用mysql的内置函数JSON_EXTRACT(column, '$.key'),这个函数有两个参数,第一个参数column代表json列的列名;第二个参数key代表json字符串中的某一个key。
例子:
JSON_EXTRACT(d.`user_info`,'$.workaddr')
------------------------------------------------
json 去掉双引号
SELECT
JSON_UNQUOTE(JSON_EXTRACT(`req_data`,'$.gPS')) as gps,
JSON_UNQUOTE(JSON_EXTRACT(`req_data`,'$.iP')) as ip
FROM `t_am_channel` WHERE `order_code` ='2713770668780265881603'
and `type` ='LZS000000017'
and JSON_EXTRACT(req_data,'$.reqFlag')='01'
Wget 下载案例1
#!/bin/bash
for line in `cat /app/script/order.txt`
do
mkdir -p "/app/order/${line}"
wget http://assetscdn.xx.com/prod/qnyh/${line}/3.pdf -O /app/order/$line/${line}.pdf
done
统计文件夹文件个数
[root@node2 vouch]# ls -l |grep "^-"|wc -l
17893
zip 打包文件夹
[root@node2 store]# zip -r -o vouch_.zip /store/vouchzip/
Idea Cannot resolve symbol 'xxx'
终极解决方法:
MySQL 表锁
#查看哪些表被锁,字段In_use表示有多少线程在使用这张表,字段name_locked表示表格是否被锁,0代表锁定状态
show OPEN TABLES where In_use >0
#显示正在运行的进程(默认前一百条)
show processlist
hadoop jar
Could not find artifact 问题
mvn clean install -U | mvn clean install -DskipTests |mvn dependency:tree
spring-boot-maven-plugin 爆红问题
1.maven版本更新 https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/
2.把springboot parent 父工程 版本号复制过来 添加<version>
idea运行项目之后一直卡在Writing classes…
解决方案
1.把Shared build process heap size大小设置为2048,重启idea
具体位置是,settings -> Compiler -> Shared build process heap size
2.设置 idea 运行内存