微服务改造血泪史:数据库拆分踩过的那些坑!

简介: 本文复盘了传统项目改造成微服务架构时,数据库拆分过程中遇到的问题。主要问题包括:1. 数据库拆分过细,导致跨服务调用频繁,破坏服务独立性;2. 数据一致性难以保证,分布式事务管理复杂;3. 跨服务查询影响性能,复杂查询难以实现。初次改造时应避免过度拆分,逐步演进架构。

今天来复盘一下微服务中数据拆分过程中所踩过的那些坑,背过的锅。。。  


添加图片注释,不超过 140 字(可选)


这里来复盘一下,传统项目改造成微服务架构时,数据库拆分所踩过的坑。

1. 数据库拆分过细

在传统的单体架构中,数据库通常是集中式的,每个服务都可以直接访问同一个数据库。对于初次从传统架构转向微服务架构而且没有有微服务经验的团队来说。微服务拆分后,摆在面前的首要问题就是数据库如何设计。

是一个微服务对应一个数据库还是可以多个微服务数据库统一在一起呢?

回头看这或许就不是什么问题,微服务架构本身就是每个服务拥有自己的数据存储。但对于初次改造的团队来说还是会有不少问题,在微服务拆分过细这个前提下,每个微服务对应一个数据库。会带很不少坑

坑点:

  • 数据库拆分过细,导致频繁的跨服务数据调用,破坏了服务之间的独立性。
  • 数据库拆分过细,会造成数据冗余多、查询复杂化等问题。

原本一条简单的 SQL 就可以完成一次查询,现在需要找 3~4 个人,调用他们 3~4 个接口才能完成。第一费人,第二费时间,第三费机器性能。另外别人接口要调整时影响的人也比较多了,并且有时你要调整别人还不一定会及时响应。面对这些问题,团队就会出现各种各样的解决办法。

比如自己悄悄的建个视图或存储过程,如果审查不严这项目维护成本就大大增加,这影响今后还可能被放大。


2. 数据一致性问题

在单体架构中,由于数据库是集中式的,事务的一致性通过数据库事务机制(如ACID)来保证。然而,在微服务中,多个服务可能需要同时对多个数据库进行更新,无法再使用传统的事务处理方式保证一致性。

坑点:

  • 分布式事务难以管理,可能会导致数据不一致问题。
  • 缺乏分布式锁机制,可能造成数据冲突或重复。

数据致性又是另一个问题,当时团队有人使用过 LCN,所以当时使用的是 LCN 来实现分布式事务,LCN 实现分布式事务的机制是锁,如果用的不好就会出现把一大片业务给锁了。

当然现在还有很多更好的方案比如:

  • 通过事件驱动架构,在消息队列中传递状态变化事件,确保异步更新数据。
  • 阿里巴巴开源的分布式事务组件 Seata,支持TCC、SAGA、AT(自动事务)等多种模式  


3. 跨服务查询和性能问题

微服务架构要求各个服务的数据隔离,但在实际业务中,很多场景会涉及跨服务的数据查询。如果数据库拆分后频繁进行跨服务查询,将导致查询效率低下,甚至出现网络瓶颈。

坑点:

  • 服务之间频繁通过API调用查询,影响系统性能和响应时间。
  • 数据分布在不同数据库中,复杂查询(如多表Join)难以实现。

这个问题也是上面的提到,当时团队中有人用视图或存储过程悄悄的实现,破坏了微服务解耦性。后面规范起来最大的原则就是不能走回去,坚持拆分这条路,然后就是通过冗余一些数据减少跨微服务的调用。不过这种也是造成了不少空间的浪费和数据同步的代价,还是加重了服务之前的关联性。


总的问题还是在第一次改造把微服务拆分的过细,所以对于初次传统项目改造成微服务架构的团队来说,第一次拆分不要太细,好的架构并不是一次设计出来的,而是演变而来的。


我是栈江湖,如果你喜欢此文章,不要忘记关注+点赞哦!你的支持是我创作的动力。如果你有任何意见或建议,欢迎在下方留言。若转载,请注明文章来源。



目录
相关文章
|
3月前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
3月前
|
设计模式 缓存 关系型数据库
探索微服务架构中的数据库设计挑战
微服务架构因其模块化和高扩展性被广泛应用于现代软件开发。然而,这种架构模式也带来了数据库设计上的独特挑战。本文探讨了在微服务架构中实现数据库设计时面临的问题,如数据一致性、服务间的数据共享和分布式事务处理。通过分析实际案例和提出解决方案,旨在为开发人员提供有效的数据库设计策略,以应对微服务架构下的复杂性。
|
3月前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
7天前
|
存储 监控 供应链
微服务拆分的 “坑”:实战复盘与避坑指南
本文回顾了从2~3人初创团队到百人技术团队的成长历程,重点讨论了从传统JSP到前后端分离+SpringCloud微服务架构的演变。通过实际案例,总结了微服务拆分过程中常见的两个问题:服务拆分边界不清晰和拆分粒度过细,并提出了优化方案,将11个微服务优化为6个,提高了系统的可维护性和扩展性。
26 0
|
1月前
|
存储 NoSQL 分布式数据库
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
|
1月前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
55 3
|
1月前
|
消息中间件 数据库 云计算
微服务架构下的数据库事务管理策略####
在微服务架构中,传统的单体应用被拆分为多个独立的服务单元,每个服务维护自己的数据库实例。这种设计提高了系统的可扩展性和灵活性,但同时也带来了分布式环境下事务管理的复杂性。本文探讨了微服务架构下数据库事务的挑战,并深入分析了几种主流的事务管理策略,包括Saga模式、两阶段提交(2PC)以及基于消息的最终一致性方案,旨在为开发者提供一套适应不同业务场景的事务处理框架。 ####
|
3月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
530 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
1月前
|
设计模式 存储 缓存
微服务架构下的数据库设计策略
本文探讨了在微服务架构中进行数据库设计时,如何平衡数据的一致性、独立性与系统整体性能之间的关系。文章首先介绍了微服务架构的基本概念及其对数据库设计的影响,随后深入分析了三种主流的数据库设计模式——集中式、去中心化和混合模式,并结合实际案例讨论了它们的适用场景与优缺点。此外,还提出了一系列最佳实践建议,旨在帮助开发者更好地应对微服务环境下的数据管理挑战。
|
2月前
|
Java 数据库 数据安全/隐私保护
Spring 微服务提示:使用环境变量抽象数据库主机名
Spring 微服务提示:使用环境变量抽象数据库主机名
50 1

热门文章

最新文章