钉钉(一面),让进步发生。

91 阅读5分钟

钉钉,让进步发生。

  • 唯一字符如何保证安全性?唯一字符哈希冲突时如何解决?

    • 不存储明文,只保存字符对应的MD5。
    • MD5冲突的概率性非常小,是否可以在原先的基础上进行二次MD5?本身概率性就非常小,假设用户端出现情况,则通过人工干预反馈,重新更换唯一字符。
    • Bloomfilter前阶段筛选(工作原理):bitmap
  • 如何保证生成CDK的性能同时保证唯一性?插入MySQL的性能?如何验证?

    • 使用协程充分利用多核CPU能力,同时批量新增数据到MySQL,而不是一次一次Insert,目前自测一次新增20000条数据时最优的,但是要考虑到每一行的数据量是多少。
    • 分批进行生成,每个协程负责10w个唯一字符来生成,同时在该协程内,每2w个字符为一批SQL并发进行入库。
  • 生成唯一字符如何用Java实现?并发?线程池?

    • 核心原理还是不变,充分利用多核心CPU,来并发进行执行。
    • Java 线程池参数:
      • 核心线程数:本次声明的线程池的最小线程数量。
      • 最大线程数:本次声明的线程池的最大线程数量。
      • 存活时间:超出核心线程数的线程当没有任务可执行时最大存活时间。
      • 保存时间单位:上个参数存活时间的单位。
      • 阻塞队列类型:当所有工作线程都在执行任务时,后续新的任务存入到的阻塞队列中。
      • 线程工厂:创建线程的工厂,自定义线程信息。
      • 拒绝策略:当所有线程都在工作时,并且队列也已经满了,此时新执行的任务通过拒绝策略来控制执行:
        • CallerRunsPolicy:由增加任务的线程直接执行该任务。
        • AbortPolicy :直接丢弃任务,并且抛出异常。
        • DiscardPolicy:直接丢弃掉任务,没有异常。
        • DiscardOldestPolicy:直接丢弃掉最早的任务,然后尝试把本次拒绝的任务放入到队列。
  • Redis什么场景下有用到? 优先队列?延时队列?

    • 分布式锁:通过Lua脚本把setnx命令和expire命令原子执行。只有当全部执行成功才会返回上锁成功,否则上锁失败。

      超时时间设置:超时时间不可以设置过大的时间,或者过小的时间,过大如果某个Pod发生Panic,则会导致锁不会释放,知道锁过期,过小可能业务还没有执行完,锁就释放了。正确的应该是参考redisson实现锁的需求,旁路开启一个goroutine不断的对Lock进行续期。当业务执行完毕后,主动释放掉锁,如果Pod进程挂掉,那么在极短的时间内Lock不续期的话锁会释放掉。

    • 优先队列:构造优先级的概念,将其存入Zset中的Score中,按照定义的优先级规则从大到小或者从小到大取出对应的队头数据,如果队头不满足则队列中的其他元素也不满足。

    • 如何构造延迟队列:同理,将业务元素数据存入到Zset中,Score保存其入队时的时间戳,旁路goroutine循环的向外取出Score最小的元素进行业务逻辑处理,如果最小队头元素还未达到延迟时间,那么队列后续的业务元素也未达到延迟时间,此时队列都不能出队,等待下次轮训。

    • 补充其他场景:

  • 内存泄漏?如何发现的?如何修复的?

    • 线上灰度Pod后,进行回归测试,捞取线上10w+用户数据执行回归,执行之后发现服务内存暴涨到1G左右,之前服务内都是300M左右内存,由此大概可以确定内存泄漏。之后再测试环境重新复现的同时,利用pprof进行监控统计处服务测试时间段内的内存树状图进行分析,最后发现某个SDK的TCP链接占用过多,在测试环境高达40M,最后回该SDK相关业务发现TCP链接没有关闭。关闭连接后正常此时,发现内存不在涨了。之后发新版,线上重新回归测试后发现内存正常。
  • 一个接口如何保证高并发?

    • 业务层:
      • 无相关的数据内容走本地缓存或者分布式缓存(Redis)。
      • HTTP或者RPC接口能异步的则进行异步执行。
      • 消息队列流量削峰。
    • 技术层:
      • 方案设计时第三方组件选型。
      • Epoll?
  • 异步接口如何处理错误?

    • 查看错误的容忍度,如果是在可接纳范围内的可以不进行回滚,如果某个业务逻辑一定接纳不了某个步骤出错,那么就必须回滚。
  • 分布式事务?

    • 2PC(Seta):
      • 准备阶段:事务管理器给每个参与者发送准备信息,然后本地事务开始执行本地事务,并将结果发送给事物管理器
      • 提交阶段:准备阶段提交所有的执行结果后,如果有一个失败则回滚,否则Commit。
    • 3PC:
      • Try:资源预留
      • Confirm:资源确认
      • Cancel:资源回滚
  • Kafka Topic有多少Partition?

  • Kafka 如何保证数据不丢失?ACK机制?Broker端机制?

    • Kafka 持久化:将所有消息持久化到磁盘上,同时每个消息追加到日志文件中,并且写入操作成功后才ACK。
    • 复制机制:Kafka支持多副本机制,消息冗余。如果某个节点发生故障,仍然有副本可以读取数据。
    • 同步模式:生产者必须等待Broker端ACK之后才进行ACK确认。