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

在近期举办的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同时也发布了这次演讲的幻灯片。

本文转自d1net(转载)

时间: 2024-08-01 10:04:02

在微服务中保证服务的一致性的相关文章

微服务架构下的事务一致性保证

今天我给大家分享的题目是微服务架构下的事务一致性保证. 主要内容包括4部分: 传统分布式事务不是微服务中一致性的最佳选择 微服务架构中应满足数据最终一致性原则 微服务架构实现最终一致性的三种模式 对账是最后的终极防线. 我们先来看一下第一部分,传统使用本地事务和分布式事务保证一致性 传统单机应用一般都会使用一个关系型数据库,好处是应用可以使用 ACID transactions.为保证一致性我们只需要:开始一个事务,改变(插入,删除,更新)很多行,然后提交事务(如果有异常时回滚事务).更进一步,

在微服务中使用领域事件

稍微回想一下计算机硬件的工作原理我们便不难发现,整个计算机的工作过程其实就是一个对事件的处理过程.当你点击鼠标.敲击键盘或者插上U盘时,计算机便以中断的形式处理各种外部事件.在软件开发领域,事件驱动架构(Event Driven Architecture,EDA)早已被开发者用于各种实践,典型的应用场景比如浏览器对用户输入的处理.消息机制以及SOA.最近几年重新进入开发者视野的响应式编程(Reactive Programming)更是将事件作为该编程模型中的一等公民.可见,"事件"这个

在微服务中如何管理数据

来自Stitch Fix团队的工程副总裁Randy Shoup在QCon纽约2017会议上讨论了如何在基于微服务的应用中管理数据和隔离持久化.他还介绍了将事件(Event)作为微服务的第一类构造.他介绍自己的团队将机器学习技术应用到了业务的各个组成部分,比如购买.库存管理以及风格推荐等. 个性化推荐会基于库存运行机器学习,从而创建出推荐的算法.这些推荐算法随后会被全国范围内的设计师所监管,从而形成个性化风格的推荐. 微服务架构是渐进演化的.像eBay.Twitter和Amazon这样的组织都经历

多租户微服务中使用Java Config注册HSF服务

有了速卖通中间件的spring-boot-starter-hsf,在基于Spring Boot微服务中使用HSF,是件简单而惬意的事情. 我们首先来看最简单的服务注册 @HSFProvider(serviceInterface = QasHsfService.class, serviceVersion = "1.0.0.qas", serviceGroup = "HSF") public class QasHsfServiceImpl implements QasH

当Docker遇到数据库:在阿里云容器服务中使用RDS

Docker与持久化服务 最近一段时间以来,微服务架构和Docker成为了技术社区的"网红".其背后的原因是将微服务与Docker的结合在一起对现有的软件生命周期从架构设计.开发测试到运维迭代构成了一种"颠覆性"的力量:微服务鼓励开发者将整个软件解构为较小的功能组件:每个组件能够独立开发.运维.伸缩和容错:组件之间通过标准的服务接口进行通信,而组件可以选择最适合的技术栈来实现.而容器技术进一步拓展了这种解耦性,它能够将软件与其部署环境分离,利用容器敏捷和可移植的使得

在SEO服务中我们需要让客户了解到的优化常识

如果是有一个客户找你做他们的网站seo服务,你应该如何来让客户了解到整个seo的过程呢,有哪些是必须要让客户知道的优化常识,有哪些是需要我们让客户对我们感到满意的几点,让客户感觉我们真正的实在为用户服务,这样下去,才可以真正的做好我们的服务,毕竟一个网站交到我们手上之火,也一定要做出一定的调整和成绩,才能让接单之风一直延续下去 首先呢,不要承诺让一个关键字常年第一,因为没有办法保证 关键字常年第一?你可以做到吗?试着问一下自己,在百度算法日益更新的今天,可能你都不知道自己做了什么,让百度去除了自

用Java客户机调用Web服务: J2SE和J2EE环境中Web服务客户机简介

Web 服务的力量在于互操作性.由于业界在 Web 服务技术方面(SOAP.WSDL.UDDI)的协作,更具体地说,是由于 Web 服务互操作性组织(Web Services Interoperability organization,WS-I.org)的工作,Web 服务才可以与其他的 Web 服务进行交互,而不管 Web 服务开发和运行在哪一个平台上(比如是 Microsoft .NET 还是 IBM WebSphere).Web 服务客户机分为多种类型,比如另一个 Web 服务.用脚本语言

azure-Windows Azure 服务如何保证用户的数据和服务安全性?

问题描述 Windows Azure 服务如何保证用户的数据和服务安全性? Windows Azure 服务如何保证用户的数据和服务安全性? 解决方案 您好,关于这个问题,仅以您参考官网(http://www.windowsazure.cn/support/faq/) ""中国地区的 Windows Azure 服务如何保证用户的数据和服务安全性?""的说明:_云服务的安全性和稳定性一直是业界关注的焦点.作为首个落地中国市场的国际公有云服务,世纪互联运营的 Wind

大家都能看懂的云计算!理清云服务中最基本的那些事儿

亚马逊AWS.微软Azure.阿里Aliyun组成的3A团队连续多季度保持高速增长.AWS通过光环新网实现商用,IBM Bluemix则由世纪互联提供运营,国际云服务商陆续来了.Openstack发布Newton版本,看上去就没有不能支持的东西,私有云的春天真的来了吗?Docker红得发紫,与之对应的DevOps和NoOps持续高温.但是对于不少企业尤其是传统企业,云仍在天边,对于云仍感觉云里雾里.上云还是不上云,上什么云,这是个问题.我们试着用最通俗的比喻,理清云服务中最基本的那些事儿. 什么