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

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: .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


目录
相关文章
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
113 3
|
3月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
3月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
24天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
60 4
|
17天前
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
|
2月前
|
消息中间件 存储 负载均衡
微服务与分布式系统设计看这篇就够了!
【10月更文挑战第12天】 在现代软件架构中,微服务和分布式系统设计已经成为构建可扩展、灵活和可靠应用程序的主流方法。本文将深入探讨微服务架构的核心概念、设计原则和挑战,并提供一些关于如何在分布式系统中实现微服务的实用指导。
57 2
|
2月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
2月前
|
NoSQL Java Redis
开发实战:使用Redisson实现分布式延时消息,订单30分钟关闭的另外一种实现!
本文详细介绍了 Redisson 延迟队列(DelayedQueue)的实现原理,包括基本使用、内部数据结构、基本流程、发送和获取延时消息以及初始化延时队列等内容。文章通过代码示例和流程图,逐步解析了延迟消息的发送、接收及处理机制,帮助读者深入了解 Redisson 延迟队列的工作原理。
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
3月前
|
运维 持续交付 API
深入理解并实践微服务架构:从理论到实战
深入理解并实践微服务架构:从理论到实战
138 3