微服务数据存储模式

2020-07-28  本文已影响0人  TinyThing

翻译自
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

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 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:

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

Using a database per service has the following drawbacks:

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

Related patterns

上一篇下一篇

猜你喜欢

热点阅读