电商外包面试题1
1.类加载器是怎么使用的
类加载器是 Java 虚拟机(JVM)的一部分,负责将字节码转换为 Java 对象并加载到 JVM 内存中。Java 应用程序中的每个类都需要被类加载器加载才能在 JVM 中运行。类加载器负责查找和加载类文件,将类文件转换为 Java 类对象并存储在 JVM 内存中。
在 Java 中,有三种类型的类加载器:引导类加载器、扩展类加载器和系统类加载器。引导类加载器是 JVM 的一部分,用于加载 Java 核心类库和其他基本类。扩展类加载器用于加载应用程序所需的扩展类,而系统类加载器则负责加载应用程序的类。
当 JVM 需要加载一个类时,它首先会向系统类加载器发出请求。如果系统类加载器找不到该类,它会将请求传递给扩展类加载器。如果扩展类加载器也无法找到该类,它会将请求传递给引导类加载器。如果引导类加载器也无法找到该类,则 JVM 将抛出 ClassNotFoundException 异常。
类加载器通常使用委托模型进行工作。委托模型是指当类加载器需要加载一个类时,它会首先委托父类加载器去查找并加载类。只有当父类加载器无法加载该类时,它才会自己尝试加载该类。这样可以确保所有的类都是由同一套标准加载器加载,从而避免类的重复加载和冲突。
2.nacos传输层使用的Http还是TCP
Nacos 传输层使用的是基于 TCP 的自定义协议,而不是 HTTP 协议。
Nacos 是一个分布式的服务注册与发现系统,其主要功能是实现微服务架构中的服务注册、发现和配置管理。在 Nacos 中,客户端和服务器之间的通信采用基于 TCP 的自定义协议。这个协议是由 Nacos 团队自主开发的,其设计目标是为了提供高性能、高可靠性的通信方式,以满足服务注册、发现和配置管理的需求。
相比于 HTTP 协议,TCP 协议的优势在于其更高的效率和更好的可靠性。TCP 协议提供了可靠的连接和数据传输机制,能够保证数据的完整性和有序性。这对于服务注册、发现和配置管理等核心功能来说非常重要,因为这些功能需要保证数据的准确性和一致性,以确保整个系统的稳定性和可靠性。
总之,Nacos 采用基于 TCP 的自定义协议进行通信,以实现高性能、高可靠性的服务注册、发现和配置管理
3.Redis的五种数据类型,使用场景(读的场景,写的场景)
- 字符串(String):可以存储字符串、整数和浮点数等类型的数据。字符串类型是 Redis 最基本的数据类型,常用于缓存数据、计数器、排行榜等场景。
读的场景:通过 GET 命令获取字符串类型的数据。
写的场景:通过 SET 命令设置字符串类型的数据,或者使用 INCRBY 命令对计数器进行自增操作。
- 列表(List):可以存储多个有序的字符串类型的元素。列表类型常用于实现消息队列、日志系统等场景。
读的场景:通过 LINDEX 命令获取列表中指定位置的元素,或者使用 LRANGE 命令获取指定范围内的元素。
写的场景:通过 LPUSH 命令向列表的左侧添加一个元素,或者使用 RPUSH 命令向列表的右侧添加一个元素。
- 集合(Set):可以存储多个无序的字符串类型的元素,且每个元素都是唯一的。集合类型常用于实现共同关注、点赞、排重等场景。
读的场景:通过 SMEMBERS 命令获取集合中所有的元素,或者使用 SISMEMBER 命令检查指定元素是否存在于集合中。
写的场景:通过 SADD 命令向集合中添加一个元素,或者使用 SREM 命令从集合中删除一个元素。
- 哈希表(Hash):可以存储多个字段和值之间的映射关系。哈希表类型常用于存储对象的属性、统计分析等场景。
读的场景:通过 HGET 命令获取哈希表中指定字段的值,或者使用 HGETALL 命令获取哈希表中所有的字段和值。
写的场景:通过 HSET 命令设置哈希表中指定字段的值,或者使用 HMSET 命令同时设置多个字段和值。
- 有序集合(Sorted Set):可以存储多个有序的字符串类型的元素,并且每个元素都有一个对应的分值。有序集合类型常用于实现排行榜、计数器等场景。
读的场景:通过 ZRANGE 命令获取有序集合中指定范围内的元素,或者使用 ZSCORE 命令获取指定元素的分值。
写的场景:通过 ZADD 命令向有序集合中添加一个元素,并指定对应的分值,或者使用 ZINCRBY 命令对指定元素的分值进行自增操作。
4.seata分布式事务的三种模式
Seata 是一个开源的分布式事务解决方案,它支持三种分布式事务模式:
-
AT 模式(TCC):基于 TCC(Try-Confirm-Cancel)机制实现的分布式事务模式。在该模式下,Seata 会将分布式事务拆分成多个本地事务,并在执行每个本地事务之前先执行 try 阶段,用于预留必要的资源,确保后续事务执行的正确性。如果所有本地事务的 try 阶段均成功执行,则执行 confirm 阶段,用于提交所有的本地事务,否则执行 cancel 阶段,用于回滚所有的本地事务。
-
TCC 模式:与 AT 模式类似,也是基于 TCC 机制实现的分布式事务模式。不同的是,在 TCC 模式下,Seata 会在执行每个本地事务之前先执行 try 阶段和 confirm 阶段,用于预留必要的资源和提交本地事务。如果在执行 confirm 阶段时出现错误,则执行 cancel 阶段,用于回滚所有的本地事务。
-
XA 模式:基于 XA(eXtended Architecture)机制实现的分布式事务模式。在该模式下,Seata 会将分布式事务拆分成多个本地事务,并在执行每个本地事务之前先执行 prepare 阶段,用于预留必要的资源。如果所有本地事务的 prepare 阶段均成功执行,则执行 commit 阶段,用于提交所有的本地事务,否则执行 rollback 阶段,用于回滚所有的本地事务。
总的来说,Seata 的三种分布式事务模式各有优缺点,在不同的场景下可以选择不同的模式来实现分布式事务。例如,在需要对数据进行强一致性控制的场景下,可以选择 AT 模式或 TCC 模式;而在需要跨多个数据源实现分布式事务的场景下,可以选择 XA 模式。
5.两个项目依赖不同的iava版本,在同一台机器上跑怎么解决
当两个项目依赖不同的 Java 版本时,在同一台机器上运行需要注意以下几点:
-
在同一台机器上安装多个不同版本的 Java 运行环境,如 JDK1.8 和 JDK11,并将它们分别配置到对应的项目中。
-
使用 Maven 管理项目依赖,通过在 pom.xml 中声明对应的依赖版本,以确保每个项目都能够使用其所需的 Java 版本。
-
在启动项目时,需要指定使用的 Java 版本,可以通过在启动脚本中设置 JAVA_HOME 和 PATH 环境变量来实现。例如,如果要使用 JDK11 启动项目,可以在启动脚本中添加以下命令
export JAVA_HOME=/path/to/jdk11
export PATH=$JAVA_HOME/bin:$PATH
- 在开发过程中,需要注意使用的 Java 版本,以确保项目的兼容性。如果在低版本的 Java 中编写了高版本的 Java 代码,可能会导致编译错误或者运行时错误。因此,建议在编写代码时使用与项目所需 Java 版本相同的 Java 版本。
综上所述,对于依赖不同 Java 版本的项目,在同一台机器上运行时,需要进行适当的配置和管理,以确保项目能够正常运行并保持兼容性。
6.RocketMQ怎么保证消息不丢失、不被重复消费
RocketMQ 通过以下方式保证消息不丢失和不被重复消费:
-
消息落盘机制:RocketMQ 在将消息发送到 Broker 之前会将消息保存在发送方的本地磁盘,待消息发送成功后才删除本地磁盘上的消息。这种机制可以保证即使在网络或 Broker 发生故障时,消息也能够在本地得到保留。
-
主从同步机制:RocketMQ 在 Broker 层面使用主从同步机制,将消息主副本分别存储在不同的节点上,确保即使某个节点发生故障,也能够通过副本节点继续提供服务。
-
消费者拉取机制:RocketMQ 的消费者是主动拉取消息的,而非被动接收。消费者可以通过指定 offset 来拉取指定位置的消息,从而确保消费的准确性和完整性。
-
消息消费确认机制:RocketMQ 在消费消息后,会向 Broker 发送消息消费确认请求,只有当 Broker 收到消息确认请求后才会将该消息标记为已消费。如果消费者未能及时发送消息消费确认请求,Broker 会将该消息重新投递给其他消费者进行消费,从而避免了消息重复消费的问题。
综上所述,RocketMQ 通过消息落盘、主从同步、消费者拉取、消息消费确认等机制保证了消息的可靠性和完整性,从而避免了消息丢失和重复消费的问题。
7.能自己搭建RocketMQ吗
RocketMQ 提供了完整的开源软件包,用户可以自行下载并进行搭建部署。以下是搭建 RocketMQ 的基本步骤:
-
下载 RocketMQ:可以从官方网站或 GitHub 上下载 RocketMQ 的压缩包,并解压到指定目录。
-
配置环境:根据 RocketMQ 的安装文档进行环境配置,如设置 JAVA_HOME 环境变量、修改配置文件等。
-
启动 NameServer:NameServer 用于提供 Broker 的注册和发现服务,通过运行 namesrv 脚本启动 NameServer。
-
启动 Broker:Broker 用于存储和分发消息,可以通过运行 mqbroker 脚本启动 Broker。启动 Broker 时需要指定 NameServer 地址,并配置 Broker 的相关参数。
-
创建 Topic:通过 RocketMQ 的管理控制台或者 API 创建 Topic,设置 Topic 的名称、分区数、副本数等参数。
-
发送和消费消息:通过编写生产者和消费者程序,使用 RocketMQ 提供的 API 进行消息的发送和消费。
需要注意的是,在搭建 RocketMQ 时需要仔细阅读官方文档,了解各种配置参数和安全设置,以确保系统的可靠性和安全性。此外,需要定期维护和升级 RocketMQ,以获得更好的性能和功能支持。