腾讯云一面

1. 百万人在线的直播间给人推送弹幕消息,每人都能发送消息,且非常频繁,百万人都能收到,如何实现。


(1)也是长链下发。不过不能读取redis路由,如果每人发一条消息,就去读取,redis也会受不了,redis这块添加本地缓存会有问题,路由实例存不了这么多本地缓存,会逐出。

(2)可以读取每个长链接服务器的本地缓存,本地缓存维护长链接是哪个room的,本地长链服务器收到客户端发送的消息时,转发给其他所有的长链服务器,遍历是不是属于这个房间的链接,如果是也下发这条消息。


2. 很多人在一个千人群里同时发送消息,每发一条消息都会读取一下群成员的关联关系,怎么避免重复读取关联关系。


消息等待,累积50ms读一次关联关系,发送累积的消息。


3. go GPM模型。


4. go channel如何实现,让你实现怎么做。为啥用数组,用环形队列是否可以。


5. 分布式限流算法如何实现?单机限流如何实现?令牌桶有什么问题?


https://www.tuicool.com/articles/ErAvMrV


基于时间窗口的限流算法:不能防止在细时间粒度上面访问过于集中的问题,也就是突发流量。


(1) 固定窗口算法,也叫计数器算法:

- 也就是当前请求时间跟上一个请求的间隔在一秒内,则计数器加一,如果超过阈值则熔断,否则执行。

- 如果不在一秒内,则计数器清0,更新最后请求时间为当前时间秒,执行。


(2) 滑动窗口算法:解决固定窗口中流量集中在第一个500ms和第二个500ms,导致实际流量超过最大值的问题。


- 需要维护每个请求的时间,并放置到队列里,新到来的请求跟第一个请求的时间如果不在1s内,则不断去除队头,直到在1s内为止。

- 计算当前队列元素个数是否达到阈值,达到了则熔断,未达到则请求时间入队并执行。


(3) 令牌桶算法:可能存在误杀的情形,流量比较平滑。突发流量会被限流。

- 以固定时间向某个桶中放令牌。令牌满了则丢弃。例如20qps,则每隔50ms放一个令牌,放满了则不放。

- 请求过来时从桶中取一个令牌,如果没有取到则拒绝。取到了则执行。对于guava允许阻塞一段时间,如果没有拿到才放弃,也就是阻塞式限流。


(4) 漏桶算法

对于取令牌的频率也有限制,要按照 t/n 固定的速度来取令牌,也就是50ms才能取一次,如果累计了30个令牌,也只能50ms取一次。



6. 用户侧如何查询所有历史记录。客服侧如何查询所有历史记录?


7. 如果消息id由某个区域生成的,同步到其他区域时id不连续了怎么办。


8. kafka优化了消费逻辑,已经到极致了。后续如果再积压,如何做?


分库分表,扩充partition,多个topic。


9. 三次握手四次挥手的过程。



10. 缓存穿透怎么解决


添加规则校验。


布隆过滤器


11. 如何避免长链服务器无效建连,被攻击。


可以再升级请求里面添加token过滤,或者第一个信令里面上传token进行验证。定时清空无效的连接。或者升级时检验下登录的cookie。



#java求职##面经##腾讯#
全部评论

相关推荐

点赞 10 评论
分享
牛客网
牛客企业服务