NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

在微服务中保证服务的一致性

  • 2016-03-22
  • 本文字数:1142 字

    阅读完需:约 4 分钟

在近期举办的 QCon London 大会上, Ben Stopford 在他的演讲中极力主张拥抱去集中化的思想、构建基于服务的系统,并通过流处理工具解决分布式状态所引起的问题。

Stopford 目前任职于 Confluent,参与 Kafka 的开发工作。对他来说,构建基于服务的系统的理由有很多,包括松耦合、边界上下文、易于扩展等等,这些特性让我们能够构建出可以随着时间的推移而不断改进的系统。但是,通过这种方式,我们实质上是在创建分布式的系统,而分布式系统自有其本身的复杂性,并且在延迟与故障等方面还存在着种种问题。

Stopford 描述了分布式系统的两种基本模式:

  • 请求 - 响应的方式对服务进行解耦,通常使用 REST 的服务实现。它很适合于 UI 以及提问的场景。
  • 事件驱动,这种模式的特征是异步的,或是“fire and forget”的消息传递。它非常适合于设计跨服务的复杂依赖。

这两种模式可以结合使用,例如使用请求 - 响应模式实现一个 REST 接口,随后以事件的方式进行后台处理。

Stopford 随后对异步与基于事件的通信,例如队列的使用展开了讨论。他认为这种模型非常简单,只要做到一次只取出一条消息,就能够保证消息的次序。即使将这一方式进行一定程度的扩展,仍然可以保证它的次序,但 Stopford 指出,在某些情况下,我们或许会失去可用性或是次序的保证。他还指出了该方式的另一个缺点,即消息的存在是短期的,因此服务一旦出现故障,就无法回到之前的时间点再次读取这些消息了。

Stopford 认为,更好的方法是使用某种分布式日志支持服务的开发,并以 Kafka 为例。Kafka 是基于日志的概念而设计的,而日志是一种只增的数据结构。因此读写操作都非常高效,对于读操作来说,只需定位到某个位置,并进行顺序读取。而对写操作来说,所做的只是简单的添加而已。

分布式的日志系统还能够为微服务带来以下好处:

  • 始终在线,这依赖于某种容错的代理,例如 Kafka。
  • 负载均衡,每个服务实例都将从一个代理中读取数据。
  • 容错性,这是因为服务可能会产生故障转移,但消息的次序仍然保持不变。
  • 倒带和回放,当系统发现了某个错误并修复之后,服务可以找回原始的消息,并进行回放。

但这种方式仍然有一个未解决的问题,即保持服务的一致性。因为在系统发生故障等一些情况下,很难避免出现一些重复的消息(“即至少一次”的提交机制)。因此,服务在处理他们收到的消息时必须保证幂等性(idempotent)。从逻辑上说,这相当于创建了一种“正好一次”的提交机制。Stopford 表示,这一功能在Kafka 中尚未实现(但相关功能已经在开发中了)。

Martin Kleppmann 在本次大会的另一场演讲中也提到了服务一致性的问题。

QCon 的参会者已经可以欣赏 Stopford 的演讲了,而 InfoQ 的读者很快也能够欣赏到演讲的内容。Stopford 同时也发布了这次演讲的幻灯片

查看英文原文 Microservices for a Streaming World

2016-03-22 19:005011
用户头像

发布了 428 篇内容, 共 172.0 次阅读, 收获喜欢 38 次。

关注

评论

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

GitHub上最火的SpringCloud微服务商城系统项目,附全套教程

Java架构之路

Java 程序员 架构 面试 编程语言

「架构师训练营」第 3周作业

小黄鱼

极客大学架构师训练营

囚徒困境:跳脱思维的牢笼

多元思维力-晓陶

认知 思维 多元思维力

week3 代码重构 -作业一

杨斌

科学家联合提出基于区块链的追溯框架

CECBC

区块链 农业

LeetCode题解:231. 2的幂,位运算取二进制中最右边的1,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

架构师训练营第 1 期 - 第七周作业

Todd-Lee

极客大学架构师训练营

架构师训练营 1 期第 7 周:性能优化(一)- 作业

piercebn

极客大学架构师训练营

架构师训练营 - 第三周课后练习

joshuamai

区块链追溯系统迎来新突破

CECBC

区块链 溯源 产品溯源

三、设计模式

Geek_28b526

Spring Data Jpa deleteAll大概了解

ilovealt

Java jpa

区块链将颠覆和改变传统金融业底层逻辑

CECBC

区块链 数字经济

Java键值对排序

ilovealt

Java

Week 7 性能优化总结

黄立

week3 代码重构 学习总结

杨斌

Fedora32安装和卸载openjdk11

ilovealt

Linux Openjdk

架构师训练营 1 期第 7 周:性能优化(一)- 总结

piercebn

极客大学架构师训练营

极客大学 - 架构师训练营 第七周作业

9527

穿越时空的回响:华为欧洲创新日的蝴蝶振翅

脑极体

查漏补缺:166个最常用的Linux命令,哪些你还不知道?

小Q

Java Linux 程序员 操作系统 开发

一定要偷偷学,偷偷进步!腾讯内部首发Java多线程、高并发、设计模式“满级”笔记

Java架构追梦

Java 架构 面试 设计模式 多线程与高并发

第二章课后习题

博博

Week 7 作业一

黄立

架构师训练营第 1 期 - 第七周总结

Todd-Lee

极客大学架构师训练营

目标检测之YOLOv2

Dreamer

爆火!阿里P9用500多页手册搞定双十一高并发秒杀系统,绝了

996小迁

Java 架构 面试 高并发 秒杀系统

Spring+多线程+集合+MVC+数据结构算法 +MyBatis源码学习笔记分享

Java架构之路

Java 程序员 架构 面试 编程语言

读完Java名著《Effective Java》: 我整理了这50条技巧

Java架构之路

Java 程序员 架构 面试 编程语言

工作1-3年的程序员,应该具备怎么样的技术能力?该如何提升?

Java架构师迁哥

单例模式样例

jorden wang

在微服务中保证服务的一致性_语言 & 开发_Jan Stenberg_InfoQ精选文章