百融云创面试题
RocketMQ
NameServer Broker
RocketMQ NameServer 是 RocketMQ 的核心组件之一,主要负责管理和维护消息队列的路由信息,同时提供了注册和发现服务的功能。以下是 RocketMQ NameServer 路由注册的简要总结:
NameServer 维护了 Broker 集群的地址列表和 Topic 的路由信息。当 Producer 或 Consumer 发起请求时,NameServer 会根据请求的 Topic 找到对应的 Broker 地址,将请求转发到对应的 Broker 上
每个 Broker 在启动时会向所有配置的 NameServer 发送心跳包,并定期发送更新路由信息的请求。NameServer 收到这些请求后,会将 Broker 的地址信息和 Topic 路由信息更新到自己的内存中
Producer 在发送消息之前需要向 NameServer 查询指定 Topic 的路由信息,包括该 Topic 下有哪些 Broker 负责消息存储和消费,并根据负载均衡算法选择一个 Broker 发送消息
Consumer 在启动时需要向 NameServer 查询指定 Topic 的路由信息,获取该 Topic 下所有的 Broker 地址,并根据负载均衡算法从其中选择一个或多个 Broker 订阅消息
如果 Broker 集群发生变化,例如新增或下线了 Broker,或者某个 Broker 上下线了 Topic,NameServer 会及时更新自己的路由信息,并通知 Producer 和 Consumer 进行相应的调整
RocketMQ集群消费与广播消费模式
1.集群消费
一个 Consumer Group 中的 Consumer 实例平均分摊消费消息
使用方法:setMessageModel(MessageModel.CLUSTERING)
2.广播消费
一条消息被多个 Consumer 消费,即使这些 Consumer 属于同一个 Consumer Group,消息也会被 Consumer Group 中的每个 Consumer 都消费一次,广播消费中的 Consumer Group 概念可以认为在消息划分方面无意义
使用方法:setMessageModel(MessageModel.BROADCASTING)
Redis
Redis是单线程吗?
是的,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了
在高并发的情况,redis是线程安全的吗?
在多客户端的情况下,Redis还是存在一些线程安全的问题。
- Redis中的哈希表并不是线程安全的
Redis中的哈希表(hash table)是用于存储键值对的数据结构,它是Redis中非常重要的部分。但是,Redis中的哈希表并不是线程安全的,因为在多个线程同时对哈希表进行读写操作时,可能会出现竞态条件
Redis中提供了一种名为“watchdog”的机制来避免竞态条件的发生,但是这并不是一个完全可靠的解决方案。因此,在使用Redis的过程中,应该尽量避免多个线程对同一个哈希表进行读写操作 - Redis中的计数器也存在线程安全问题
在Redis中使用incr命令可以对一个键的值进行自增操作,但是如果多个客户端同时对同一个键执行自增操作,就有可能出现线程安全问题。因为incr命令并不是原子性的操作,需要将键的值读出来后再加上一个增量,然后再将结果写回到键中
Redis提供了一种名为“redis atomicity”(Redis原子性)的机制来解决计数器的线程安全问题。这种机制是通过使用watch和multi命令来保证incr命令的原子性,从而避免了竞态条件的发生。不过这种机制也并不是完全可靠的,还是需要注意多线程访问同一个计数器的问题 - Redis中的连接池也可能会出现线程安全问题
在Redis中使用连接池能够提高性能,因为连接池可以重用已经建立的连接。但是,在多线程环境下,如果多个线程同时从连接池中取出连接进行操作,有可能会出现竞态条件。
为了避免连接池的竞态条件,需要使用一些技术手段来保证连接的线程安全。例如,在取出连接时,可以将连接封装成一个类,通过对类加锁的方式来保证线程安全
综上所述,虽然Redis是单线程的,但在多客户端的情况下仍然可能出现线程安全问题。在使用Redis时,我们需要注意一些常见的线程安全问题,如哈希表、计数器和连接池等。为了保证Redis的线程安全,我们可以采用一些技术手段,如watchdog、Redis原子性和类锁等
Redis有哪些数据类型?
5种数据类型:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)
Redis中hash有哪些操作命令
hset key field value
hget key field
作用:如果key对应的field不存在,则赋值,存在时什么都不做。
格式:hsetnx key field value
用:同时为一个key的设置多个field;值已存在就替换旧值
格式:hmset key field value [field value …]
作用:同时获取一个key的多个field的值;
格式:hmget key field [field …]
作用:获取一个key下所有field和value
格式:hgetall key
作用:获取key对应的所有的field
格式:hkeys key
Redis中list有哪些操作命令
LPUSH key element [element …] 将元素依次插入到列表头部
RPUSH key element [element …] 将元素依次插入到列表尾部
lmove source destination <left | right > <left | right> 将source列表的一个元素移动到destination列表中
blmove source destination <left | right><left | right> timeout 在lmove的命令下增加了如果source列表没有元素则等待timeout超时或者直到有元素为止
lpop key [count] 获取并删除count个元素(从头部开始)
rpop key [count] 获取并删除count个元素(从尾部开始)
lindex key element 获取key中索引为index的元素
Redis中set,zset有哪些操作命令
set
SADD :添加多个元素到集合中
SMOVE 命令:移动集合元素到另一个集合中
zset
ZADD : 添加多个元素到有序集合中
ZINCRBY 命令:为分数值加上增量
ZCARD 命令:获取有序集合中的元素数量
ZCOUNT 命令:获取在分数区间内的元素数量
Spring事务传播级别
- PROPAGATION_REQUIRED:默认传播行为。 如果当前没有事务,就创建一
个新事务,如果当前存在事务,就加入到事务中 - PROPAGATION_SUPPORTS: 如果当前存在事务,就加入到该事务。如果当
前不存在事务,就以非事务方式运行 - PROPAGATION_MANDATORY: 如果当前存在事务,就加入该事务。如果当
前不存在事务,就抛出异常 - PROPAGATION_REQUIRES_NEW: 无论当前存不存在事务,都创建新事务进
行执行 - PROPAGATION_NOT_SUPPORTED: 以非事务方式运行。如果当前存在事
务,就将当前事务挂起 - PROPAGATION_NEVER : 以非事务方式运行。如果当前存在事务,就抛出异
常 - PROPAGATION_NESTED: 如果当前存在事务,则在嵌套事务内执行;如果当
前没有事务,则按REQUEIRED属性执行
Mysql事务隔离级别
序列化(SERIALIZABLE):如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离。
可重复读(REPEATABLE READ):默认的事务隔离级别
提交读(READ COMMITTED)
未提交读(READ UNCOMMITTED)
Nacos如何实现实时刷新配置?
方式一:使用@RefreshScope注解
@RefreshScope注解是Spring Cloud提供的一种属性刷新机制。它可以应用于需要动态刷新的类或方法上,当Nacos上的属性值发生变化时,通过调用/actuator/refresh端点来刷新被注解的类或方法
方式二:使用@NacosValue注解
@NacosValue注解是Nacos提供的一种属性刷新机制。它可以直接应用于类的属性上,当Nacos上的属性值发生变化时,自动刷新注解的属性
方式三:使用Spring Cloud Bus
Spring Cloud Bus是一个事件、消息传输总线,可以将配置刷新事件广播给多个应用程序实例。通过结合Nacos和Spring Cloud Bus,可以实现多个应用程序实例之间的属性刷新
Springcloud五大组件
- 注册中心组件(服务治理):Netflix Eureka
- 负载均衡组件:Netflix Ribbon,各个微服务进行分摊,提高性能
- 熔断器组件(断路器):Netflix Hystrix,Resilience4j ;保护系统,控制故障范围
- 网关服务组件:Zuul,Spring Cloud Gateway;api网关,路由,负载均衡等多种作用
- 配置中心:Spring Cloud Config,将配置文件组合起来,放在远程仓库,便于管理
Spring事务什么时候会失效
- 数据库为不支持事务的引擎(Myisam)
- 如果事务的方法没有被spring管理,就是你的这个类没有加载到ioc容器中( 直接new出来的对象添加事务不起作用,因为只有spring定义的bean才接受事务)
- 加事务的方法不是public,因为生成代理类的时候 生成不了非public的方法
- 同一个类没有事务的方法,调用有事务的方法
- 未配置事务管理器
- 事务的传播类型 未not_supported
- 不正确的异常捕获,如果异常被捕获了 事务是识别不了的,所以会失效
- 异常类型不对,因为事务回滚的是 运行时异常(RuntimeException)