当前位置: 首页 > news >正文

19-02 基于业务量级的架构技术选型演进

从零开始——单服务应用

单体应用技术选型

  • (GitHub、Gitee…)搜索是否有线程的产品
  • 用最熟悉的技术,最快的速度上线
  • 如果有经费:考虑商业化解决方案

个人小程序怎么做技术选型的

  • 搜索是否有快速搭建下程序的软件
  • 技术选型
    • 后端技术选型
      • 用最熟悉的技术,达到最快的开发速度
      • MySQL、MyBatis、SoringBoot
    • 前端技术选型
      • 在这里插入图片描述

应用服务、数据服务分离

  • 企业级应用的起步阶段
  • 两个目的
    • 选择合适的技术实现项目的落地
    • 为项目未来的发展方向定好基调
    • 在这里插入图片描述

要考虑的问题

  • 运行平台的选择
  • 选择商业解决方案还是开源解决方案
  • 确定项目的研发模式
  • 确定具体使用的技术

事半功倍——引入缓存系统

要考虑的问题

  • 在哪个位置使用缓存
  • 采用什么类型的缓存
  • 采用那种缓存模式
  • 具体用什么缓存组件

缓存位置

  • 客户端缓存
    • 浏览器中的缓存
    • APP缓存
  • 网络中缓存
    • 代理服务器缓存
    • CDN缓存
  • 服务端缓存

如何确定缓存的位置

  • 没有性能瓶颈不考虑,那里慢就在那里用缓存

缓存类型

  • 内存缓存
    • 速度非常快,数据可能会丢失
    • 适用于速度要求非常高,容忍数据丢失的场景
    • 堆内缓存
      • 优点:
        • 无需序列化、反序列化
        • 性能很好
      • 缺点:
        • 会对GC造成影响
        • 容量受限于堆内存的大小
        • 一般为软引用或弱引用存储
      • 堆内缓存适用场景
        • 存储非常热的数据
  • 磁盘缓存
    • 性能比内存缓存差,数据不会丢失
    • 适用于需要持久化的场景

负载均衡

在这里插入图片描述

基于DNS的负载均衡

  • 在DNS服务器上为多个地址配置相同的解析记录
  • 优点:
    • 把负载均衡的工作交给了DNS服务器,减少了网站管理的维护工作
    • 技术实现比较灵活、方便、简单易行、成本低
    • 适用面广,能适用于大多数TCP/IP应用
  • 缺点:
    • 一般不能反映服务器当前运行状态
    • 某台服务器下线之后,即使修改了DNS记录,要想让记录生效可能需要很长时间
    • 保证DNS解析指向的目标地址高可用、地址不会经常修改
    • 一般来说,大型网站会用DNS作为一级负载均衡
      • DNS指向的IP,对应的并不是一台机器,而是高可用的服务器集群
      • dig命令可查询记录

基于反向代理的负载均衡

  • 请求经过反向代理,由反向代理组件提供负载均衡算法,计算出一个服务器地址返回
  • 代表实现
    • NGINX
    • HAProxy
    • Apache

互联网项目负载均衡器演变的典型过程(经验)

  • 项目初期:NGINX
  • 中期:结合Keepalived实现NGINX的高可用
  • 之后,再搭载LVS或F5,从而扩展多个NGINX
  • 如果一个LVS集群顶不住的饿话,会再结合DNS扩展LVS

有状态VS无状态

  • 状态:服务器是否要存储用户的登录状态
  • 服务器端是否要维护用户的会话

有状态

粘性会话

  • 当客户端在一台Web Server上登录后,以后的请求都会绑定到该Web Server实例
  • 在这里插入图片描述
  • 优缺点
    • 无需引入额外组件
    • 实现简单
    • 存在单点问题:需要额外实现故障转移
    • 可能有不均衡问题

会话共享

在这里插入图片描述

  • 使用session保持会话,多个应用实例存储到一个中央存储中去
  • 优缺点
    • 需要额外引入组件,即使任意Web应用崩溃依然可用
    • 但Session Store一旦崩溃,所有会话都会丢失

会话复制

在这里插入图片描述

  • Web Server实例之间互相复制会话
  • 优缺点
    • 无需实现故障转移
    • 无需引入额外组件
    • 会话复制消耗带宽和内存

无状态

  • 服务器端不去记录用户的登录状态:服务器端不再去维护会话
  • 用户登录时,办法一个token,这个token一般是加密的
  • 之后每个请求都会带上这个token(放在header、URL参数、Cookie中传递)
  • 有状态的缺点 = 无状态的优点
  • 无状态的缺点:
    • 一旦把token颁发给用户,就很难控制它的下线时间
      在这里插入图片描述

有状态 vs 无状态

在这里插入图片描述

读写分离

在这里插入图片描述

CDN

  • 静态文件:效果非常好
  • 动态数据:效果不佳
  • 动态内容静态化
  • 动静分离

CDN组成原理

在这里插入图片描述

CDN技术选型要考虑的问题

  • 自建 or 商用
    • 优先使用商用CDN
    • 当商用CDN满足不了业务需求,顶不住的时候,再考虑自建
    • 原因:自建很不划算
    • 小米、快手、大众点评 => 都是商用CDN
  • 如何挑选CDN
    • 速度
      • 节点数
      • 带宽能力
      • 节点分布
    • 功能
      • 加速优化

        • DNS优化
        • 在这里插入图片描述
      • 监控统计

        • 实时监控:点击率、命中率、占用流量
        • 访问日志监控
      • 安全性

        • 防盗链
        • IP黑白名单
    • 价格
      • 按带宽峰值计费
      • 按流量计费

全文检索

  • 减轻了数据库的查询压力
  • 提升应用性能,提高用户体验
  • 实现全文检索的五种路径
    • 使用数据库内置的全文搜索能力
    • 使用和数据库深度集成的全文搜索
    • 使用开源全文所搜引擎
    • 使用商用全文搜索引擎
    • 自研全文搜索引擎

使用数据库内置的全文搜索能力

在这里插入图片描述

  • 优点
    • 学习成本低
    • 方便
    • 无需引入新的组件,保持了架构上的简单性
  • 缺点
    • 搜索引擎没有和数据库分离,数据库的职责不够单一
    • 全文搜索的能力受限于数据库的查询能力
  • 不建议使用

使用和数据库深度集成的全文搜索

  • 代表实现:Sphinx
    • 可独立运行
    • 可以和MySQL、PostgreSQL深度集成
  • 选型建议
    • Sphinx在业界非常流行
    • 如果看中运维成本,同时对扩展性没有太高要求,可以尝试
  • Tips
    • Sphinx相对于其他全文搜索引擎来说,功能并不是很强
    • 国内文档不多
    • 越来越多的企业在从Sphinx往第三种模式迁移

使用开源全文所搜引擎

  • 目前最主流的方式
    • 选择丰富
    • 扩展性非常好
  • 缺点
    • 需要独立部署搜索引擎
    • 需使用搜索引擎特有语法操作搜索引擎
      • 既是缺点也有优点,缺点在于有学习成本,好处就是能够支持更加复杂的查询;另外像Elasticsearch之类的搜索引擎既支持DSL,也支持SQL
    • 搜索引擎和数据库是独立的两个软件,需要考虑数据一致性
      • 借助logstash-input-jdbc之类的插件同步
      • 应用写入数据库的同时也写到搜索引擎
  • 选型建议:可以放心使用

使用商用全文搜索引擎

  • 阿里云Open Search
  • 微软的Microsoft Azure Search
  • 成功案例不多
  • 选型建议
    • 商用产品有良好的服务,省事、省心,可以放心使用
    • 要考虑商用产品封闭性所带来的影响:例如厂商很难根据你的特殊需求专门定制

自研全文搜索引擎

  • 阿里、苏宁、万得资讯、东方财富
  • 优点:核心技术在自己手上,有更好的灵活度,遇到问题可以从底层调整与优化
  • 缺点:遂团队的技术要求会比较高,成本也非常高

在这里插入图片描述

相关文章:

19-02 基于业务量级的架构技术选型演进

从零开始——单服务应用 单体应用技术选型 (GitHub、Gitee…)搜索是否有线程的产品用最熟悉的技术,最快的速度上线如果有经费:考虑商业化解决方案 个人小程序怎么做技术选型的 搜索是否有快速搭建下程序的软件技术选型 后端技…...

Server - 高性能的 PyTorch 训练环境配置 (PyTorch3D 和 FairScale)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130863537 PyTorch3D 是基于 PyTorch 的 3D 数据深度学习库,提供了高效、模块化和可微分的组件,以简化 3D 深度学…...

小猫踩球-第14届蓝桥杯省赛Scratch中级组真题第2题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第137讲。 小猫踩球,本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第2题&#xf…...

嵌入式开发从入门到精通之第二十一节:三轴加速度传感器(BMA250E)

目录 1、工作模式 2、中断支持的模式 2.1 新数据的产生 2.2 任何斜率的变化的监测...

代码随想录算法训练营第三十六天|435. 无重叠区间 763.划分字母区间 56. 合并区间

目录 LeeCode 435. 无重叠区间 LeeCode 763.划分字母区间 LeeCode 56. 合并区间 LeeCode 435. 无重叠区间 435. 无重叠区间 - 力扣(LeetCode) 思路1:按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉…...

shell 脚本

Shell概述 shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核 脚本入门 脚本格式 脚本以#!/bin/bash开头(指定解析器) helloworld # 创建脚本 [linuxlocalhost datas]$ cat helloworld.sh #!/bin/bas…...

Linux :: 【基础指令篇 :: 用户管理(补充):(4)】::用户切换

前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C 入门到入土!!!学习合集Linux 从命令到网络再到内核!学习合集 目录索引&am…...

打印机无法扫描的原因及解决方法

在家庭和办公环境中,打印机已成为不可或缺的设备。它不仅可以打印文件,还可以扫描文档并将它们转换为数字数据。但有时,打印机可能无法扫描文档或图片。以下是可能导致这些问题的原因和解决方法。 出现打印机无法扫描的原因: 1.…...

【Mysql】 数据类型

文章目录 【Mysql】 数据类型数据类型分类数值类型1. tinyint类型2. bit类型3. 小数类型 字符串类型1.char2.varchar3. 日期和时间类型4. enum 和 set 【Mysql】 数据类型 mysql中数据类型的作用: 约束操作者的行为更清晰的代码逻辑不同的功用 – 例如&#xff0c…...

mysql中如何使用乐观锁和悲观锁

MySQL中可以使用SELECT ... FOR UPDATE语句来实现悲观锁。这个语句会在查询时锁定被查询的行,在事务结束前都不会释放锁。 例如,我们可以使用以下的 SQL 语句来锁定一个特定的行: BEGIN; SELECT * FROM table WHERE id 1 FOR UPDATE; ... C…...

Logstash技术栈总结

Logstash 是一个可以传输和处理你的日志、事务或其他数据的功能强大的工具,可与各种部署集成。 它提供了大量插件,可帮助你解析,丰富,转换和缓冲来自各种来源的数据。 工作原理 Logstash 事件处理有三个阶段:inputs …...

解决:在单项目组件里面引入 base.scss/ base.less 等的外部文件不成功的问题

1、问题展示: 其一、问题描述: 在单文件组件里面使用封装在 base.scss 或 base.less 里面的样式用法一直不成功; 其二、代码: // 虽然已经标明了用的是 scss 的语法,但是页面调用 .scss 里的 style 样式还是不成功&a…...

论文分享 | WSBERT:Weighted Sampling for Masked Language Modeling

本次分享阿里巴巴达摩院语音实验室、新南威尔士大学与香港科技大学(广州)等在ICASSP2023会议发表的论文《Weighted Sampling for Masked Language Modeling》。该论文主要提出了两种简单有效的加权采样策略,来缓解掩码语言模型(ML…...

java 在线音乐网站系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java 在线音乐网站系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助struts2开发技术,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mys…...

软件测试基础教程学习1

文章目录 软件测试概述1.1 什么是软件测试1.2 软件测试的目的1.3 对软件测试的理解1.4 软件测试的原则1.5 测试人员的职责1.6 测试人员的素质要求 软件测试概述 1.1 什么是软件测试 1)软件测试要发现软件的错误。 2)软件测试最终要以软件满足用户需求为…...

浅谈一下@Async和SpringSecurityContext可能会遇到的问题和解决方案

Async和SpringSecurityContext 场景回溯 在执行一个用时较长的批量插入业务的时候,我尝试使用Async异步对业务进行优化,但是却给我报了空指针的错误,定位之后发现 此处我是基于SpringSecurity来获取用户的 是currentUserService获取到的当前登陆用户为空导致的,但是当前确实是…...

VUE常见面试题

1.为什么要使用Vue? 答:Vue是一款优秀的前端框架,它可以帮助我们快速构建高效、可复用、易维护的Web应用程序,并提供了丰富的API和生态系统。 2. Vue有哪些生命周期钩子函数? 答:Vue有8个生命周期钩子函…...

字符串匹配算法--KMP算法--BM算法

该算法解决的是字符串匹配问题,即查看字符串中是否含有完整的匹配字符串。如在java的string的contains方法匹配问题最简单的就是暴力破解了。在java的contains也是这么实现的,效率是低一点的。如果想要更快的速度可以自己写KMP算法。 代码实现体验 Knut…...

swagger的简单介绍

目录 swagger是什么? swagger有什么用? Swagger包含的工具集: swagger的使用步骤: swagger的相关注解: Docket的源码 了解swagger的作用和概念了解前后端分离在SpringBoot中集成Swagger swagger是什么?…...

HNU-电路与电子学-小班3

第三次讨论 1 、直接用晶体管而不是逻辑门实现异或门,并解释这个电路是如何工作的。 (6个 MOS 管构成) 2 、通信双方约定采用 7 位海明码进行数据传输。请为发送方设计海明码校验位 生成电路,采用功能块和逻辑门为接收方设计海…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...