SET化架构设计

随着业务多元化发展,大型分布式集群面临扩展性和容灾问题。本文分析了容灾、资源扩展和大集群拆分等问题,介绍了单元化架构SET化方案,包括目标、架构设计、路由策略及架构原则,以解决业务扩展性和容灾难题,支撑业务高速发展。

互联网大厂单元化架构设计衍变之路

随着业务的多元化发展,拿滴滴,美团等大厂来说,如滴滴打车,外卖,酒店,旅行等持续高速增长,单个大型分布式的集群,通过机器+集群内部拆分,虽然具备了一定的可扩展性。但随着业务量的进一步增长,整个集群规模主键变得巨大,从而会在某个点达到瓶颈,无法满足扩展性需要,并且大集群内核心服务出现了问题,会影响全网用户

以滴滴打车、美团外卖举例:

打车业务量巨大,尤其是早晚高峰。全年订单已越10亿

外卖业务量庞大,目前单量突破1700w/天

面临问题

容灾问题

核心服务(比如订单服务)挂掉,会影响全网所有用户,导致整个业务不可用

数据库主库集中在一个IDC,主机房挂掉,会影响全网所有用户,整个业务无法快速切换和恢复

资源扩展问题

单IDC的资源(机器、网络带宽等)已经无法满足,扩展ICD时,存在跨机房访问时延问题(增加异地机房时,时延问题更加严重)

数据库主库单点,连接数有限,不能支持应用程序的持续扩展

大集群拆分问题

分布式集群规模开大后,会相应的带来资源扩展、大集群拆分及容灾问题

所以对业务扩展及容灾需求考虑,我们需要一套从底层架构彻底解决问题的方案,业界主流解决方案:单元化架构方案(阿里、支付宝、饿了么、微信 等)

SET化方案目标

业务:解决业务遇到的扩展性和容灾问题,支撑业务的高速发展

通用性:架构侧形成统一通用的解决方案,方便个业务线接入使用

SET化架构设计

解决容灾问题:

UnitA一套业务的核心组件,比如网购,从加入购物车到下单,经过A、B、C、D等步骤,全部部署到UnitA的一个机房中,UnitB和UnitC是UnitA的备份,如果UnitA的服务或MQ发生故障,就会路由到UnitB或UnitC中

非核心的业务组件部署到center中

解决扩展问题:

UnitA可以是旅游,UnitB可以是外卖,将来还可以扩展

相关概念

流量路由:按照特殊的key(通常为userid)进行路由,判断某次请求该路由到中心集群还是单元化集群

中心集群:为进行单元化改造的服务(通常不在核心交易链路)成为中心集群,跟当前架构保存一致

单元化集群

每个单元化集群只负责本单元内的流量处理,以及实现流量拆分及故障隔离

每个单元化集群前期只存储本单元产生的交易数据,后续会做双向数据同步,实现容灾切换需求

中间件(RPC、KV、MQ等)

RPC:对于SET服务,调用封闭在SET内;对于非SET服务,沿用现有路由逻辑

KV:支持分SET的数据产生和查询

MQ:支持分SET的消息生产和消费

数据同步

全局数据(数据量小且变化不大,比如商家的菜品数据)部署在中心集群,其他单元化集群同步全局数据到本单元化内

未来演变为异地多活架构时,各单元化集群数据需要进行双向同步来实现容灾需要

SET化路由策略及其能力

异地容灾

通过SET化架构的流量调度能力,将SET分别部署到不停地区的数据中心,实现跨地区容灾支持

高效本地化服务

利用前端位置信息采集和域名解析策略,将流量路由由最近的SET,提供最高效的本地化服务

比如O2O场景天然具有本地生产,本地消费的特点,更加需要SET化支持

集装箱式扩展

SET的封装性支持更灵活的部署扩展性,比如SET一键创建/下线,SET一键发布等(比如docker)

C不是很重要,所以放到中心集群,需要的时候去中心集群调用

中心集群A可以通过路由服务同单元的Set服务

Set3中B如果调用不到本单元的C(本单元优先级最高),可以通过路由服务调用Set2中的C

SET架构原则

对业务的透明原则:

SET架构的实现业务代码透明,业务代码层面不需要关心SET化规则,SET部署的问题

SET切分规则:

理论上,切分规则由业务层面按需定制

实现上,建议优先选最大的业务维度进行切分

比如海量用户的O2O业务,按用户位置信息进行切分。此外接入层、逻辑层和数据层可以有独立的SET切分规则,有利于实现部署和运维成本的最优化

部署规范原则:

一个SET并不一定只限制在一个机房,也可以跨机房或者跨地区部署;为保证灵活性,单个SET内机器数不宜过多(如不超过1000台物理机)

### 容器微服务架构设计的最佳实践 容器微服务架构设计是现代云原生应用开发的重要组成部分。以下是针对容器微服务架构设计 4.1.1 版本的一些最佳实践,结合了当前的技术趋势和行业经验。 #### 1. 微服务的容器 在容器微服务架构中,每个微服务应部署在一个独立的容器内[^1]。这有助于实现服务之间的隔离,并确保每个服务可以独立扩展和更新。使用 Docker 等容器技术,可以将应用程序及其依赖项打包到一个可移植的容器镜像中,从而简部署流程并提高一致性。 #### 2. 服务注册与发现 服务注册与发现中心是容器微服务架构中的关键组件。它允许微服务动态注册其位置,并使其他服务能够通过服务发现机制找到它们。Kubernetes 的内置服务发现功能(基于 DNS 或环境变量)可以很好地支持这一需求,而 Consul 或 Eureka 则提供了更灵活的服务注册和发现选项。 #### 3. 不可变基础设施 为了减少配置偏差和提高系统的稳定性,建议采用不可变基础设施模型[^2]。在这种模式下,服务器一旦创建便不再更新。当需要进行更改时,会生成新的容器实例来替代旧的实例。这种做法不仅能够确保资源的一致性,还简了回滚操作。 #### 4. 高可用性和容错性 设计容器微服务架构时,必须考虑高可用性和容错性。可以通过以下方式实现: - 使用 Kubernetes 的 ReplicaSet 或 Deployment 来保证多个副本运行。 - 配置健康检查探针(Liveness 和 Readiness 探针),以确保容器的正常运行状态。 - 实施负载均衡策略,将流量均匀分布到各个服务实例上。 #### 5. 日志管理与监控 有效的日志管理和监控对于诊断问题和优性能至关重要。可以采用集中式日志管理系统(如 ELK Stack 或 Fluentd)收集和分析日志数据。同时,集成 Prometheus 和 Grafana 等工具进行实时监控,以便快速响应潜在问题。 #### 6. 安全性 安全性是容器微服务架构设计中的重要方面。CASB(云访问安全代理)技术可以帮助企业在云环境中实现更细粒度的安全控制[^3]。此外,还需要采取以下措施: - 对容器镜像进行漏洞扫描,确保使用的镜像是安全的。 - 使用网络策略限制服务之间的通信。 - 实现身份验证和授权机制,保护 API 接口免受未授权访问。 ```yaml apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 9376 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: my-image:latest ports: - containerPort: 9376 ``` 上述 YAML 文件展示了一个简单的 Kubernetes 服务和部署配置示例,体现了容器微服务架构中的一些核心概念。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值