报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

在微服务中如何管理数据

  • 2017-07-05
  • 本文字数:1190 字

    阅读完需:约 4 分钟

来自 Stitch Fix 团队的工程副总裁 Randy Shoup 在 QCon 纽约 2017 会议上讨论了如何在基于微服务的应用中管理数据和隔离持久化。他还介绍了将事件(Event)作为微服务的第一类构造。他介绍自己的团队将机器学习技术应用到了业务的各个组成部分,比如购买、库存管理以及风格推荐等。

个性化推荐会基于库存运行机器学习,从而创建出推荐的算法。这些推荐算法随后会被全国范围内的设计师所监管,从而形成个性化风格的推荐。

微服务架构是渐进演化的。像 eBay Twitter Amazon 这样的组织都经历了一些架构的迭代,从单体应用转换成了微服务。

微服务除了具有单一的目的、定义良好的接口、模块化和独立性之外,还需要负责隔离持久化。Shoup 讨论了一些持久化的方式,比如操作自己的数据存储或使用持久化服务。在第一种方式中,会将数据存储在自己的数据库实例中,这个实例是由服务团队拥有并进行运维的。而如果采用持久化服务的话,我们会将数据存储在数据库的一个单独的模式中,由其他团队或第三方供应商以服务的方式进行运维。数据应该是与服务的其他消费者相隔离的。

事件是微服务架构中的第一类构造。它们代表了现实世界是如何运作的并且保证应用符合一定的领域要求,比如在金融方面。事件是服务接口的重要组成部分,它应该包含服务产生的所有事件以及服务消费的所有事件。

从单体共享数据库抽取微服务一般涉及到如下几个步骤:

  • 创建服务:服务边界应该包含服务本身以及它所面对的数据库;
  • 应用要使用服务:通过使用新创建的服务,让应用与共享数据库解耦;
  • 将数据转移至私有数据库:然后将数据从共享数据库转移至新的私有数据库。这不会对客户端应用造成任何影响,因为它们已经不直接依赖于数据库;
  • 重复操作:为应用中需要抽取成独立微服务的其他业务功能采用相同的过程。

Shoup 还讨论到微服务用例涉及到共享数据(Shared Data)、连接(join)以及事务。

共享数据:创建的服务是单一系统记录(System of Record,SoR)的并且拥有自己的所有数据。数据的其他副本是只读的,只是非权威(non-authoritative)的缓存。为了访问共享数据,我们有三个可选方案:同步查找(一个服务调用另外的服务来获取数据)、具有缓存的异步事件或共享元数据库;

连接:将数据切分为单独的服务会让连接变得很困难。在微服务领域中,我们可以在客户端应用中进行数据连接,或者是通过监听两个服务的事件,创建“物化视图(Materialized Views)”,并在本地存储中维护非规格化(denormalized)的两个数据集的连接结果。

事务:在单体应用中,事务管理非常容易,但是在微服务架构中却非常困难,因为数据被拆分到了多个不同的服务中了。我们可以将事务实现为一种工作流,它会按照倒序使用补偿操作从而形成一种回滚机制。很多现实系统已经采用了这种方式,比如支付处理和费用审批的系统。这些流程也是采用功能即服务( Serverless 架构)的理想候选方案。

查看英文原文 Managing Data in Microservices

2017-07-05 19:006115

评论

发布
暂无评论
发现更多内容

架构实战训练营模块一

人生就是梦

架构实战营

Generic Type Variance in Dart

Think

flutter dart 泛型

前端应用部署k8s的平滑发布问题

小江

k8s 大前端 发布流程

k8s replicaset controller源码分析(3)-expectations机制分析

良凯尔

Kubernetes 源码分析 Kubernetes源码 #Kubernetes#

官方线索|Bilibili1024程序员节

搬砖人

1024我在现场

ARouter 拦截器之多 module 独立运行

逆锋起笔

android 组件化 arouter

分布式事务开山之作——《深入理解分布式事务:原理与实战》草图曝光!!

冰河

数据库 分布式 分布式事务 微服务 数据一致性

架构实战营 - 模块六作业

Alex.Wu

weblogic 报 java.lang.OutOfMemoryError:PermGen space

看山

Java 10月月更

面试官:如何回答消息队列的丢失、重复与积压问题

Java 程序员 架构 面试

不是吧?阿里“百万级”性能优化小册居然能让系统运行得这么快

Java 编程 程序员 性能优化

拆分电商系统微服务

毛先生

软件架构设计原则之里氏替换原则

Tom弹架构

Java 架构 设计模式 设计原则

设计原则学习笔记

风翱

设计原则 10月月更

架构实战营模块6课后作业 拆分电商系统为微服务

apple

在 Vue3中使用Fabric.js实现渐变(Gradient)效果,包括径向渐变radial

德育处主任

JavaScript 大前端 vite Vue3 FabricJS

架构实战营模块一作业

spark99

架构实战营

软件架构设计原则之开闭原则

Tom弹架构

Java 架构 设计模式 设计原则

普通本科毕业一年,刷完这1000道JAVA面试题,成功逆袭上岸

Java 编程 程序员 面试 大厂面试

又真香了!到底是怎样的JAVA面试文档,拿到这么多offer

Java 编程 程序员 面试

软件架构设计原则之依赖倒置原则

Tom弹架构

Java 架构 设计模式 设计原则

软件架构设计原则之单一职责原则

Tom弹架构

Java 架构 设计模式 设计原则

k8s replicaset controller源码分析(2)-核心处理逻辑分析

良凯尔

Kubernetes 源码分析 Kubernetes源码 #Kubernetes#

京东架构师珍藏版:redis深度笔记(全彩版)全篇精华,细节满满

Java 程序员 架构 面试 rediis

架构实战营 - 模块六作业

en

#架构实战营

Spring版本命名规则

Tom弹架构

Java spring 架构

软件架构设计原则之接口隔离原则

Tom弹架构

Java 架构 设计模式 设计原则

软件架构设计原则之迪米特法则

Tom弹架构

Java 架构 设计模式 设计原则

软件架构设计原则之合成复用原则

Tom弹架构

Java 架构 设计模式 设计原则

架构实战训练营|课后作业|模块 6

Frode

「架构实战营」

Spring 5系统架构

Tom弹架构

Java spring 架构

在微服务中如何管理数据_QCon_Srini Penchikala_InfoQ精选文章