项目中的亮点 以及困难怎么去解决?
点赞接口使用了redis的分布式锁,set命令 将设置key 以及Key的expire time一起设置,保证了命令执行的原子性,不会出现被别的请求释放锁导致出问题;目前使用的Jedis操作redis,我建议使用Redission来操作redis,提供了很多分布式说的 解决方案;然后可以说一下 redis的底层数据结构(dicEntry 里面有 SDS 和 redisObject :SDS(String) 双向链表(List) 字典(哈希表 哈希冲突使用链地址法 哈希表里面存的是dictEntry) 跳表skip list是一个有序数据结构(sort set) 整数集合(set) 压缩列表(将数据按照相同的编码规则放 内存的连续空间 目的是为了节省内存开销))
说一下redis的list现在一般都被MQ给取代了,MQ消息可靠性以及高可用 以及多客户端的发布与订阅;Redis的集群与部署?说一下Sentinel哨兵机制,主从复制?主从数据一致性?我们使用Codis去搞的。。
事务,接口幂等性
幂等性见上,一段时间内用户多次请求只能保证成功一次,比如支付接口,默写接口请求的时候 因为弱网条件下,导致用户多次发送重复请求等等,比如我项目当中的一个生活缴费(物业费水费等)接口,怎么去保证高可用呢?比如遇到弱网条件? 万一用户在你的平台缴费成功了,然后你这边收到成功的code之后呢 你去调用第三方的接口告诉人家支付金额 以及相关支付信息 这个地方如果使用MQ的话?如何去保证消息的可靠性呢?以及消息被成功消费呢?
生产者这边 如何去保证消息的可靠性:消息有一个唯一的订单编号,
消费者这边 如保证消息的成功消费:
如果你这个地方是调用的第三方接口呢 ? 你用的那种HTTPUtil?说一说他们之间的区别?这个调接口的方式如果不成功 怎么去保证在用户花钱了之后一定调接口OK呢? 这个地方我用自旋 可以理解为while(true)或者for(;😉,直到成功之后 break,如果有任何异常的code那就继续循环调直到成功。
再比如我们做的一个我负责的功能模块的UV,独立用户访问次数,一天内多次访问需要去重,当然是用的是redis的set,如果数据量比较大用户量比较大 日活很高的话,这个就要求不是很精确了,就可以使用HLL hyperLogLog,大概12K的内存就能一亿个数据;
基本算法
- 堆排序
Java的PriorityQueue堆
/*
* heap底层数据结构是数组 父节点和子节点的下标是有关系的 其中peek和remove方法时O(1)
* add和poll和无参的remove以及offer()都是O(logN)
* parentNo*2 + 1 = leftNo parentNo*2 + 2 = rightNo parentNo = (index-1)/2
* */
-
手写堆排序
-
二分法
-
贪心
-
二叉树遍历
-
动态规划
-
链表反转 以及链表合并
关于分布式框架Dubbo、SpringCloud等
- 服务的注册和发现
- 路由负载均衡
- 异步调用?
- 限流降级,熔断
- 失败重试?
- 服务下线
- 网关层
RabbitMQ和Kafka项目中怎么去选择
- 说一下在生产者这边如何保证消息的可靠性?
可以基于ACK机制,如果开始事务会很影响并发性是同步的;通常生成生成消息都会有一个唯一id,不管是数据主键id还是业务流水号,基于confirm的ACK机制,RabbitMQ收到消息后会回调一个callback,里面有ack代表是否成功接收处理,还有一个消息唯一标识的参数,如果说过一段时间连这个ACK也没收到怎么去处理,我们内部会维持一个Timeout?,ack机制不仅仅是在生产者消息没法出去会触发,进入MQ以后没找到对应的exchange也会返回false,结合这个confirm的ack确认机制,自己内部也可以维护每条消息的发送状态,true就存1,false就存一个字段0
- 消费者的如何不重复消费?
这个需要开发者这边去保证,利用唯一性id,存redis消费之前检查一下
- 如何保证消息消费不被丢失?
这个也是使用confirm的ack机制,可以关闭MQ自身的ack,程序里面自己处理,如果MQ没收到消费者的ack
- Kafka和RabbitMQ如何去选择?
- Kafka和RabbitMQ的工作原理大概说一下
关于网络IO
- BIO
- NIO
- AIO
- webSocket和HTTP的区别
- TCP和UDP的区别