Java最全不得不说说微信钉钉后端亿级用户架构那些事(2),jvm原理面试题

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

一般来说,钉钉和微信后端主要就是一个IM的即时通讯软件,再加上很多周边功能,我们先来看下IM这块的核心功能包含哪些模块:

0)**用户:**系统的使用者。

1)**消息:**是指用户之间的沟通内容(通常在IM系统中,消息会有以下几类:文本消息、表情消息、图片消息、视频消息、文件消息等等)。

2)**会话:**通常指两个用户之间因聊天而建立起的关联。

3)**群:**通常指多个用户之间因聊天而建立起的关联。

4)**终端:**指用户使用IM系统的机器(通常有Android端、iOS端、Web端等等)。

5)**未读数:**指用户还没读的消息数量。

6)**用户状态:**指用户当前是在线、离线还是挂起等状态。

7)**关系链:**是指用户与用户之间的关系,通常有单向的好友关系、双向的好友关系、关注关系等等(这里需要注意与会话的区别:用户只有在发起聊天时才产生会话,但关系并不需要聊天才能建立。对于关系链的存储,可以使用图数据库(Neo4j等等),可以很自然地表达现实世界中的关系,易于建模)。

8)**单聊:**一对一聊天。

9)**群聊:**多人聊天。

10)**客服:**在电商领域,通常需要对用户提供售前咨询、售后咨询等服务(这时,就需要引入客服来处理用户的咨询)。

11)**消息分流:**在电商领域,一个店铺通常会有多个客服,此时决定用户的咨询由哪个客服来处理就是消息分流(通常消息分流会根据一系列规则来确定消息会分流给哪个客服,例如客服是否在线(客服不在线的话需要重新分流给另一个客服)、该消息是售前咨询还是售后咨询、当前客服的繁忙程度等等)。

12)**信箱:**本文的信箱我们指一个Timeline、一个收发消息的队列。

涉及到功能的具体实现还有很多概念需要先了解下

读扩散 vs 写扩散

IM系统里经常会涉及到读扩散和写扩散这两个技术概念,我们来看看。

读扩散

图片

**如上图所示:**A与每个聊天的人跟群都有一个信箱(有些地方会叫Timeline),A在查看聊天信息的时候需要读取所有有新消息的信箱。

**需要注意与Feeds系统的区别:**在Feeds系统中,每个人都有一个写信箱,写只需要往自己的写信箱里写一次就好了,读需要从所有关注的人的写信箱里读。但IM系统里的读扩散通常是每两个相关联的人就有一个信箱,或者每个群一个信箱。

读扩散的优点:

  • 1)写操作(发消息)很轻量,不管是单聊还是群聊,只需要往相应的信箱写一次就好了;

  • 2)每一个信箱天然就是两个人的聊天记录,可以方便查看聊天记录跟进行聊天记录的搜索。

**读扩散的缺点:**读操作(读消息)很重,在复杂业务下,一条读扩散消息源需要复杂的逻辑才能扩散成目标消息。

写扩散

接下来看看写扩散。

图片

**如上图所示:**在写扩散中,每个人都只从自己的信箱里读取消息。

但写(发消息)的时候,对于单聊跟群聊处理如下:

  • 1)单聊:往自己的信箱跟对方的信箱都写一份消息,同时,如果需要查看两个人的聊天历史记录的话还需要再写一份(当然,如果从个人信箱也能回溯出两个人的所有聊天记录,但这样效率会很低);

  • 2)群聊:需要往所有的群成员的信箱都写一份消息,同时,如果需要查看群的聊天历史记录的话还需要再写一份。可以看出,写扩散对于群聊来说大大地放大了写操作。

**PS:**实际上群聊中消息扩散是IM开发中的技术痛点,有兴趣建议详细阅读:《有关IM群聊技术实现的文章汇总》。

写扩散优点:

  • 1)读操作很轻量;

  • 2)可以很方便地做消息的多终端同步。

**写扩散缺点:**写操作很重,尤其是对于群聊来说(因为如果群成员很多的话,1条消息源要扩散写成“成员数-1”条目标消息,这是很恐怖的)。

由于概念比较多,一篇文章是不可能全部描述清楚的,还有像钉钉,微信这种亿级海量用户的系统架构实现难度是非常大的,随便给你说几个架构难点,看下你自己是否知道!

架构难点

1、亿级用户同时在线聊天如何保证高并发聊天消息正常推送

2、公众号千万级粉丝大V发文章如何让粉丝高效收取

3、高并发聊天系统如何保证发送的消息不乱序

4、微信钉钉后端海量离线消息如何高效存储与获取

5、高并发聊天系统如何保证发送的消息不丢失

6、单聊与群聊数据收发机制用读扩散还是写扩散

结语

小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

送给每一位想学习Java小伙伴,用来提升自己。

在这里插入图片描述

本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

支持!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值