美文网首页
微服务数据存储模式

微服务数据存储模式

作者: TinyThing | 来源:发表于2020-07-28 12:02 被阅读0次

翻译自
https://microservices.io/patterns/data/database-per-service.html

写在前面

公司采用微服务模式重构了产品线,但是在微服务化过程中遇到一些问题,例如:
1.分布式事务;
2.基础数据共享;
3.跨库关联查询;
4.单个服务部署集群遇到的问题,像缓存一致性、定时任务单点处理、请求负载均衡、topic消息消费等;

针对基础数据共享,笔者开发了一个数据同步jar包已经较好的解决了该问题,但是对于分布式事务和跨服务数据关联依然存在很多疑惑。在查阅资料过程中,发现了https://microservices.io/
该博客,因此对其中部分内容进行摘录和解读。

Pattern: Database per service

Context

Let’s imagine you are developing an online store application using the Microservice architecture pattern. Most services need to persist data in some kind of database. For example, the Order Service stores information about orders and the Customer Service stores information about customers.

image

Problem

What’s the database architecture in a microservices application?

Forces

  • Services must be loosely coupled so that they can be developed, deployed and scaled independently

  • Some business transactions must enforce invariants that span multiple services. For example, the Place Order use case must verify that a new Order will not exceed the customer’s credit limit. Other business transactions, must update data owned by multiple services.

  • Some business transactions need to query data that is owned by multiple services. For example, the View Available Credit use must query the Customer to find the creditLimit and Orders to calculate the total amount of the open orders.

  • Some queries must join data that is owned by multiple services. For example, finding customers in a particular region and their recent orders requires a join between customers and orders.

  • Databases must sometimes be replicated and sharded in order to scale. See the Scale Cube.

  • Different services have different data storage requirements. For some services, a relational database is the best choice. Other services might need a NoSQL database such as MongoDB, which is good at storing complex, unstructured data, or Neo4J, which is designed to efficiently store and query graph data.

Solution

Keep each microservice’s persistent data private to that service and accessible only via its API. A service’s transactions only involve its database.

The following diagram shows the structure of this pattern.

image

The service’s database is effectively part of the implementation of that service. It cannot be accessed directly by other services.

There are a few different ways to keep a service’s persistent data private. You do not need to provision a database server for each service. For example, if you are using a relational database then the options are:

  • Private-tables-per-service – each service owns a set of tables that must only be accessed by that service
  • Schema-per-service – each service has a database schema that’s private to that service
  • Database-server-per-service – each service has it’s own database server.

Private-tables-per-service and schema-per-service have the lowest overhead. Using a schema per service is appealing since it makes ownership clearer. Some high throughput services might need their own database server.

It is a good idea to create barriers that enforce this modularity. You could, for example, assign a different database user id to each service and use a database access control mechanism such as grants. Without some kind of barrier to enforce encapsulation, developers will always be tempted to bypass a service’s API and access it’s data directly.

Example

The FTGO application is an example of an application that uses this approach. Each service has database credentials that only grant it access its own (logical) database on a shared MySQL server. For more information, see this blog post.

Resulting context

每个服务使用独立的数据持久化有以下优点:
1.松耦合,改变一个服务的数据库不影响其他服务
2.每个服务可以使用最合适的数据库类型,例如es,mongo等

Using a database per service has the following benefits:

  • Helps ensure that the services are loosely coupled. Changes to one service’s database does not impact any other services.

  • Each service can use the type of database that is best suited to its needs. For example, a service that does text searches could use ElasticSearch. A service that manipulates a social graph could use Neo4j.

也会有下面的缺点
1.分布式事务
2.跨库联查(join)
3.管理多种不同数据库是一个麻烦事

Using a database per service has the following drawbacks:

  • Implementing business transactions that span multiple services is not straightforward. Distributed transactions are best avoided because of the CAP theorem. Moreover, many modern (NoSQL) databases don’t support them.

  • Implementing queries that join data that is now in multiple databases is challenging.

  • Complexity of managing multiple SQL and NoSQL databases

There are various patterns/solutions for implementing transactions and queries that span services:

  • Implementing transactions that span services - use the Saga pattern.

  • Implementing queries that span services:

    • API Composition - the application performs the join rather than the database. For example, a service (or the API gateway) could retrieve a customer and their orders by first retrieving the customer from the customer service and then querying the order service to return the customer’s most recent orders.

    • Command Query Responsibility Segregation (CQRS) - maintain one or more materialized views that contain data from multiple services. The views are kept by services that subscribe to events that each services publishes when it updates its data. For example, the online store could implement a query that finds customers in a particular region and their recent orders by maintaining a view that joins customers and orders. The view is updated by a service that subscribes to customer and order events.

Related patterns

相关文章

  • 微服务数据存储模式

    翻译自https://microservices.io/patterns/data/database-per-se...

  • 2.7数据存储模式

    2.7数据存储模式 本节必须掌握的知识点: u掌握存储模式 u大端存储模式、小端存储模式的概念 u掌握DTDebu...

  • 28-网络文件共享服务

    本章内容 ◆ FTP服务◆ NFS服务◆ SAMBA服务◆ 数据同步 存储基础知识---存储网络 直接存储(Dir...

  • LDAP概念与原理

    目录服务就是按照树状存储信息的模式。目录服务的数据类型主要是字符型, 而不是关系数据库提供的整数、浮点数、日期、货...

  • 00007.AWS服务概览

    服务概览: 计算服务: 存储服务: 网络服务: 数据库服务:

  • 十、文件上传

    一、文件上传介绍 要将客户端(浏览器)大数据存储到服务器端,不将数据直接存储到数据库中,而是要将数据存储到服务器所...

  • Dataworks实战4-业务流程模块之数据集成概述

    伴随前台业务系统的微服务化,各微应用的数据存储于各自微服务里,使得各业务系统之间数据的关联分析、数据的全生命周期的...

  • php设计模式(五)数据对象映射模式

    数据对象映射模式 orm 对象和数据存储映射,对对象的操作映射为对数据的存储操作

  • 存储引擎

    数据库架构 连接-服务-引擎-存储 主流存储引擎对比

  • Linux-NFS存储服务

    1.NFS存储服务作用 实现数据的共享存储编写数据操作管理节省购买服务器磁盘开销 2.NFS服务部署流程 RPC:...

网友评论

      本文标题:微服务数据存储模式

      本文链接:https://www.haomeiwen.com/subject/apkfrktx.html