浅谈架构实战

news2024/9/22 4:31:04

目录

背景

1 架构演变

2 如何实现高层的复用

2 中台产生案例

3 技术架构的核心要点

4 技术架构的高可用案例


背景

      业务架构、数据架构、应用架构和技术架构它们是相互关联和相互支持的,共同构成了企业的总体架构,业务架构是源头,然后才是其他架构。在软件工程中,产品经理定义了系统的外观,满足了用户,业务架构师在此基础上,进一步定义了系统的内部模块结构,满足了开发人员。架构目标实现业务的可复用和扩展,本文主要讲解了架构的演变历史和实战

1 架构演变

  • 架构图

       

  • 各个阶段的架构图
    名称架构图备注
    单体单体:表示层,业务层,数据访问层,DB层
    分布式通过网络连接的多个组件,通过交换信息协作而形成的系统
    传统 SOA

    在分布式的基础上,
    解决的是企业内部大量异构系统集成的问题。

    新的SOA解决的是系统重复建设的问题
    微服务小应用 + 小服务
    中台
     
    简单地说,前台要快,后台要稳,中台因此诞生。
    中台通过实现基础业务的平台化,实现了企业级业务能力的快速复用

2 如何实现高层的复用

首先服用可分为技术复用(代码复用,组件复用),业务复用(产品复用,业务实体复用,业务流程复用),其中产品复用 > 业务流程复用 > 业务实体复用 > 组件复用 > 代码复用

而实现高层的复用,必须做好 “基础服务边界的划分原则”

  • 服务的完整性原则

     对外提供完整的业务语义,最大程度地简化服务的使用

  • 服务的一致性原则

      比如订单的优惠计算过程,却不是由订单服务来负责,而是由独立的促销服务负责的

  • 正交原则

     服务之间不会有任何的调用关系

     服务之间有数据的依赖关系,但没有接口的调用关系     

  

中台产生案例

下面以一个餐饮公司的例子,来讲解中台的产生,餐饮公司餐饮服务已聚合外卖服务,

支持在第三方外卖平台和门店下单。目前需新增自有小程序下单渠道。

  • 妥协且务实方案,可快速落地的方案

    • 存在如下的问题
      • 存在两套订单系统(小程序订单和外卖订单)
      • 小程序订单处理链路过长(由于消息队列堵塞,外卖系统不能及时同步给小程序的订单服务,这样导致了小程序用户不能及时地看到取餐码)
      • 降低了系统整体的稳定性(使两套订单系统解耦,我们使用了消息队列在两个库之间同步订单数据)

             

  • 统一订单服务中台方案

    • 变化
    • 原来外卖系统的两个模块“外卖同步接口”和“POS 接口”,升级为了两个独立的应用。

    • 原来外卖和小程序各自有一个订单库,现在合并为了一个订单库,由这个订单服务统一对外提供订单数据的访问和状态管理。

    • 明显的层次结构,自上而下分为三层(渠道端,渠道端对应的服务段,底层的订单服务)

3 技术架构的核心要点

上面讲述了中台的架构的演变,,业务架构的实现必须依懒技术架构的,下面我们继续解析技术架构的核心点

  •  系统物理模型

     

       

  • 系统故障点

       

  • 解决原则

       

  •          
    • 第一个设计原则是冗余无单点  
    • 第二个设计原则是水平扩展
    • 第三个原则是柔性事务
    • 第四个原则是系统可降级(限流,降级,熔断,功能禁用)
    • 第五个系统可监控

   

4 技术架构的高可用案例

餐饮公司司在全国有大量的门店,他们准备搞一个长期的大型线上促销活动,促销的力度很大:用户可以在小程序上先领取优惠券,然后凭券再支付 1 元,就可以购买价值数十元的套餐。预计每秒 10 万 QPS,首日的订单数量会超过 500 万。

现有体系架构图

现有体系的流程

1 小程序前端通过 Nginx 网关,访问小程序服务端

2 小程序服务端会调用一系列的基础服务,完成相应的请求处理,包括门店服务、会员服务、商品服务、订单服务、支付服务等,每个服务都有自己独立的数据库和 Redis 缓存;

3 订单服务接收到新订单后,先在本地数据库落地订单,然后通过 MQ 同步订单给 OMS 履单中心

4 门店的收银系统通过 HTTP 远程访问云端的 OMS 履单中心,拉取新订单,并返回取餐码给 OMS,OMS 再调用小程序订单服务同步取餐码

5 小程序前端刷新页面,访问服务端获得取餐码,然后用户可以根据取餐码到门店取餐或等待外卖。

实现高可用99.99%的性能的架构

 具体的实施

  •  前端接入改造
    • 小程序端的 CDN 优化
    • Nginx 负载均衡
    • 应用和服务的水平扩展
    • 订单水平分库
    • 异步化处理
    • 主动通知,避免轮询
      • 在原来的架构中,前台小程序是通过轮询服务端的方式,来获取取餐码;同样,商户的收银系统也是通过轮询 OMS 系统拉取新订单
      • 新增消息推送中心
        • 收银系统通过 Socket 方式,和推送中心保持长连接
        • 当 OMS 系统接收到前台的新订单后,会发送消息到消息推送中心;然后,收银系统就可以实时地获取新订单的消息,再访问 OMS 系统拉取新订单
        • 为了避免因消息推送中心出问题(比如消息中心挂掉了),导致收银系统拿不到新订单,收银系统还保持对 OMS 系统的轮询,但频率降低到了 1 分钟一次。
        • 同理,小程序前端会通过 Web Socket 方式,和消息推送中心保持长连接。当 OMS 系统在接收到收银系统的取餐码后,会发送消息到消息推送中心。这样,小程序前端可以及时地获取取餐码信息。
    • 缓存的使用
      • 当收银系统向 OMS 拉取新订单时,OMS 不是到数据库里查询新订单,而是把新订单先保存在 Redis 队列里,OMS 通过直接查询 Redis,把新订单列表返回给收银系统
      • 在商品服务中,菜单和商品数据也是放在了 Redis 中,每天凌晨,我们通过定时任务,模仿前端小程序,遍历访问每个商品数据,实现对缓存的预刷新,进一步保证缓存数据的一致性,也避免了缓存数据的同时失效,导致缓存雪崩。
    • 一体化监控
      • Zabbix 做系统监控
      • CAT 做应用监控
      • 拉订单曲线做业务监控

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

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

相关文章

Java 中常用内置接口函数

在 Java 8 及以后的版本中,引入了许多函数式编程的特性,其中最重要的就是内置的函数式接口。这些接口使得编写更简洁、可读性更强的代码成为可能。今天我将介绍四个常用的内置接口:Predicate、Function、Consumer 和 Supplier,并提…

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客 这节就是真正的存储数据了 理清一下思路&am…

SprinBoot+Vue漫画天堂网的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

0x06 记录一次挖src的经历(xss漏洞)

漏洞平台:补天 - 企业和白帽子共赢的漏洞响应平台,帮助企业建立SRC 个人总结的挖洞流程: 1)先用工具信息收集一波 我这里先用灯塔收集一下目标资产 2)然后用漏洞扫描工具扫描一波 我这里用Acunetix进行扫描 因为工具…

驱动(RK3588S)第九课时:多节点驱动与函数接口

目录 一、多节点概念1、所用到的结构体说明2、函数接口主要是read和write函数2.1、把应用层的数据拷贝给底层2.2、把应用层的数据拷贝给底层 3、应用层的read和write函数4、底层的read和write函数二、ioctl控制命令接口1、概念2、函数介绍应用层和驱动层 三、代码与现象1.编写L…

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通…

使用 nuxi preview 命令预览 Nuxt 应用

title: 使用 nuxi preview 命令预览 Nuxt 应用 date: 2024/9/8 updated: 2024/9/8 author: cmdragon excerpt: 摘要:本文介绍了如何使用nuxi preview命令预览Nuxt.js应用,包括安装和准备环境、启动预览服务器的步骤,以及如何指定根目录和使用自定义.env文件等高级用法。通…

【H2O2|全栈】关于HTML(5)HTML基础(四)

HTML基础知识 目录 HTML基础知识 前言 准备工作 标签的具体分类(四) 本文中的标签在什么位置中使用? 表单(一) 表单标签 输入域标签 预告和回顾 后话 前言 本系列博客将分享HTML相关知识点。 这一期博客&…

使用 DBeaver 创建 MySQL 数据库

文章目录 创建数据库创建用户 创建数据库 1.在【数据库】上点右键,然后选择【新建 数据库】 2.输入 数据库名,点击确定 这样,数据库就创建好了 创建用户 1.在【用户】上点右键,然后选择【新建 用户】 在属性这里,输入…

基于yolov8的血细胞检测计数系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的血细胞检测与计数系统是一种利用深度学习技术,特别是YOLOv8目标检测算法,实现高效、准确血细胞识别的系统。该系统能够自动识别并计数图像或视频中的血细胞,包括红细胞、白细胞和血小板等,为医疗诊断提…

揭开面纱--机器学习

一、人工智能三大概念 1.1 AI、ML、DL 1.1.1 什么是人工智能? AI:Artificial Intelligence 人工智能 AI is the field that studies the synthesis and analysis of computational agents that act intelligently AI is to use computers to analog and instead…

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之…

WSL 下的 CentOS 装 Docker

WSL 下的 CentOS 装 Docker 卸载旧版本安装前的准备工作1. 安装 yum-utils2. 添加阿里云的 yum 镜像仓库3. 快速生成 Yum 缓存 安装Docker启动docker运行 hello-world卸载 Docker 引擎参考资料 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ d…

论文阅读_检索增强生成 RAG 综述

英文名称: Retrieval-Augmented Generation for Large Language Models: A Survey 中文名称: 大型语言模型的检索增强生成:一项调查 链接: http://arxiv.org/abs/2312.10997v5 作者: Yunfan Gaoa, Yun Xiongb, Xinyu Gaob, Kangxiang Jiab, Jinliu Panb, Yuxi Bic, …

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【基础算法总结】滑动窗口

目录 一,滑动窗口介绍二,算法原理和代码实现209.长度最小的子数组3.无重复字符的最长子串1004.最大连续1的个数III1658.将x减到0的最小操作数904.水果成篮438.找到字符串中所有字母异位词30.串联所有单词的子串76.最小覆盖子串 三,算法总结 一…

【Python知识宝库】错误与异常处理:编写健壮的Python代码

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、错误与异常的定义1. 语法错误2. 异常 二、异常处理1. try块2. except块3. finally块 三、异常处理的最佳实践…

数字IC前端:负的建立时间和保持时间

相关阅读数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 建立时间和保持时间是触发器的两个重要的时序参数:建立时间(setup time)指的是在有效时钟沿前,数据必须到达并稳定的时间;保持时间…

力扣416-分割等和子集(Java详细题解)

题目链接:416. 分割等和子集 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。 如果大家不懂01背包的话…

zabbix6.4连接邮箱发出警告

添加告警媒介 默认接收人: 故障级别:{TRIGGER.STATUS}。 服务器:【{HOSTNAME1} 】 发生:{TRIGGER.NAME} 故障! 注:默认接收人:相当于邮件的主题 默认信息:邮件的主题 告警主机:{HOSTNAME1} 告警时间:{EVENT.DATE} {EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息:{TRIGGER.…