.Net微服务实战之必须得面对的分布式问题(一)

简介: .Net微服务实战之必须得面对的分布式问题(一)

系列文章



相关源码:https://github.com/SkyChenSky/Sikiro


前言

  

不少小伙伴看了我的博客的后跟我探讨问题时都离不开数据一致性、数据关联、数据重复创建的问题,只要大家做的分布式系统无论是否微服务化,或多或少都会遇到上述问题,而上述的问题的本质其实就是分布式事务、分布式数据关联与幂等性。这三个问题也是很多面试官在面试的时候检验应聘者是否有实践过分布式系统的经验的标准之一,而微服务作为分布式系统的架构风格,在实施过程中也无法幸免以上问题。


PS:评论可能比正文更精彩


分布式基础概念

  

用微服务架构风格设计出来的系统是典型的分布式系统。

  

分布式计算是指系统的工作方式,主要分为数据分布式任务分布式:

  

数据分布式也称为数据并行,把数据拆分后,利用多台计算机并行执行多个相同任务。优点是缩短所有任务总体执行时间,缺点是无法减少单个任务的执行时间。

  

任务分布式也称为任务并行,单个串行的任务拆分成多个可并行子任务。优点是提高性能、可扩展性、可维护性,缺点是增加设计复杂性。


方式

描述

数据分布式

利用多台计算机并行执行多个相同任务

任务分布式

单个串行的任务拆分成多个可并行子任务


分布式系统必须面临的哪些问题?

  

我们日常工作的时候 ,接触到任务分布式的情况相对比较多例如:第三方支付请求,API编排数据关联。从场景划分主要分为单服务多数据库,多服务多数据库,多服务单数据库,以上三种场景都会存在多台服务器之间跨网络调用的情况,由原单进程单数据库内的简单实现的原子性、一致性变得不得不去面对因为跨网络请求得幂等性数据一致性

  

数据库一致性又分,读对应着数据库跨库跨服务器的数据关联,写对应着分布式事务的数据最终一致性的处理。

  

数据关联的复杂度场景主要体现在分库分服务器与多接口数据关联的场景应该怎么解决?

  

分布式事务如果在单服务多数据库的场景下想必大家都会想出像Sql Sever的MSDTC的XA协议事务。如果是在多服务多数据库该选用怎样的分布式事务方案?

  

在分布式场景下幂等性的保证是无法避免的,网络是存在不确定性的,一个请求可能会成功,但也会因为客观因素导致失败,那么重新发起请求就无发避免的了,那么如何保证我不会重复创建数据数据被覆盖呢?

  

下文我将从数据关联分布式事务幂等性三个角度进行叙述方案。


数据关联

  

数据关联的主要方案有三种,应用层数据聚合、冗余设计(反范式)、数据库从库集成


方案名称

方案描述

应用层数据聚合

分别调用查询API,在业务逻辑层组装,适用于简单的关联。

冗余设计(反范式)

在目标表添加冗余字段,适用于记录递增的,不适用于冗余字段更新频繁,实现起来简单,有扩展性问题

数据库从库集成

通过主从同步把相关表同步到一台服务器做跨库查询,适用于复杂查询、报表类的,有技术复杂度,从长远收益来看能应对多种场景

  

举个常见的例子:分布式情况下,比如现在有两个服务,分别是用户,订单。每个服务都是自己独立的数据库。用户数据库有用户信息表,订单数据都有关联用户的唯一id。


image.png


应用层数据聚合:

  

先调用订单服务得到订单列表后,再根据订单列表的用户ID集合调一次用户服务查询出用户列表。再通过内存遍历把订单列表与用户列表在业务层整合。

  

优点,实现简单;缺点,也是简单,该方案只能适合简单的查询过滤,以主表为驱动的关联。


public async Task<List<Order>> GetOrder()
        {
            //订单集合
            var orderList = await _order.GetList();
            //userId集合
            var userIds = orderList.Select(a => a.UserId).ToList();
            //关联用户集合
            var users = await _user.GetByIds(userIds);
            //应用层数据聚合关联
            orderList.ForEach(order =>
            {
                order.Name = users.FirstOrDefault(a => a.UserId == order.UserId)?.Name;
            });
            return orderList;
        }


冗余设计(反范式):

  

在订单表增加和用户有关信息的字段。

  

优点,实现简单,以应用层数据聚合方案有更多的过滤条件;缺点,冗余的字段如果更新存在同步问题,该方案适用于更新频繁少的递增日志类数据。


image.png


数据库从库集成:

     

通过主从同步技术,把相关的业务表同步到同一台服务器我们称为ReportDB,再通过在代码层面把数据源连接指向从库做跨库联表查询处理。

  

优点,通过强大的SQL解决复杂的报表类查询;缺点,拥有技术复杂度,需要数据库主从处理。


image.png


目录
相关文章
|
3月前
|
存储 安全 Java
管理 Spring 微服务中的分布式会话
在微服务架构中,管理分布式会话是确保用户体验一致性和系统可扩展性的关键挑战。本文探讨了在 Spring 框架下实现分布式会话管理的多种方法,包括集中式会话存储和客户端会话存储(如 Cookie),并分析了它们的优缺点。同时,文章还涵盖了与分布式会话相关的安全考虑,如数据加密、令牌验证、安全 Cookie 政策以及服务间身份验证。此外,文中强调了分布式会话在提升系统可扩展性、增强可用性、实现数据一致性及优化资源利用方面的显著优势。通过合理选择会话管理策略,结合 Spring 提供的强大工具,开发人员可以在保证系统鲁棒性的同时,提供无缝的用户体验。
|
4月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
780 3
|
5月前
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
2月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
2月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
2月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
6月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
436 102
|
4月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
524 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
5月前
|
数据采集 缓存 NoSQL
分布式新闻数据采集系统的同步效率优化实战
本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
193 1
分布式新闻数据采集系统的同步效率优化实战

热门文章

最新文章