Skip to content

6年架构师面试 04

CoderDream edited this page Mar 19, 2022 · 3 revisions

6年架构师面试-04

码农沉思录 2020-05-27 16:05 扫描下方二维码,关注“Java面试攻略” 回复“面试”,获取往期面试的题目与答案 图片

1、微服务的优缺点
优点:

  • 独立的可扩展性,每个微服务都可以独立进行横向或纵向扩展,根据业务实际增长情况来进行快速扩展;
  • 独立的可升级性,每个微服务都可以独立进行服务升级、更新,不用依赖于其它服务,结合持续集成工具可以进行持续发布,开发人员就可以独立快速完成服务升级发布流程;
  • 易维护性,每个微服务的代码均只专注于完成该单个业务范畴的事情,因此微服务项目代码数量将减少至IDE可以快速加载的大小,这样可以提高了代码的可读性,进而可以提高研发人员的生产效率;
  • 语言无关性,研发人员可以选用自己最为熟悉的语言和框架来完成他们的微服务项目(当然,一般根据每个公司的实际技术栈需要来了),这样在面对新技术或新框架的选用时,微服务能够更好地进行快速响应;
  • 故障和资源的隔离性,在系统中出现不好的资源操作行为时,例如内存泄露、数据库连接未关闭等情况,将仅仅只会影响单个微服务;
  • 优化跨团队沟通,如果要完全实践微服务架构设计风格,研发团队势必会按照新的原则来进行划分,由之前的按照技能、职能划分的方式变为按照业务(单个微服务)来进行划分,如此这般团队里将有各个方向技能的研发人员,沟通效率上来说要优于之前按照技能进行划分的组织架构;
  • 原生基于“云”的系统架构设计,基于微服务架构设计风格,我们能构建出来原生对于“云”具备超高友好度的系统,与常用容器工具如Docker能够很方便地结合,构建持续发布系统与IaaS、PaaS平台对接,使其能够方便的部署于各类“云”上,如公用云、私有云以及混合云。

缺点:

  • 增加了系统复杂性
  • 运维难度增加
  • 本地调用变成RPC调用,有些操作会比较耗时
  • 可能会引入分布式事务

2、分布式事务 第一次有人把“分布式事务”讲的这么简单明了

4、Service Mesh 听上去很牛逼的Service Mesh到底是什么?

5、Kafka消息是有序的吗?如何保证消息被顺序消费? 在同一个partition里的消息是有序的,不同partition之间的消息是没法保证全局有序的。

保证消息顺序消费:

  • 一个 topic,一个 partition,一个 consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。
  • 写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。

6、RocketMQ集群有哪些节点类型? 庖丁解牛 | 图解 RocketMQ 核心原理

7、使用MQ的过程中,如何确保消息不丢失?

  • 在生产阶段,你需要捕获消息发送的错误,并重发消息。
  • 在存储阶段,你可以通过配置刷盘和复制相关的参数,让消息写入到多个副本的磁盘上,来确保消息不会因为某个 Broker 宕机或者磁盘损坏而丢失。
  • 在消费阶段,你需要在处理完全部消费业务逻辑之后,再发送消费确认。

8、Redis实现分布式锁 Redlock:Redis分布式锁最牛逼的实现

9、Zookeeper实现分布式锁
求你了,别再问我Zookeeper如何实现分布式锁了!!!

10、布隆过滤器原理 大白话布隆过滤器,又能和面试官扯皮了~

11、消息推送底层的原理?怎么设计一个消息推送系统? 这是开放性题目,言之有理即可。以下方案仅供参考,有不合理之处欢迎讨论。 消息推送一般我们会使用长连接技术,即客户端与服务端维持一个长时间不断开的TCP连接。(至于为什么不用UDP,因为UDP不是面向连接的,而且不可靠,消息推送一般需要做ack答复与顺序推送,用UDP显然不合适)
既然使用长连接,那么意味着服务端需要维持每个客户端的连接信息,因此常见的BIO肯定是不能满足性能要求的,因此服务端需要使用NIO或者AIO等技术。
另外,因为客户端只能跟同一台服务器维持连接,因此负载均衡技术需要使用跟IP哈希相似的路由策略,才能保证每个客户端自始至终都是跟同一台服务器通信。假如使用轮询策略,那么不同TCP数据包可能发送到不同的后端服务器,那意味着后端会有多台服务器需要跟负载均衡软件维持长连接,会浪费更多资源。
此外,后端还需要记录每个客户端具体是跟哪台后端服务器建立了连接,这样才能实现服务端推送,因此后端服务器需要将这个映射关系记录下来,最简单的方案就是放到redis里面。
最后就是应用层协议了,常见的方案是使用websocket协议。当然也可以使用自定义协议,但是自定义协议的开发和维护成本比较高。

12、IO模型
1)阻塞和非阻塞的区别:
针对的对象是调用者

  • 阻塞指调用者在调用某一个函数后,一直在等待该函数的返回值,线程处于挂起状态
  • 非阻塞指调用者在调用某一个函数后,不等待该函数的返回值,线程继续运行其他程序(执行其他操作或者一直遍历该函数是否返回了值)

2)同步和异步的区别: 针对的对象是被调用者

  • 同步指的是被调用者在被调用后,操作完函数所包含的所有动作后,再返回返回值
  • 异步指的是被调用者在被调用后,先返回返回值,然后再进行函数所包含的其他动作

3)IO模型

①阻塞IO

图片

进程调用一个recvfrom请求,但是它不能立刻收到回复,直到数据返回,然后将数据从内核空间复制到程序空间。在IO执行的两个阶段中,进程都处于blocked(阻塞)状态,在等待数据返回的过程中不能做其他的工作,只能阻塞的等在那里。

②非阻塞IO

图片

与阻塞式I/O不同的是,非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error。进程在返回之后,可以处理其他的业务逻辑,过会儿再发起recvform系统调用。采用轮询的方式检查内核数据,直到数据准备好。再拷贝数据到进程,进行数据处理。

③IO多路复用

图片

IO多路复用的好处就在于单个进程就可以同时处理多个网络连接的IO。它的基本原理就是不再由应用程序自己监视连接,取而代之由内核替应用程序监视文件描述符。

举个例子:你去别人家做客,恰巧你要找的人正在忙,于是你就跟他家的管家说,等你找的人有空了再通知你,然后你就可以忙自己的事去了,接下来只需要等管家的通知就行了。

在IO多路复用中,内核就充当“管家”的角色,在“主人”忙碌的时候,可以“接待”多个“网络连接”。

④异步IO

图片

相对于同步IO,异步IO不是顺序执行。用户进程进行aio_read系统调用之后,就可以去处理其他的逻辑了,无论内核数据是否准备好,都会直接返回给用户进程,不会对进程造成阻塞。等到数据准备好了,内核直接复制数据到进程空间,然后从内核向进程发送通知,此时数据已经在用户空间了,可以对数据进行处理了。 举个例子:你想去银行办理业务,但是没有时间。于是委托自己家人去办理。然后等你的家人办理后,再通知你业务办理的结果。在这个过程中,你不用排队(无阻塞),也不用填表(异步)。

13、粘包拆包 粘包拆包,Netty及远洋通信中的解决方案!超实用原创

14、MySQL索引 MySQL索引

Clone this wiki locally