【C++拓展(一)】后端开发常用的技术栈

news/2024/9/17 2:09:44/ 标签: c++, 后端, 架构, 服务器, 高性能

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习C++
  🔝🔝


C++拓展

  • 1. 前言
  • 2. 语言层面
  • 3. 设计模式层面
  • 4. 开源组件层面
    • 4.1 RPC框架
    • 4.2 web应用框架
    • 4.3 缓存组件
    • 4.4 任务队列
    • 4.5 搜索组件
  • 5. 开源数据库层面
  • 6. 开源存储系统层面
  • 7. 高性能服务器层面
  • 8. 总结以及拓展

1. 前言

前端时间一直在忙秋招, 没有时间写博客, 这篇文章将从语言, 设计模式, 开源组件, 开源数据库, 开源存储系统, 以及高性能服务器的角度, 带大家剖析一下, 校招生的拓展知识应该从哪些方面去学习

注: 本篇文章仅是个人观点, 文章中没有提到的技术不代表他不常用(可能是我太菜了没听过). 且本篇文章主要针对互联网的后端开发岗位而言,如果你学完了基础的知识,并且不知道如何继续学习什么东西, 希望这篇文章能对你有所帮助


2. 语言层面

我是学C++出生的, 据我所知, 现在的很多公司的后端技术栈中, 用到C++的并不多, 只有涉及到推广搜, 高性能服务器, 智能驾驶这一类对性能有极高要求的场景, 会使用到C++. 大部分场景用Java, GO, python就能解决问题

以下是我对语言层面的理解:

个人拙见,C++比较适合作为计算机初学者学习整个计算机体系内容的母语, 由于C++涉及到很多底层的优化和知识, 并且和服务器紧密联系, 对于我们的整个大厦的地基建造是大有好处的. 如果一上来就学习GO或python, 有一些底层的知识是空缺的, 对未来的发展不太友好. 其次, 掌握好C++后, 去学习Java或GO我认为是有必要的(毕竟语言转换成本不高). 真正到了公司后, 什么场景下适合用什么语言就使用什么语言, 而不是看你会什么语言

综上所述: 对于后端开发而言, 语言并不是最大的问题, 只要掌握好一门语言, 懂得底层原理, 对于校招生来说就很厉害了


3. 设计模式层面

现在市面上你会看见许多的设计模式, 什么工厂模式, 观察者模式…设计模式这么多, 这些我们都需要完全掌握吗?设计模式这么多, 应该怎样使用?怎样学习?

以下是我对设计模式的理解:

个人拙见, 设计模式不用都去学习一遍, 其实我们要做的是, 真正的理解设计模式的精髓: 对拓展开发, 对修改关闭这句话. 并且在我们使用设计模式时, 不应该看我们的项目场景能不能照搬某个设计模式的思路, 我认为正确的思考方式是: 先思考我们的项目有哪些地方可以被抽象出来, 再结合设计模式的精髓, 设计出自己的一个代码框架, 最后再根据此框架去查看它属于哪个设计模式. 这样对我们的技术能力会有很大的帮助

综上所述: 对于设计模式而言, 要摸透它的精髓, 并且经过实战不断的积累经验


4. 开源组件层面

4.1 RPC框架

RPC调用由于其超高的性能, 在公司内网, 或微服务架构中被广泛使用, 对于RPC的内容, 我推荐大家去了解一下以下几个知识点:

  • RPC是什么?
  • 为什么有了HTTP还要有RPC?
  • 什么场景下用RPC,什么场景下用HTTP?
  • protobuf是什么?
  • 为什么PB比json和xml快?
  • 有哪些常用的RPC框架?(实操RPC调用)

4.2 web应用框架

web应用框架, 诸如spring boot,node.js,可以快速用于搭建项目的结构, 以及配置项目的环境等等, 使用一些应用框架能极大的提高后端的研发效率,有兴趣可以下来细究


4.3 缓存组件

公司比较常用的缓存组件: redis,memcached. 它们常用于数据库查询优化和系统性能优化(如存储热点数据),对于缓存组件问题, 比较热门的是与redis相关的, 可以了解以下几个知识点:

  • redis是什么? 为什么要有它?
  • redis常用于什么场景?
  • redis集群架构通常是如何设计的?
  • redis是如何解决, 缓存击穿,缓存穿透,缓存雪崩等问题的?

4.4 任务队列

在公司内面对高并发场景时, 常常会使用任务队列, 也就是消息队列, 消息队列通过用于异步解耦, 削峰填谷的场景. 比较常用的消息队列有: Kafka,RockMQ,RabbitMQ. 对于消息队列, 可以了解以下几个知识点:

  • 消息队列是什么? 为什么要有它?
  • Kafka通过什么策略来实现: 高性能, 高可用, 高拓展的?
  • 为什么RockMQ抄袭了Kafka的设计, 吞吐量却没有Kafka高?

4.5 搜索组件

在面对大量数据的海量查询或海量数据的实时分析时, 经常会用到搜索组件Elasticsearch(ES)或solr, 如电商平台搜索商品, 社交平台搜索博主. 对于搜索组件, 你可以了解一下以下的问题:

  • ES是什么? 什么场景下会使用到?
  • ES是通过哪些策略来保证它搜索效率的?
  • 什么时候用ES,什么时候用数据库?

5. 开源数据库层面

首先, 先对数据库进行一个分类: 关系式数据库, 非关系式数据库, 行式存储数据库, 列式存储数据库. 比较常见的数据库有: MySQL, 行式存储的关系式数据库, postgresql,行式存储的关系式数据库, mongodb, 行式存储的非关系式数据库, click house, 列式存储的关系式数据库

对于数据库, 可以了解以下知识点:

  • 关系式数据库和非关系式数据库有什么区别?
  • 行式存储和列式存储有什么区别?
  • 怎样根据业务选择不同的数据库?
  • postgresql对比MySQL有哪些优势?
  • 为什么postgresql的查询效率比MySQL高?
  • mongodb在什么场景下使用的较多?
  • click house是如何保证查询效率的?
  • LSM tree是什么? 有什么用?
  • MySQL的索引底层是什么?
  • MySQL的事务是什么?
  • MySQL的事务的不同隔离级别的实现原理?
  • MVCC是什么? 使用场景有哪些?

其实还有很多优秀的数据库, 但是对于数据库而言, 并不是让我们学习所有的数据库种类, 旨在让大家了解这些优秀的数据库的底层是如何设计的才能做到如此优秀的性能, 才会这么多人去用


6. 开源存储系统层面

存储组件有许多使用场景, 比如: 文件存储场景: 企业文档管理, 静态资源管理等. 对象存储场景: 云存储服务, 大数据存储, 音视频图片存储等. 对于存储系统, 可以了解一下以下几个知识点:

  • 为什么要有存储组件? 直接使用数据库不行吗?
  • 业内有哪些常用的存储组件?(分种类)
  • 什么场景下应该选择什么类型的存储组件?
  • 阿里巴巴和百度都有大规模的Hadoop集群,它们的用处是什么?为什么要选择Hadoop?
  • 一些常用的存储组件, 如Amazon,Hadoop,它们是怎样做到高拓展, 高可用的?

7. 高性能服务器层面

后端开发往往是和服务器打交道, 所以对于服务器的技术栈也要过硬! 对于服务器而言, 老生常谈的问题无非就是: 怎样做高并发?怎样做低延迟? 这里我抛出几个问题留给同学们思考一下:

  • 高性能服务器的设计需要考虑哪些点?
  • Reactor模式是什么? 有几种实现方式? 哪种方式并发量最高?
  • 什么场景下用epoll实现高并发? 什么场景下用AIO实现高并发?
  • 当一台机器扛不住压力时, 应该怎么办?(负载均衡)
  • 怎样设计项目的架构, 使得项目既能处理大量请求, 又能做好容灾处理?
  • 怎样优化服务器性能?(从算法层面, 并发层面, 网络层面, 数据库层面)
  • 最后推荐大家阅读: <<高性能服务器的设计>>一书,后端程序员的宝典

8. 总结以及拓展

当然, 对于校招的后端技术栈学习远远不止于此, 像C++中的一些开源组件, 如TCmalloc,ABseil-CPP,Folly. 以及C++中关于编译的组件: cmake, bazel. 当然还有容器化技术: docker, k8s等, 都值得我们去探讨, 去学习.

最后我想告诉大家的是, 学习以上所有的内容并不是为了应付面试的, 而是在你学习这些优秀思想的的同时, 你的认知, 你的技术能力会得到质的提升, 当你下次再遇见相似的问题, 曾经学过的知识会浮现在你的脑海, 助你度过难关. 所以, 加油吧少年, 做后端程序员一定要对技术保持热爱, 这才是我们工作,学习的动力.

希望我的文章能对你有所帮助

  • 最后在此特别鸣谢我在实习期间的一位同事davia,davia让我学到了后端中很多常用且优秀的知识,对我个人能力的提升有很大帮助!

http://www.ppmy.cn/news/1522491.html

相关文章

「Qt Widget中文示例指南」如何实现一个系统托盘图标?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 System Tray Icon&a…

基础学习之——Apache Spark

Apache Spark是一种开源的大数据处理框架&#xff0c;它提供了快速、通用和可扩展的大数据分析和处理功能。Spark可以在大规模数据集上进行高速计算&#xff0c;并且可以与多种数据源和工具进行集成。 Spark的基本概念包括&#xff1a; 弹性分布式数据集&#xff08;Resilient…

【LeetCode 121】买卖股票的最佳时机

1. 题目 2. 分析 如果当前的价格比之前买入的价格要低&#xff0c;那么我们就“逢低买入”&#xff0c;更新买入的价格&#xff0c;因为在此后的每一天里&#xff0c;当前的价格与之前的买入价格相比是更优解。 如果读者对单调队列有接触&#xff0c;可以看到这一步的核心思想…

iOS P8证书推送测试

最近在配合服务端人员调试相关的 APNS auth key 推送的问题&#xff0c;相比于苹果的P12证书的推送&#xff0c;P8证书的推送显得方便很多&#xff0c;P8的优势在于简单&#xff0c;安全 容易生成 最重要的是不会过期。 现在我们来看下测试具体流程&#xff1a; 方法一 地址…

掌握Hive函数[1]:从基础到高级应用

目录 函数简介 单行函数 算术运算函数 数值函数 字符串函数 日期函数 流程控制函数 集合函数 案例演示 函数简介 Hive将常用的逻辑封装成函数供用户使用&#xff0c;类似于Java中的函数。这样做的好处是可以避免用户反复编写相同的逻辑代码&#xff0c;可以直接调用这些函数。…

2024 RustChinaConf 赞助商介绍

2024 RustChinaConf 得到了行业各界的广泛支持&#xff0c;在此向以下赞助商表示感谢&#xff01; 非凸科技 非凸科技是一家全栈使用Rust的金融科技公司&#xff0c;致力于为券商、私募、公募等金融机构及个人投资者提供一站式数智交易领域服务解决方案。作为本次大会的钻石赞助…

jmeter之ForEach控制器使用

ForEach控制器作用&#xff1a; 一般和用户自定义变量或者正则表达式提取器配合使用&#xff0c;读取返回结果中一系列相关的变量值&#xff0c;该控制器下的取样器都会被执行一次或多次&#xff0c;每次读取不同的变量值(类似python当中的for语句,用来遍历操作) 本节代码已上…

币安/欧易合约对冲APP系统开发

币安合约对冲系统开发是一个复杂且专业的过程&#xff0c;它涉及到多个方面的技术和策略。以下是对币安合约对冲系统开发的一个概述&#xff1a; 一、系统概述 币安合约对冲系统是一种利用币安交易所提供的合约交易功能&#xff0c;通过同时建立多头和空头仓位来减少或消除市…

hutool 集合相关交集、差集

开发过程中会遇到集合之间的对比之类的需求&#xff0c;之前经常会自己写个工具类来实现&#xff0c;目前hutool可以帮助我们解决很多问题&#xff0c;接下来我们就来实践下。 相关jar包 <dependency><groupId>cn.hutool</groupId><artifactId>hutool…

Python办公自动化案例

文章目录 系列文章办公自动化案例案例1&#xff1a;批量重命名文件案例2&#xff1a;Excel数据自动筛选案例3&#xff1a;PDF文件合并案例4&#xff1a;批量发送电子邮件案例5&#xff1a;日程安排提醒案例6&#xff1a;CSV文件数据统计案例7&#xff1a;Word文档生成案例8&…

Day18_0.1基础学习MATLAB学习小技巧总结(18)——MATLAB绘图篇(1)

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 参考书目&#xff1a;《MATLAB基础教程 (第三版) (薛山)》 之前的章节都是…

前端vue项目服务器部署(docker)

前端vue项目服务器部署(docker) 步骤 1: 导入 Nginx Docker 镜像 1、上传 Nginx Docker 镜像 将你的nginx-alpine.tar包上传到服务器上。假设路径为 /var/v3-admin-vite/nginx-alpine.tar。 scp -r "C:\Users\86184\Desktop\v3-admin-vite" root110.40.179.182:/…

第十五届蓝桥杯 Python 省赛题目及解析

第十五届蓝桥杯 Python 省赛题目及解析 选择题 1. 运行下面程序&#xff0c;输出的结果是&#xff08;&#xff09;。 s ‘py’ print(‘t’.join(s)) A、tpyB、ptyC、tptyD、tptyt 正确答案&#xff1a;B 答案解析&#xff1a; join() 方法是字符串的一个方法&#xff0c;…

数据分析 设备一个月以来的参数变化

1数据预处理 import pandas as pd import glob import os# 读取所有CSV文件并合并为一个DataFrame path path_to_your_csv_files/ # CSV文件的文件夹路径 all_files glob.glob(os.path.join(path, "*.csv"))df_list [] for file in all_files:df pd.read_csv(f…

FPGA进阶教程16 同一块FPGA的两个网口实现arp自通信

本项目使用同一个FPGA的两个网口进行千兆以太网的arp自动绑定 目的是为了以后实现两个FPGA之间进行以太网数据的交互 起因:最近公司画了一块板子,上面有两个网口,市面上常见的项目都是将FPGA与PC端实现arp的自动绑定和UDP数据的回环,很少实现两块FPGA之间的以太网数据通信…

网络学习-eNSP配置ACL

AR1路由器配置 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 192.168.2.254 24 …

chunk-vendors.js 文件过大导致页面加载缓慢解决方案

1、路由懒加载 在 Webpack 中&#xff0c;我们可以使用动态 import语法来定义代码分块点 (split point)&#xff1a; import(./Foo.vue) // 返回 Promise如果您使用的是 Babel&#xff0c;你将需要添加 syntax-dynamic-import 插件&#xff0c;才能使 Babel 可以正确地解析语…

Unity制作更换字体的插件

目录 1.前置知识 1.1 EditorWindow 1&#xff09;目的 2&#xff09;使用方式 1.2 OnGUI() 1&#xff09;目的 2&#xff09;使用方式 1.3 AssetDatabase 1&#xff09;目的 2&#xff09;使用方式 1.4 PrefabUtility 1&#xff09;目的 2&#xff09;使用方式 2…

GNU/Linux - Open函数使用的O_CLOEXEC flag

在 Linux 中&#xff0c;“O_CLOEXEC ”标志与 “open ”系统调用一起使用&#xff0c;用于指定在使用 “exec ”系列函数&#xff08;如 “execve”、“execl ”等&#xff09;执行新程序时&#xff0c;“open ”返回的文件描述符应自动关闭。 In Linux, the O_CLOEXEC flag i…

C++(多态性)

多态 多态是指同样的消息被不同类型的对象接收时导致不同的行为。所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。 最简单的例子就是使用同样的运算符&#xff0c;可以实现整数与整数之间&#xff0c;浮点数与浮点数之间的加法运算。 多…