高并发系统-如何做服务化拆分

标签: 并发 系统 服务 | 发表时间:2024-01-03 20:56 | 作者:技术驿站
出处:https://juejin.cn/tag/%E6%9E%B6%E6%9E%84

theme: channing-cyan highlight: a11y-dark

一般早期架构是 一体化架构(Monolithic Architecture),简单来说就是所有的业务都在一个后台服务来承载。

例如,一个Java web应用运行在Tomcat之类web容器上,仅包含单个WAR文件;一个Rails应用使用Phusion Passenger部署在Apache/Nginx上,或者使用JRuby部署在Tomcat上,它们都仅包含单个目录结构。为了伸缩和提高可用性,你可以在一个负载均衡器下面运行该应用的多份实例。

image.png

1. 一体化架构痛点

1.1 技术层面,数据库可能成为系统瓶颈

一体化应用是可以快速复制,但是数据库一般没法横向扩展(除非做分库分表拆分)。
数据库比如MYSQL的客户端连接数是有限制的,一般可在服务器端配置,比如2w。假设一个应用100数据库连接,最多100*200=2w,实际不能扩展到这么多,因为还有运维、监控相关也会使用一定的连接数。

1.2 增加沟通成本,抑制研发效率提升

《人月神话》中曾经提到:一个团队内部沟通成本,和人员数量 n 有关,约等于 n(n-1)/2,也就是说随着团队人员的增加,沟通的成本呈指数级增长,一个 100 人的团队,需要沟通的渠道大概是 100(100-1)/2 = 4950。

同时针对一体化项目,大多代码比较多,这会导致开发维护效率变低。之前在一个客户端项目,一个apk的代码量在150w,30+团队一起开发,合代码做需求非常刺激,有时候专门需要1整天来解决需求提交的代码冲突。

1.3 运维复杂度增加

系统编译、构建、启动等随着代码量的增多变得越来越复杂

1.4 一体化架构优点

一体化架构也是有着一些优点的,如果针对访问量不大、并发不高的系统,一体化架构可以节约机器、精简架构、提高研发效率有着自身的优势。

可以参考2023年的这篇文章: 从微服务转为单体架构、成本降低 90%,亚马逊内部案例引发轰动!CTO:莫慌,要持开放心态

针对单体架构还是微服务化架构,针对项目不同阶段、人员储备等情况按需进行选择

2. 如何进行服务化拆分

2.1 做到单一服务内部功能的高内聚,和低耦合

每个服务只完成自己职责之内的任务,对于不是自己职责的功能,交给其它服务来完成。

2.2 服务拆分的粒度,先粗略拆分,再逐渐细化

拆分初期可以把服务粒度拆的粗一些,后面随着团队对于业务和微服务理解的加深,再考虑把服务粒度细化。

2.3 尽量避免影响产品的日常功能迭代,也就是说,要一边做产品功能迭代,一边完成服务化拆分

优先剥离比较独立的边界服务(比如短信服务、地理位置服务),从非核心的服务出发,减少拆分对现有业务的影响
当两个服务存在依赖关系时,优先拆分被依赖的服务。

2.4 服务接口的定义要具备可扩展性

为保证接口扩展性,接口入参和返回值采用对象而不是直接使用参数做入参
比如下面test1要增加一个参数处理新增加一个方法外没有其他处理方式了,test2直接在入参加一个字段即可

  void test1(int a, int b);

void test2(Test1Req req)

3. 微服务化带来的问题和解决思路

3.1 服务接口的调用,不再是同一进程内的方法调用,而是跨进程的网络调用,这会增加接口响应时间的增加

选择何时微服务框架,比如Dubbo

3.2 多个服务之间有着错综复杂的依赖关系

引入服务治理体系:熔断降级限流超时控制

3.3 服务拆分到多个进程后,一条请求的调用链路上,涉及多个服务,那么一旦这个请求的响应时间增长,或者是出现错误,我们就很难知道,是哪一个服务出现的问题

分布式追踪服务
监控报表 APM工具,如PINPOINT

4. 其他

4.1 康威定律

设计系统的组织,其产生的设计等同于组织间的沟通结构。通俗一点说,就是你的团队组织结构是什么样的,你的架构就会长成什么样。

4.2 贝索斯的两个披萨理论

按照亚马逊 CEO,贝佐斯的“两个披萨”的理论,如果两个披萨不够你的团队吃,那么你的团队就太大了,需要拆分,所以一个小团队包括开发、运维、测试以 6~8 个人为最佳

4.3 微服务化成本高,先采用工程拆分方式

参考:
什么是一体化架构(Monolithic Architecture)
从微服务转为单体架构、成本降低 90%,亚马逊内部案例引发轰动!CTO:莫慌,要持开放心态

相关 [并发 系统 服务] 推荐:

高并发服务端分布式系统设计概要

- - 博客 - 伯乐在线
写这篇文章的目的,主要是把今年以来学习的一些东西积淀下来,同时作为之前文章《 高性能分布式计算与存储系统设计概要》的补充与提升,然而本人水平非常有限,回头看之前写的文章也有许多不足,甚至是错误,希望同学们看到了错误多多见谅,更欢迎与我讨论并指正. 我大概是从2010年底起开始进入高并发、高性能服务器和分布式这一块领域的研究,到现在也差不多有三年,但其实很多东西仍然是一知半解,我所提到的许许多多概念,也许任何一个我都不能讲的很清楚,还需要继续钻研.

高并发系统-如何做服务化拆分

- - 掘金 架构
一般早期架构是 一体化架构(Monolithic Architecture),简单来说就是所有的业务都在一个后台服务来承载. 例如,一个Java web应用运行在Tomcat之类web容器上,仅包含单个WAR文件;一个Rails应用使用Phusion Passenger部署在Apache/Nginx上,或者使用JRuby部署在Tomcat上,它们都仅包含单个目录结构.

高并发web服务技术选型

- - 崔永键的博客
主要问题集中在单个GB级数据使用何种DFS的问题上,目前还没有得到可靠的结论. 采用:nginx或 lvs: https://github.com/alibaba/LVS. 实施自己的调度策略:学习配置lvs或改造lvs或自己重写. 调研下采用hdfs还是fastdfs还是其他的:Fastdfs,ZFS,Lustre,HadoopHDFS,GlusterFS.

高并发系统之限流特技

- - 编程语言 - ITeye博客
在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流. 缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流.

高并发系统设计思路

- - 掘金 后端
不管是哪一门语言,并发都是程序员们最为头疼的部分. 同样,对于一个软件而言也是这样,你可以很快增删改查做出一个秒杀系统,但是要让它支持高并发访问就没那么容易了. 如何让系统面对百万级的请求流量不出故障. 如何保证高并发情况下数据的一致性写. 作为一个架构师,首先要勾勒出一个轮廓,如何构建一个超大流量并发读写、高性能,以及高可用的系统,这其中有哪些要素需要考虑.

100万并发连接服务器笔记之准备篇

- - BlogJava-首页技术区
测试一个非常简单服务器如何达到100万(1M=1024K连接)的并发连接,并且这些连接一旦连接上服务器,就不会断开,一直连着. 环境受限,没有服务器,刚开始都是在自己的DELL笔记本上测试,凭借16G内存,和优秀的vmware workstation虚拟机配合,另外还得外借别人虚拟机使用,最终还得搭上两台2G内存的台式机(安装centos),最终才完成1M并发连接任务.

京东抢购服务高并发实践

- - 企业架构 - ITeye博客
限时抢购又称闪购,英文Flash sale,起源于法国网站Vente Privée. 闪购模式即是以互联网为媒介的B2C电子零售交易活动,以限时特卖的形式,定期定时推出国际知名品牌的商品,一般以原价1-5折的价格供专属会员限时抢购,每次特卖时间持续5-10天不等,先到先买,限时限量,售完即止. 顾客在指定时间内(一般为20分钟)必须付款,否则商品会重新放到待销售商品的行列里.

[转]服务端高并发分布式架构演进之路

- - 鸟窝
原文: 服务端高并发分布式架构演进之路, 作者: huashiou. 作者使用一个商城的例子,演示了架构的演变之路,思路清晰,并且解释了架构的瓶颈以及解决之道. 本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则.

构建高性能高并发Java系统

- scourgen - ITeye博客
异步通信显然可以更快的返回响应. 从实际经验看,对高吞吐服务器更大的好处是,系统中的某一服务出现问题后往往出现雪崩似的服务宕机. 这很多都是由于采用同步通信,需要等待其他服务同步通信结束后,其占用资源才能得到释放. 而这些资源往往是socket连接、线程、数据库连接等比较重的资源. 如果你真的需要他,可以用个mock同步.

多核系统上的 Java 并发缺陷模式(bug patterns)

- yat - IBM developerWorks 中国 : 文档库
通过研究并发(bug patterns)缺陷模式,您既能够提高对并发编程的理解,还能够了解如何发现无效或可能无效的编程方法. 在本文中,作者 Zhi Da Luo、Yarden Nir-Buchbinder 和. Raja Das 阐述了 6 个鲜为人知的、可能威胁运行在多核系统上的 Java 应用程序的线程安全和性能的并发缺陷.