后端开发面试题6(附答案)

前言

        在下首语言是golang,所以会用他作为示例。

原文参见 @arialdomartini的: Back-End Developer Interview Questions

分布式系统相关问题

1. 怎么测试一个分布式系统?

        测试分布式系统是一项复杂且具有挑战性的任务,因为它涉及到多个组件在不同的网络环境和硬件设施上的协同工作。以下是一些测试分布式系统的关键步骤和方法:

  1. 单元测试

    对分布式系统中的每个独立模块进行单元测试,确保每个模块的功能正确无误。
  2. 集成测试

    在分布式系统的所有组件间进行集成测试,确认组件间的接口和通信协议正确运作。例如,测试服务间的RPC调用、消息队列的发布与订阅、数据库的读写操作等。
  3. 网络模拟与故障注入

    • 利用网络模拟工具(如Chaos Monkey、Simian Army等)模拟网络延迟、丢包、分区等故障,测试系统的容错性和弹性。
    • 故障注入测试,如杀死某个节点、模拟网络分区、磁盘故障等,验证系统能否在部分组件失效的情况下维持服务。
  4. 性能测试

    • 使用负载测试工具(如JMeter、Locust、Gatling等)模拟大规模并发请求,评估系统的性能极限,包括吞吐量、响应时间、并发用户数等。
    • 执行压力测试,观察在高负载下的系统行为,包括资源利用率、排队延迟、降级策略的有效性等。
  5. 数据一致性测试

    • 对于分布式数据库或存储系统,确保在分布式环境下数据的一致性,包括最终一致性、因果一致性等各种一致性模型的验证。
    • 使用数据一致性检查工具或编写专用测试脚本,确保在并发写入、读取和更新操作后,数据状态满足预期。
  6. 安全性测试

    测试系统的身份验证、授权机制以及数据加密等安全措施,确保系统在分布式环境下的安全性。
  7. 容灾恢复测试

    • 测试系统的备份恢复机制,包括数据备份的完整性、恢复速度和恢复后的系统状态。
    • 演练灾难恢复方案,如节点故障后自动切换、数据迁移、服务重启等。
  8. 混沌工程

    通过刻意引入混乱来验证分布式系统的韧性,比如随机终止服务、关闭数据中心节点等,看系统如何自我恢复并保持服务可用。
  9. 日志和监控分析

    通过监控系统在测试期间的行为,分析日志信息,确保在各种场景下系统的表现符合预期,并能及时发现问题。
  10. 端到端测试

    从客户端的角度出发,模拟真实用户场景,验证整个分布式系统在端到端流程中的正确性和性能。

        测试分布式系统时,通常需要结合自动化测试工具、分布式协调服务(如Zookeeper、etcd等)、容器化和虚拟化技术等多种手段,以确保系统在各种复杂情况下的稳定性和可靠性。同时,也要关注系统的可扩展性、资源调配和管理等方面的问题。

2. 什么场景下你会在两个系统中采用异步通信机制?

在以下场景下,通常会选择在两个系统之间采用异步通信机制:

  1. 高延迟操作: 当一个系统调用另一个系统的服务时,如果该服务执行时间较长(如数据库查询、大文件传输、复杂的后台计算任务等),为了不阻塞调用方的执行流程,可以采用异步通信,调用方在发出请求后立刻返回,待服务方完成任务后通过回调、消息队列或其他机制通知结果。

  2. 分布式系统: 在分布式系统架构中,多个系统组件之间需要相互通信。如果直接同步通信会导致耦合度增加和响应延迟,就可以采用异步消息队列进行解耦,例如使用RabbitMQ、Kafka等中间件,这样系统间的交互变得更加灵活且健壮。

  3. 高并发场景: 当系统需要处理大量并发请求时,同步通信可能会导致资源争抢和性能瓶颈。通过异步通信,请求可以被迅速接收并放入队列中排队处理,从而提高系统的吞吐量和响应能力。

  4. 服务间松耦合: 在微服务架构中,服务间的通信通常需要保持松耦合。异步通信可以让各个服务独立扩展和部署,每个服务只需要处理消息队列中的任务,而不需要关心其他服务的实时状态。

  5. 故障恢复和幂等性: 异步通信机制支持重试和幂等性处理,当某个系统出现故障时,消息可以被暂时存储并在服务恢复后继续处理,确保数据的最终一致性。

  6. 异步事件驱动架构: 在事件驱动架构中,事件发生后产生消息并异步传递给感兴趣的消费者,例如用户注册后,系统需要发送邮件通知、更新缓存等多个操作,这些操作可以通过异步消息分别进行。

  7. 批处理和定时任务: 当系统需要定期或批量处理数据时,例如每天凌晨执行的报表生成、数据库同步等任务,可以使用异步机制安排任务执行,避免在高峰时段影响系统性能。

  8. 移动和Web应用: 移动和Web应用中,前端用户界面需要保持流畅,对于耗时的操作如保存数据到云端、执行后端复杂计算等,可以先异步发送请求,让用户界面不受阻塞,同时提升用户体验。

3. 远程过程调用的通用缺点是什么?

        远程过程调用(Remote Procedure Call, RPC)作为一种让开发者像调用本地函数一样调用远程机器上函数的技术,虽然极大地简化了分布式系统中的通信过程,但也有其通用的缺点,主要包括以下几个方面:

  1. 同步阻塞问题

    同步RPC调用时,调用方在等待远程过程执行完成及返回结果期间会阻塞,无法执行其他任务,降低了系统的整体响应速度和并发能力。
  2. 网络延迟和不可靠性

    RPC依赖于网络连接,因此易受到网络延迟、丢包、拥塞等问题的影响,这可能降低系统的可用性和响应速度。
  3. 紧耦合与透明性带来的复杂性

    RPC使得调用者对底层网络和协议的细节相对“透明”,但也意味着当网络拓扑结构变化、服务迁移或升级时,客户端可能需要重新配置或调整代码以适应新的环境。
  4. 安全性问题

    RPC通常需要跨越安全边界进行通信,如果没有恰当的安全控制,可能会暴露敏感信息,成为攻击的目标。
  5. 容错与可靠性不足

    如果服务器崩溃或网络中断,同步RPC调用可能会失败,导致整个业务流程终止。缺乏内置的错误恢复机制需要额外的设计和开发工作。
  6. 不支持异步操作和通知

    传统的RPC往往仅支持请求/响应模式,不适用于那些需要异步处理、通知或发布/订阅模型的场景,尽管现代RPC框架很多已经支持异步调用。
  7. 版本控制和兼容性挑战

    随着时间推移,服务接口发生变化时,需要谨慎地管理和更新不同版本之间的兼容性,否则可能导致服务调用失败。
  8. 资源消耗

    远程调用相比本地调用通常需要更多资源,包括CPU、内存和网络带宽,尤其是在高并发场景下,服务器端可能面临更大的压力。

        针对上述一些问题,现代分布式系统设计往往会结合异步消息队列、服务发现机制、负载均衡、断路器、重试策略等多种手段来改善RPC的性能和稳定性。

4. 如果你为了可扩展性和鲁棒性而构建一个分布式的系统,分别在封闭安全的网络环境情况下,和地理上的位置不同但是网络环境不是封闭和安全的情况下,你会考虑什么不同的事情?

        在构建一个分布式的系统时,为了实现可扩展性和鲁棒性,不论是在封闭安全的网络环境还是在地理位置分散且网络环境不封闭不安全的情况下,都需要考虑以下关键因素。但针对这两种不同环境,侧重点和策略会有所不同:

封闭安全的网络环境:

  1. 可扩展性

    • 水平扩展:设计系统时采用水平扩展模型,如通过添加更多的服务器节点来增加处理能力和存储容量。
    • 负载均衡:在内部网络中部署负载均衡器,确保流量均匀分配到各个节点,可根据需要动态添加或移除节点。
    • 分布式存储:使用分布式数据库或文件系统,如HDFS或分布式NoSQL数据库,以支持数据的水平扩展。
    • 微服务架构:将系统拆分为一组小型、独立部署的服务,便于独立扩展和管理。
  2. 鲁棒性

    • 冗余与故障转移:在内部网络中实施冗余机制,如使用主备服务器,或者在数据库层面实现主从复制和故障切换。
    • 监控与告警:建立全面的监控系统,包括系统健康检查、性能监控和日志记录,确保在问题发生时能够快速响应。
    • 内部网络管理:虽然网络环境被认为是封闭和安全的,但仍需确保网络架构的健壮性,包括足够的带宽、路由策略和网络安全策略。

地理位置分散且网络环境不封闭不安全的情况:

  1. 可扩展性

    • 全球分布式部署:考虑在多个地区部署服务节点,利用CDN(Content Delivery Network)或边缘计算节点靠近用户,减少延迟。
    • 分布式服务发现与注册:采用服务网格(如Istio)或服务注册中心(如Eureka、Zookeeper),确保在全球范围内都能找到并调用服务。
    • 数据同步与一致性:对于分布式数据库,确保跨地域的数据同步机制,考虑使用强一致性或最终一致性模型。
  2. 鲁棒性

    • 网络安全性:强化网络安全措施,如使用SSL/TLS加密通信、防火墙、访问控制列表等,防止数据泄露和恶意攻击。
    • 网络容错:设计网络通信机制时考虑到丢包、延迟和网络分区等问题,实现重试、断路器、超时等容错策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

江科大/江协科技 STM32学习笔记P8

文章目录 按键控制LED&光敏传感器控制蜂鸣器1、按键控制LED.cKey.c读取GPIO端口的库函数main.c 2、光敏传感器控制蜂鸣器Buzzer.cLightSensor.cmain.c 按键控制LED&光敏传感器控制蜂鸣器 1、按键控制 用LED.c和LED.h两个文件封装LED的驱动程序,LED.c存放驱…

linux离线安装mysql8(单机版)

文章目录 一、检查服务器是否有残留mysql资源,有的话就全删除1.1、查询mysql已安装的相关依赖:1.2、查找含有MySQL的目录 二、安装2.1、上传mysql安装包到文件夹下并解压2.2、移动及重命名2.3、mysql用户2.4、配置mysql所需的my.cnf文件2.5、给my.cnf配置…

JVM之经典垃圾回收器

1.垃圾回收器的分类 处理范围划分: 新生代垃圾回收器:serial、parNew、parallel scavenge; 老年代垃圾回收器:serial Old、parallel Old、CMS; 整堆收集器:G1、ZGC; 2.Serial GC Serial是单…

java单元测试:Mockito常用技巧

Mockito是Java中最流行的Mock框架之一,主要用于创建和配置模拟对象(Mock),以测试代码的行为。Mockito使得单元测试更加简单和可控,特别是在需要隔离外部依赖的情况下。 1. Mockito简介 1.1 什么是Mockito Mockito是一个…

QGC二次开发入门教程(一):课程大纲

文章目录 前言一、课程大纲二、修改软件名称三、修改软件图标四、官方QGC中文版BUG修复五、汉化六、修改商标七、添加信号-槽八、添加QML和C交互九、MAVLINK的解析与发送十、换地图十一、添加自定义mavlink消息十二、在主工具栏添加一个自定义图标十三、解析自定义mavlink数据并…

SVN文件夹没有图标(绿钩子和红感叹号)

3分钟教会你解决SVN文件夹没有绿勾和红色感叹号的问题_svn文件被改动过不显示红色-CSDN博客https://blog.csdn.net/weixin_43382915/article/details/124251563 关于SVN状态图标不显示的解决办法(史上最全) - 简书 (jianshu.com)https://www.jianshu.com/p/92e8e1f345c0

华为OD机试D卷 --剩余银饰的重量--24年OD统一考试(Java JS Python C C++)

文章目录 题目描述输入描述输出描述用例题目解析java源码js源码python源码c源码c++源码题目描述 有 N 块二手市场收集的银饰,每块银饰的重量都是正整数,收集到的银饰会被熔化用于打造新的饰品。 每一回合,从中选出三块最重的银饰,然后一起熔掉。 假设银饰的重量分别为 x…

人工智能与机器学习原理精解【6】

文章目录 数值优化基础理论凹凸性定义在国外与国内存在不同国内定义国外定义总结示例与说明注意事项 国内凹凸性二阶定义的例子凹函数例子凸函数例子 凸函数(convex function)的开口方向凸函数的二阶导数凸函数的二阶定义单变量函数的二阶定义多变量函数…

微信小程序下载预览PDF并且分享出去

wx.downloadFile({url: url, //要预览的PDF的地址// filePath: ${wx.env.USER_DATA_PATH}/${docName}.pdf, // 添加后缀,可以分享出去success: function (res) { console.log(res);if (res.statusCode 200) { //成功const { filePa…

基于springboot+vue+uniapp的网上花店小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

DNS主从服务架构(thirteen day)

回顾 编号主机名IP地址说明修改1web服务器192.168.1.11发布部署web服务发布了一个nginx web服务2DNS服务器192.168.1.22用于解析域名和IP地址 1、安装bind 2、配置一个conf,zones,zone 3、检查了3个文件 4、启动 3client主机192.168.1.33用于模拟客户机…

FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频

​ FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频 1、前言2、大概流程3、测试环境4、安装流媒体服务器5、设置流媒体服务器接口6、简单写个web接口7、测试一下1、web播放在线播放器1在线播放器2本地video控件 2、vlc播放vlc播放rtmpvlc播放rtsp 8、总结 1、前…

https改造-python https 改造

文章目录 前言https改造-python https 改造1.1. https 配置信任库2. 客户端带证书https发送,、服务端关闭主机、ip验证 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每…

git操作的一些备忘录

1.回退本地合并 git merge --abort 2.撤销上一次的提交 方法一:(已经提交到git线上仓库了,git reset操作,会把之前提交的都删除,感觉有点危险) 想要让Git回退历史,有以下步骤: 使用git log命令&#xff0c…

SpringSecurity--DelegatingFilterProxy工作流程

什么是 DelegatingFilterProxy? DelegatingFilterProxy 是 Spring 提供的一个特殊的过滤器,它起到了桥梁的作用,可以让你在 Spring 容器中管理 Servlet 容器中的过滤器。 为什么需要 DelegatingFilterProxy? 通常情况下&#x…

【项目日记(三)】梦幻笔耕-博客模块

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多项目内容 目录 1.前言2.获取博客列表3.获取博客详情4.新增博客5.更新博客6.删除博客7.拦截器9.统一处…

日常开发记录分享-SQL中的partition分区功能使用

文章目录 需求来源实现思路实施SQL 语句结构内部查询(子查询)外部查询 结果 partition的升级使用解释 验证一下看看分区 分区的一些操作1. 普通查询2. 分区表上的查询优化3. 插入数据4. 删除分区中的数据5. 分区维护操作添加新的分区删除分区重组分区 6.…

银河麒麟服务器V10 SP3 安装人大金仓V009R001C001B0030

原文链接:银河麒麟服务器V10 SP3 安装人大金仓V009R001C001B0030 Hello,大家好啊,今天给大家带来一篇关于在银河麒麟服务器V10 SP3上安装人大金仓V009R001C001B0030的文章。人大金仓是国内知名的数据库管理系统,它在高性能、高可靠…

AWS全服务历史年表:发布日期、GA和服务概述一览 (全)

我一直在尝试从各种角度撰写关于Amazon Web Services(AWS)的信息和魅力。由于我喜欢技术历史,这次我总结了AWS服务发布的历史年表。 虽然AWS官方也通过“Whats New”发布了官方公告,但我一直希望能有一篇文章将公告日期、GA日期&…

【C++】标准库:介绍string类

string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数(constructor)2.析构函数(destructor)3.运算符重载(operator)1.operator2.operator[]3.operator4.operator 4.string的四…