5.智能设计与数控技术(被拷打)
1.工单的作用
2.ROCketMQ的内部结构以及确认机制
我:生产者、消息队列、消费者、topic
正确回答:
- NameServer:注册中心;管理和分发Broker的元数据,如topic、队列消息、Broker地址列表;生产者和消费者通过它发现和定位Broker
- Broker:消息存储和转发;它分为Master和Slave,支持主从复制,实现高可用;内部细分多个队列,每个topic下的消息均匀分到队列
- Producer:产生和发送消息到Broker,支持同步、异步、单向发送,并设置消息发送确认机制。
- Consumer:从Broker拉取消息消费,支持集群、广播消费,根据消费组和队列决定消费方式
消息确认机制:
普通消息:
- 消息发送确认:Producer发送普通消息时,同步或异步请求Broker确认消息是否成功存储,Broker接受消息后返回ACK,生产者收到ACK后认为消息发送成功
- 消息消费确认:Consumer拉取消息消费时,向Broker发送消息确认,Broker收到Consumer的成功确认后,从消息队列将该消息从队列中移除,否则超时重新投递,防止消息丢失。
事务消息确认机制:两阶段提交
- 第一阶段:Producer发送半事务消息,Broker保存消息但不立即投递给Consumer,等待Producer第二次确认。
- 第二阶段:Producer根据本地事务执行结果向Broker提交二次确认。如果Commit,Broker将消息标记为可投递,如果Rollback,Broker删除该消息。
3.RLock的实现原理
我:不会
答案:
RLock时Redisson中的一种分布式接口,它提供了一种在分布式系统中实现线程安全和互斥访问共享资源的方法。
- 加锁机制:它通过Redission创建RLock实例,通过lock()或tryLock()获取锁;可以为锁设置过期时间,可通过SETNX或Lua脚本保证原子性;当锁被其他客户端持有,会选择尝试获取锁或超时放弃
- 锁续期:避免客户端在持有锁期间因网络延迟或其他原因导致未能及时释放锁或锁失效,引入看门狗机制(每隔一段时间(默认30秒)自动更新锁过期时间),保证客户端在用锁期间,锁不会超时释放。
- 锁释放:unlock()释放锁
- 故障转移:涉及多个独立Redis节点,在大多数(一般是半数以上)节点上同时获取锁,从而提高系统的容错性和安全性
4.RBAC如何细粒度控制权限访问
我:通过角色表对应菜单表的权限,每个菜单表有父ID和ID,递归父ID获取每个角色的权限列表
在基本的RBAC中添加一个资源表和一个操作表,记录系统中的所有资源(如文件、菜单、功能点等)和针对这些资源的具体操作(如查看、编辑、删除等)。然后创建一个资源-操作-角色关联表,用于表示角色对具体资源及其操作的访问权限。
5.ThreadLocal存在的问题
我:存在内存泄漏,可在用户退出登录时使用remove消除引用;异步存在的问题?
异步处理,可采用RequestContext或者AsyncContext等方式保持请求上下文,而不是单纯依赖ThreadLocal。
原因:
- 线程生命周期不同:发起请求线程与处理任务线程可能不同
- 上下文丢失:当线程切换时,原线程的ThreadLocal变量咋新线程中不可见
- 并发问题:多个异步任务共享一个线程池中的线程,各自设置的ThreadLocal会被互相覆盖
- 内存泄漏:在线程池中,当线程被复用时,旧任务遗留的ThreadLocal值可能会保留在线程中,无法被垃圾回收,从而引发内存泄漏