当前位置: 首页 > 知识库问答 >
问题:

微服务中的数据库设计

慕弘义
2023-03-14

我计划将一个整体ASP. Net MVC应用html" target="_blank">程序迁移到微服务架构。

该应用程序位于教育领域,下面是当前拥有的子模块,

系统管理员

研究所管理员

候选人/学生门户

辅导员/教师门户

课程设置(可由辅导员或学院管理人员完成)

考试门户

报告门户[新]

视频会议门户[新]

为了实现微服务架构,我打破了当前的系统,如下图所示,并为每个模块创建DB。

在这里我面临一个问题,比如说考试 Db 目前与课程和科目等有一些关系。

并且课程和科目相关表移动到另一个数据库,那么我如何维护考试数据库中的关系和数据?

我是否应该在考试数据库中创建课程和科目表的副本,并在新数据插入原始数据库时填充它们(带有事件Que)?

或者,是否有任何其他技术可以以最小的改变和努力实现这一点。

还有我如何维护不同数据库之间的事务。

共有1个答案

东郭展
2023-03-14

每个服务的数据库

    < li >每个服务使用一个数据库有以下好处:

帮助确保服务松散耦合。对一个服务的数据库的更改不会影响任何其他服务。

每个服务都可以使用最适合其需求的数据库类型。例如,执行文本搜索的服务可以使用 ElasticSearch。操纵社交图谱的服务可以使用Neo4j。

  • 每个服务使用数据库有以下缺点:

实现跨多个服务的业务事务并不简单。由于CAP定理,最好避免分布式事务。此外,许多现代(非关系型数据库)数据库不支持它们。

实现连接现在在多个数据库中的数据的查询是一项挑战。

管理多个SQL和NoSQL数据库的复杂性

>

  • 实现跨服务的事务和查询有多种模式/解决方案:

    实现跨服务的事务:

    使用佐贺模式。

    • 实现跨服务的查询:

    API 组合 - 应用程序执行联接而不是数据库。例如,服务(或 API 网关)可以检索客户及其订单,方法是首先从客户服务中检索客户,然后查询订单服务以返回客户的最新订单。

    命令查询责任分离(CQRS)-维护一个或多个包含来自多个服务的数据的实例化视图。这些视图由订阅每个服务在更新其数据时发布的事件的服务保留。例如,在线商店可以通过维护连接客户和订单的视图来实现查询,该查询可以查找特定区域中的客户及其最近的订单。视图由订阅客户和订单事件的服务更新。

    点击此处阅读更多内容

    共享数据库

    • 这种模式的好处是:

    开发人员使用熟悉且简单的ACID事务来强制数据一致性

    单一数据库操作更简单

    • 此模式的缺点是:

    开发时间耦合 - 例如,处理 OrderService 的开发人员需要与访问相同表的其他服务的开发人员协调架构更改。这种耦合和额外的协调将减缓开发速度。

    运行时耦合——因为所有服务访问同一个数据库,它们可能会相互干扰。例如,如果长时间运行的客户服务事务持有ORDER表上的锁,那么OrderService将被阻塞。

    单个数据库可能无法满足所有服务的数据存储和访问要求。

    点击此处阅读更多内容

    其他必读内容:CQRS

  •  类似资料:
    • 我刚刚开始将我的项目分离到小微服务中。我有一个处理 API 授权的微服务(检查 API 请求中提供的 apiKey 是否有效),因此为此,我有一个单独的 API 授权数据库,其中包含下表和以下架构: APIKey: ApiKey (VARCHAR, PK) TenantID (INT, FK) 租户:租户ID(INT, PK)名称(VARCHAR) 如您所见,APIKey表链接到租户表。 我有另一

    • 如果一个微服务只知道它自己的领域,但是有一个数据流需要多个服务以某种方式交互,那该怎么做呢? 假设我们有这样的东西: 为论证起见,假设一个订单发货后,就应该创建发票。 我确实知道这可以被认为是高度基于意见的。但它也有具体的一面,因为微服务不应该做上述的事情。因此,必须有一个“根据定义它应该做什么”,这不是基于意见的。 开枪啊。

    • 想要改进此问题?更新问题,以便它仅通过编辑这篇文章来关注一个问题。 我计划使用微服务架构来实现我们的网站。我想知道在服务之间共享数据库是否正确,或者为每个服务使用单独的数据库是否更好。在这方面,我可以考虑为所有服务使用一个通用数据库吗?还是它违反了微服务体系结构的本质?

    • 我读过萨姆·纽曼的《微服务》一书,在关于分裂整体的一章中,他举了一个“打破外键关系”的例子,他承认跨API进行连接会更慢--但他接着说,如果你的应用程序足够快,它比以前慢有关系吗? 这似乎有点油嘴滑舌?人的经历是什么?您使用了哪些技术来使API联接执行得令人满意?

    • 我经常听说,在微服务架构中,对于每一个微服务,我们都必须创建单独的数据库。 但是,如果我必须在不同的数据库中维护外键约束,这是不可能的。就像我在身份验证微服务中有一个用户表,我想在我的目录服务中使用它(用户表中的用户 ID 列) 那么如何解决呢。 感谢提前

    • 我是微服务架构的新手,我正在尝试使用两个 Spring 启动微服务构建一个简单的项目,eureka 作为服务发现和 Spring 云用于 API 网关。UserService和OrderService连接到不同的MySQL模式,我的问题是,如何通过客户端调用rest方法并传递用户ID来从orders_table检索数据?我有一个仪表板,我必须在其中显示登录用户下的所有订单。 客户端项目是一个Spr