系统架构与高可用

系统架构与高可用

前言

简单聊聊博主的背景吧,博主是Java开发,刚毕业就来到这个刚创立的公司(当然是有一点背景的),公司开发人数从80来人到现在的430人,期间系统进行多次调整。

而我除了写代码业务实现外,刚好有机会接触了一些类似架构、运维、以及新系统初期设计讨论的工作,这大大满足了我的好奇心,这是幸运的。

我大部分的知识是从工作中学习到的,开始知识点是零散,喜欢做笔记,一旦遇到我们没有听过的技术名词或者业务名词我就会记录下来,然后自己找资料去了解,哪怕是同事讨论我听到的,平时闲逛博客文章也会看到一些,慢慢的一些知识点可以串连起来,逐渐的对公司使用的技术体系有了较为明确的了解。(这是一种我认为不错的学习方法,有一定的技术体系脉络后,可以尝试各个知识点针对性加深理解,这是一种从点到线到面,再到深入的一种方式)。

事实上架构师的工作可以细分为业务架构和技术架构,相应的职位可细分为业务架构师、技术架构师。当然细分并非必须的。

而我们公司的架构师职位,是偏向业务架构的定位,技术架构基本是各个研发团队规划。当然整个公司有基础架构规范,使得各个系统使用的技术偏差不会太大,尽量保持统一。

博主所在公司的技术架构是微服务架构,新型中大型互联网公司一般采用这种架构吧。至于什么是微服务架构,我们后面细说。

关于业务架构

为了让大家更好的理解业务架构,我找到一遍非常不错的文章:怎么做好业务架构师

我摘抄了其中不错描述:
(1)开发的思维和业务架构师的思维有很大差异。前者侧重于对具体的问题,思考能否实现、如何实现、实现的好不好、效率高不高。后者侧重于对明确或者模糊的问题, 思考真正需求是什么、为什么是这样、如何分析成册、如何描述给下游同事。
(2)作为一个承前启后的岗位,业务架构师像是一个路由器,对各种业务需求加以分析处理后路由到下游产品和研发团队。 因此和业务人员沟通时,需要能换位思考“他们为什么提出这个需求、痛点在哪里”;和产品、研发沟通时,能思考他们的技术限制、架构局限和项目进度压力。 基于换位思考的沟通能力,能让你和业务、产品/研发更有效的沟通,关系也更融洽。

整体而言,业务架构师需要更多的思考、更多的沟通与表达(文档能力),需要对业务有足够的理解。
我们公司研发中心也有架构团队,有架构师职位。但是整体而言,我们公司的架构师,并没有发挥出应有的贡献。因为他们对业务的理解非常局限,而只是作为参与讨论的角色,讨论完了,基本不总结,因此形同虚设。我觉得是因为研发中心对他们的职责定位没有足够的明确,或者没事实施好的缘故吧。

关于技术架构

技术架构师是选型、抽象、提炼、封装公共组件,如缓存、消息中间件、服务框架、工作流等。让项目团队只关注业务代码的实现。

2017年12月份,公司邀请了一位京东高级架构师给我们分享了《微服务架构设计与实践》的课程。收获非常大,最主要是让我对知识体系结构的理解更为深入,这一点让我在后面的学习中可以更加快速的理解。下面说说系统架构自己的一些收获吧。

(1)系统架构其实分为:标准的基础系统架构规范和结合具体业务的系统架构。有些系统如秒杀系统、营销活动系统等,需要对业务有足够的理解,才能设计出更为合理的系统架构。

(2)系统架构有:1、单体式架构(两层的C/S架构、三层的MVC架构),2、多体式架构(简单分布式系统RPC调用、面向服务架构SOA、微服务架构)。

关于单体式架构,系统应用、数据库都部署到一台机器上,比如一个小超市的结算系统。在以前网络没有现在那么便利时,他确实有其较强的使用场景的。

关于微服务架构,采用一组服务的方式来构建一个应用,服务独立部署在不同的进程中,不同的服务通过一些轻量级交互机制通信,例如RPC、HTTP等,服务可独立扩展伸缩,每个服务定义了明确的边界,不同的服务甚至可以采用不同的编程语言来实现(但是建议尽量统一,方便维护),由独立的团队来维护。

微服务的思路是将一个巨大的单体式应用分解为许多小的、相互连接的微服务,可以更加快速的迭代及扩展伸缩。
一个微服务一般完成某个特定的功能,比如下单管理、客户管理等等。
运行时微服务的每个实例可能是一个云VM或者是Docker容器。
微服务架构每个服务都有自己的数据库。

微服务架构的好处:
(1)通过分解巨大的单体式应用为多个服务方法解决了复杂性问题。
(2)这种架构使得每个服务都可以有专门的开发团队来开发。开发者可以自由选择开发技术,提供API服务。(不过我们公司目前都是采用统一的技术,方便维护,除非特例才使用不一样的技术)
(3)微服务架构模式是每个微服务独立部署。开发者不再需要协调其他服务部署对本服务的影响。
(4)微服务架构模式使得敏捷开发、持续化部署成为可能。
(5)微服务架构模式使得每个服务独立扩展。你可以根据每个服务的规模来部署满足要求的规模。你可以使用更合适于服务资源需求的硬件。

微服务架构带来的问题:
(1)微服务的边界、大小很难界定(什么时候该拆分,什么时候该合并,因此就我们公司而言机会每年需要整合一次,当然不会大变化,只是局部调整使得更加合理)
(2)微服务应用是分布式系统,由此会带来固有的复杂性。开发者需要在RPC或消息传递志健选择并完成进程间通讯机制。
(3)在微服务架构应用中,需要更新不同服务所使用的不同数据库或缓存。使用最终一致性、分布式事务等等。
(4)微服务架构模式应用的改变将会波及多个服务。需要了解所有服务使用者。
(5)测试一个基于微服务架构的应用也是很复杂的任务。

而我们公司微服务架构的具体实现:

这里写图片描述

每个微服务单元,可以根据业务量进行,横向扩展,部署多个实例负载相应请求。
微服务单元之间通过远程调用通信(博主公司采用的是Zookeeper + Dubbo),微服务暴露一些接口给其他模块消费,其他模块可以是另外一个微服务,也可以是中台api。
中台api+前端主要职责是业务包装,可以包装各种各样的业务形态,如不同的订单流程及交互。
微服务之中也可以作基础微服务和业务微服务区分,如客户系统、额度系统、审批系统、贷款系统开发成熟后,变更相对较小,而订单系统、营销系统、商户系统等则变动比较大。划分维度可以结合自己业务场景多研究。

关于高可用架构设计

【由于时间有限,没有画图,纯文字略显粗糙,不过希望猿友可以耐心看完】

正常情况下,我们一般一个微服务单元部署两个实例,分别放到两台服务器上,可以达到一个容灾效果。普通的请求量是没有问题的。

某些请求耗时特别高或者系统崩溃,一般是索引没有设计好查询太慢导致数据库连接数不够、或者一次性从数据库中查询百万级别数据加载到内存导致内存溢出(严禁查全表,尽量采用分页查询)、或者存在死锁导致数据库连接数不够、或者某段代码存在死循环(递归尽量判断,设置个递归次数,如100,避免死循环)。
以上问题,我们一般安排代码检视,让大家按照规范,那么比较少出现了。

排除上面的一般问题,小部分接口访问量较大,性能瓶颈大部分就是数据库了,结合我们的业务场景,可以适当使用缓存,缓存我们尽量使用分布式缓存吧,除非是一些对相应速度要求非常高且数据量很小的可以使用本地缓存。
使用了缓存后,数据从内存里面读取性能会得到大大的提升。

如果综合访问量比较大,这时候的瓶颈集中在服务器的cpu和io了,那么就扩展中台api和微服务的实例,拓展到一个相对稳定的数量级。

如果访问量及数据量都达到一定的级别,那么很可能瓶颈又落到数据库了,但是我们会发现,数据库操作超过80%往往是读操作,而写操作不超过20%,那么我们可以考虑读写分离,我们愿意牺牲一定的写操作时间来换取读的性能。再者就是,学会做数据冗余,以前数据库服务非常昂贵,我们坚持数据库的第三范式,避免冗余,而现在我们应该考虑的是如何做好数据冗余,以提高系统的可用性。不仅仅是表字段冗余,甚至可以整张表冗余。以商城为例,可以商家端看到的订单信息跟用户看到的订单信息并不在同一个数据库的,商家是可以接受短时间的数据不一致的,只要最终一致就好了。(最终一致性,这个词有不少应用场景的,可以细细了解并应用)。

对于类似秒杀系统,突然峰值,这种一方面我们肯定需要热备份多台机器以方便快速拓展微服务实例、另一方面还需要做请求拦截和队列,请求拦截和队列应该尽可能前置,减少对系统带来的冲击。一些逻辑可尽量采用异步处理,结果消息通知的方式。

当系统越来越复杂,数据库表很多,比如超过150张表,我们可以考虑进行服务拆分,重新规划。还可以达到容灾隔离的效果。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2260.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 查看进程运行在哪个cpu_鲲鹏980CPU

    查看进程运行在哪个cpu_鲲鹏980CPU前言最近用华为鲲鹏跑了一段时间服务后,出现了系统负载40多居高不下的情况,一排查发现是kworker进程占用CPU很高,而且还杀不掉。通过华为的监控发现是磁盘I/O很高,重启服务器后能短暂解决问题,但是过几天负载还是会很高,导致很多进程被系统杀死。但是出现问题的就一台鲲鹏,其他的鲲鹏没有出现,通过比较发现内核版本不一样,执行uname-a输出如下正常的鲲鹏Linuxkpv7-pbx-00014.18.0-80.7.2.el7.aarch64#1SMPThuSep1216:1

    2025年12月10日
    3
  • 详解布隆过滤器的原理和实现「建议收藏」

    详解布隆过滤器的原理和实现「建议收藏」为什么需要布隆过滤器想象一下遇到下面的场景你会如何处理: 手机号是否重复注册 用户是否参与过某秒杀活动 伪造请求大量id查询不存在的记录,此时缓存未命中,如何避免缓存穿透 针对以上问题常规做法是:查询数据库,数据库硬扛,如果压力并不大可以使用此方法,保持简单即可。改进做法:用list/set/tree维护一个元素集合,判断元素是否在集合内,时间复杂度或空间复杂度会比较高。如果是微服务的话可以用redis中的list/set数据结构,数据规模非常大此方案

    2022年10月6日
    2
  • 1、时间轮[通俗易懂]

    1、时间轮[通俗易懂]一、什么是时间轮?作为一个粗人,咱不扯什么高级的词汇,直接上图:上面是一张时间轮的示意图,可以看到,这个时间轮就像一个钟表一样,它有刻度,图中画了9个格子,每个格子表示时间精度,比如每个格子表示1s,那么转一圈就是9s,对于钟表上的秒针来说它的最小刻度是1s,秒针转一圈就是60s。时间轮上每个格子储存了一个双向链表,用于记录定时任务,当指针转到对应的格子的时候,会检查对应的任务是否到期,如果到期就会执行链条上的任务。二、为什么使用时间轮?我认为这个世界上任何事物的出现都有它的原因,只是大部分事

    2022年10月1日
    2
  • flask框架菜鸟教程_flask框架是用来干什么的

    flask框架菜鸟教程_flask框架是用来干什么的文章目录前言Flask基础概念和安装Flask快速入门小应用Flask之模板的使用后续,待更新。。。。前言最近开始学习flask框架,本文用于flask框架的基础入门学习,版本使用的是py3.7,学习内容相对比较简单,后续再扩充高级知识。Flask基础概念和安装首先我们得清楚,flask具体是个什么东东?我们学了flask有啥用?这里给出维基百科的解释:Flask是一个使…

    2022年8月29日
    7
  • 最短路径算法–无向图[通俗易懂]

    最短路径算法–无向图[通俗易懂]最短路径算法Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法。该算法被称为是“贪心算法”的成功典范。1、表示图的数据结构邻接列表邻接列表:在邻接列表实现中,每一个顶点会存储一个从它这里开始的边的列表。比如,如果顶点A有一条边到B、C和D,那么A的列表中会有3条边邻接…

    2022年5月24日
    40
  • 直方图均衡化的原理及实现途径_请简述图像直方图均衡的原理

    直方图均衡化的原理及实现途径_请简述图像直方图均衡的原理直方图均衡化的原理及实现一、直方图1.1直方图的概念在图像处理中,经常用到直方图,如颜色直方图、灰度直方图等。图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横坐标是灰度级,纵坐标是该灰度级出现的率。如下图所示1.2直方图的性质①直方图反映了图像中的灰度分布规律。它描述每个灰度级具有的像素个数,但不包含这些像素在图像中的位置信息。图像直方图不关心像

    2022年8月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号