版权声明:
欢迎转载本站的所有内容,本站的所有文章使用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议,唯一的要求就是保留署名权,请在转载时注明出处。

Bottled Water: PostgreSQL与 Kafka 的实时数据整合

英文版: Bottled Water: Real-time integration of PostgreSQL and Kafka
中文版:
Bottled Water: PostgreSQL与 Kafka 的实时数据整合

写数据库相对容易,读数据库则异常困难。当然,如果你只是查询数据库,拿到一部分值,也还行。但如果你想要将整个数据库中的数据复制到其他系统中去,比如使用Elasticsearch来
做索引,做快速的pre-fill缓存,或是将数据导入到一个数据仓库供统计分析,或是迁移到其他类型的数据库中。

如果数据不会发生变更,实现起来也很简单。只需要一份数据库的快照(通过备份dump整个数据库),复制然后载入到其他系统即可。但问题是如果数据库是持续变更的,
在你载入数据的时候快照中的数据已经不是最新的,即使你采用每日一次快照的方式,在下游系统中你只能拿到滞后一天的数据,对于数据量大的数据库而言,快照和大数据量的加载(bulk load
本身成本就很高。

从一个数据库复制数据到另外的系统中有哪些解决方案呢?

  • 1、第一种是系统实现双写“dual writes”。每当系统进行数据库的写操作的时候,同时更新/校验缓存条目,对搜索引擎的数据重新索引,将数据发送到用于统计分析的系统等等

然而之前我就谈到,双写的方法其实是有很多问题的,主要是Race Condition(也叫做资源竞争)和可靠性的方面。如果稍有差异的数据写到2个不同的数据库中,数据库的内容会慢慢的相差甚远,随着时间的推移会变得越来越不一致。
要想从这样的渐进式的数据损坏中恢复是很困难的。

  • 2、CDC 变更数据捕获
    如果是从数据库的快照中重新构建缓存或索引,这样做的好处在于从新的数据库备份中重新构建时会消除任何的不一致性。但对于大型数据库而言,每天要处理整个数据库备份速度太慢,效率太低,怎么样才能提速呢?

典型的,不同的快照之间数据库只有一小部分会发生变化。如果你只是处理自上次快照之后数据库中发生的那些变更?这样只用处理一小部分数据,也可以频繁的进行比对。比如说每分钟比对一次,每秒比对一次?1秒100次呢?

当比对频率达到极限的时候,数据库的变更就变成了stream流。每次写数据库时,也就是流中的一条消息。如果你把这些消息严格按照原来数据提交时的顺序应用到数据库上,你就可以得到一份和数据库一模一样的副本,这其中的原理也就是数据库复制的原理

复制的方法来保持数据同步比双写的方法要好一些。首先,你只需要写一个数据库。然后从数据库中拿到2个东西:
1、某时刻下满足一致性的快照
2、自那个时刻之后的实时的变更流

你可以将快照导入到其他系统(比如搜索索引或缓存),然后持续的应用这些实时的变更。如果管道是警告调优的,那么你的延迟可能低于1秒,下游系统也可以保持尽可能最新。由于变更流本身包括了写的顺序,资源竞争就不再是问题

这种方法常常称为变更数据捕获,目前现有的一些工具都不是很好用。但在一些公司里,CDC已经成为了系统构建的关键模块,比如Linkedin有Databus。Facebook有Wormhole

CDC 变更数据捕获能够让你释放你已有数据中的价值。你可以将数据“喂”给一个中心式的数据流
这样就可以实时与来自其他数据库的数据或时间流整合起来。这种方式使得新的数据分析或新的数据格式试验更加容易,允许你以一种最小化的风险渐进式地从
一个系统迁移到另一个系统,也比 data corruption更加健壮,如果出了任何问题,你都可以很快的利用快照和流恢复数据库。

获取实时的变更流

获取数据库的一致性快照是一个通用的特性,因为你需要利用它进行备份。但获取实时的变更流是传统数据库一直忽略的一个功能。
Oracle GoldenGate, the MySQL binlog, the MongoDB oplog or the CouchDB changes feed 都是类似的功能,但要想用好都不是那么容易。近来一些数据库如 RethinkDB or Firebase 正在朝着实时变更流的方向努力。

这里我们主要看看PostgreSQL. 它是一个很古老的数据库,但是很好用,很稳定、性能不错,也拥有绝大多数的功能

以前你如果想从Postgres中拿到变更流你必须使用触发器。这样是可以实现,但fiddly,需要变更schema,且性能不大好。但去年12月份发布的Postgresql 9.4引入了一种叫 logical decoding逻辑编码的新特性,

有了logical decoding之后,Postgres的变更数据捕获突然变得更加吸引人。因此,当发布了这一功能之后,我立即利用这一特性开始为Postgres构建一个变更捕获工具Confluent赞助了我这个项目,目前我们发布了一个alpha的开源版本 Bottled Water.

Bottled Water: Data streams freshly bottled at source

Bottled Water简介

Logical decoding利用了数据库的write-ahead log (WAL),能够让我们访问行级别的变更事件:每次一张表的某一行出现插入、更新删除操作。这类事件是利用事务来分组的,是以它们提交到数据库的顺序出现的。流中并不会记录Aborted/rolled-back事务。因此,如果你以同样的顺序应用这些变更事件,就能得到一个与数据库的事务保持一致的副本。

Postgres logical decoding 的设计是很精巧的:利用变更流能够构建出一个一致性的快照来。你可以使用快照来做整个数据库某个时间点的备份,无需锁库即可完成备份,然后通过变更流获取所有自快照之后发生的写操作。

Bottled Water 利用这些特性来复制数据库中的所有数据,将数据编码成 Avro format格式.然后把编码后的数据发送给Kafka — 数据库中的每张表作为一个Kafka topic,数据库中的每一行作为Kafka中的一条消息。

一旦数据导入到Kafka里面,你可以按你所需来编写Kafka consumer that does whatever you need:发送数据给Elasticsearch, 生成一份缓存,在 Samza job中进行处理, 利用Camus将数据导入到HDFS with … 等等

为什么选择 Kafka?

Kafka 是一个消息系统,以大量事件的传输闻名,诸如web服务器日志,用户点击事件。在Kafka里,此类事件通常保留一段时间然后就丢弃掉。 Kafka是否真的适合数据库的变更事件。我们不希望丢掉任何的数据库数据。

事实上, Kafka 是不二之选— 最关键的是Kafka’s log compaction feature, 简直就是为了这个目的量身定做的. 如果你启动log compaction,就不会存在按照时间对数据进行丢弃。相反,每个消息都有一个key,Kafka会无限保留某个
key对应的最新的消息。某个key值之前的消息最终通过garbage-collected来采集。这与key-value键值数据库中使用新的值覆盖旧的值是一样的道理。

Bottled Water确定了 (or replica identity)Postgres中每张表的主键,并将其用作发送给Kafka消息的主键。消息值取决于事件的类型:

  • 对于插入和更新操作,消息值包含了每行所有字段的值,编码成Avro格式
  • 对于删除操作,消息值为null。这样 Kafka 就会在 log compaction时移除消息,这样就释放了磁盘空间

通过log compaction,你不再需要一个系统来存储整个数据库的快照,用另一个系统来处理实时的消息-二者可以在同一个系统中并存。
Bottled Water把最开始的快照按照数据库中每行作为一个消息发送给Kafka,主键作为消息的key,发送给所有Kafka brokers.当处理完了快照,插入的、删除的或更新的每行都被转换成一条消息。

如果某一行频繁更新的话,同一个key就会存在多条消息(每次更新都会产生一条消息)。所幸的是,Kafka’s log compaction会对其进行排序,对以往的值进行garbage-collect处理,这样就不会浪费磁盘空间。另一方面,如果某一行从不更新或删除,在Kafka中也再也不会发生变化,-永远不会进行 garbage-collected.

整个数据库的备份和实时流位于同一个系统中是很有益处的。如果你想从头开始构建一个下游的系统,你可以从一个空的数据库开始,慢慢consuming Kafka topic,浏览所有的topic, 将每一条消息写入到你的数据库当中。完成之后,你便得到了整个数据的最新副本。另外,你可以通过不断的消费流数据来保持最新。给原有的数据做一些新的视图相当之容易。

用Kafka的方式来维护数据库的副本给熟悉传统的企业消息和局限性的人带来了诸多惊喜。事实上,这个应用场景也正是为什么Kafka是基于 replicated log abstraction所构建的:它使得这样一类大规模的数据data retention and distribution 保持和分发成为了可能。下游系统可以自己的意愿重载和重新处理数据,不会影响要求低延迟查询的上游数据库的性能。

为什么选择 Avro?

从Postgres抽取的数据可以编码成JSON, or Protobuf, or Thrift,或其他任意格式. 但是,Avro才是最佳选择。Gwen Shapira 曾经撰文讨论了Avro在schema management中的优点,我也写过一篇 Avro 与Protobuf and Thrift比较的文章 .Confluent流数据平台指南 stream data platform guide中给出了为什么Avro 适合于数据集成的若干理由。

Bottled Water首先检查数据库表的schema,自动为每个表格生成Avro schema,利用Confluent’s schema registry对schema进行注册,将schema的版本嵌入到Avro中
以消息的形式发送给Kafka。也就是说是于流数据平台serializers一起使用:你可以将Postgres中拿到的数据以有价值的业务对象和丰富的数据类型来使用,无需编写大量的解析代码。

Postgres datatypes 到 Avro的转换已经基本上很全面了,涵盖了所有常见的数据类型,提供了一种lossless and sensibly的类型转换。后续我打算对其进行扩展以支持所有Postgres内置的数据类型-虽然工作量很大,但是是值得的,因为一个好的schema对于数据是相当重要的。

Inside the bottle factory

logical decoding输出插件

Postgres’ logical decoding feature的一个有趣之处在于说它并没有定义一种wire format来表示在网络中如何传输变更数据。相反,它定义了output plugin API, 其中对于每一次插入、更新或删除都会收到一个函数调用。 Bottled Water使用这个API来读取数据库内在格式的数据,并将其序列化成Avro格式。

由于 Postgres 扩展机制的原因,输出插件必须用C来编写,并且以共享库的形式导入到数据库服务器中去。这里要求使用超级用户的权限和数据库服务器的文件
访问权限,所以并不是很容易就完成的。这里我理解很多数据库管理会被在数据库服务器上运行自定义代码所吓到。不幸的是,这是目前能够使用logical decoding的唯一方式

所幸的是,你无须在主数据库中安装该插件-你可以使用从属机(replica, hot standby).这样你就能保证该插件不会损坏你的数据,引起主数据库的崩溃或影响其性能。

Bottled Water architecture

client daemon

除了数据库服务器上运行的插件之外, Bottled Water还包含了一个你可以在其他地方运行的客户端程序。它能够连接Postgres 服务器,能够连接 Kafka brokers,接收来自数据库的Avro格式编码的数据,将Avro数据推送给 Kafka。

客户端是使用C编写的,是因为这样使用Postgres 的客户端库文件的最简单的方式,由于客户端和插件之间一部分代码是复用的,相当轻量级,且无须写到磁盘中。

如果客户端发送崩溃,与Postgres or Kafka的连接发生中断会有哪些影响?完全没影响。它会跟踪那条消息已经发布过了,那条消息Kafka brokers已经确认过了。
当出错之后重启客户端时,它会重新发送哪些没有确认过的消息。因此Kafka 中一些消息可能会出现2次,但不会有数据丢失。

相关工作

其他人解决同样问题所做的工作:

  • Decoderbufs是一个试验性的Postgres plugin by Xavier Stevens,将变更流转换成Protocol Buffers 格式.它只是提供 logical decoding plugin —并不包括一致性快照或客户端的部分 (Xavier提到他以前写过一个客户端,读取Postgres中的数据写到Kafka,但目前还不是开源的).
  • pg_kafka (同样是Xavier写的) 是一个Postgres函数形式的Kafka producer client,你可以使用触发器来生成数据给Kafka
  • PGQ 是一个基于Postgres的队列实现, Skytools Londiste (developed at Skype)使用它来做基于触发器的复制。 Bucardo是另一款基于触发器的复制器。就我理解基于触发器的复制是有些黑客味道的(相当有技术含量),
    要对schema进行变更,需要fiddly的配置,要承担巨额的花销。另外,这些项目似乎都没有得到PostgreSQL core team的认可,而 logical decoding is fully supported.
  • Sqoop 最近增加了支持writing to Kafka. 就我所知,Sqoop只能利用数据库的完整快照,无法捕获持续的流数据,同样也无法保证不同快照之间的事务一致性
  • 对于MySQL, James Cheng整理了从MySQL into Kafka的change capture projects的列表,这些项目主要围绕着binlog的解析,并没有做一致性快照的部分、

Bottled Water目前的状态

目前, Bottled Water只是一款alpha的软件.充其量也就是个概念验证— 虽然经过了详细的设计和实现—但仍未在现实世界的系统中得到测试。现阶段还不适合在生产系统中使用,但经过一些测试和调整,希望将来能用在生产系统之中。

我们将其以开源的形式发布出来是希望能够得到社区的反馈。同时,知道我正在完成这个项目的人一直在帮我测bug。

README 包含了如何入门的更多信息。

版权声明:
欢迎转载本站的所有内容,本站的所有文章使用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议,唯一的要求就是保留署名权,请在转载时注明出处。

关系型数据库向KAFKA迁移 FROM RELATIONAL INTO KAFKA

英文版: FROM RELATIONAL INTO KAFKA
中文版:关系型数据库向KAFKA迁移

去年我做了一个极受欢迎的“如何从数据仓库迁移到Hadoop”教程,大概内容可以在percona 会议的网站上
看到。过去的四年我基本上都在和如何从传统ER数据库向Hadoop进行数据迁移打交道。
目前,我正在做的是,如何将数据从数据仓库迁移到 Kafka 。之前我就说过,Hadoop是一个性价比极高的数据仓库的解决方案。但Kafka不是数据仓库,即使你可以直接
用Hive查询Kafka的数据,数据访问的模式是有质的差异。Kafka 是一个很棒的管道和消息总线。

为什么要把数据从关系型数据库迁移到Kafka上呢?因为如果有上以千记的系统都想要访问关系型数据库中的数据,你绝对不想让每个app都能直接访问OLTP数据库 业务数据库
。一旦业务数据库down掉之后,会直接带来经济损失。

把数据从业务数据库中迁移到Kafka中来,这样大家就可以不影响DBA工作的情况下即可访问数据,更重要的是,完全用不到DBA。
要怎么实现数据从业务数据库中迁移到Kafka呢?如果你是个DBA,不了解什么是Kafka,可以看一下这个PPT:Kafka for DBAs
基本上有如下几种方式:

  • 1、Sqoop2能够从支持JDBC的任何数据源把数据导入到Kafka中去。它是直接访问数据库的,你需要DBA的配合。
  • 2、MySQL到Kafka CDCJames Cheng总结了所有与MySQL到Kafka CDC之间数据迁移的项目。
    基于MySQL CDC的方式是很安全的,系统是从数据库的事务日志中拿到数据,无需直接访问生产系统的库表。
  • 3、bottledwater-pgMartin Kleppmann的开源项目,利用Postgres事务日志将Postgres中的数据迁移到Kafka,具体介绍请参考Bottled Water: Real-time integration of PostgreSQL and Kafka.其中导出的数据是Avro格式
    保留了原始数据的schema,其他大部分项目都用的csv的文本格式。
  • 4、对于Oracle的Redo日志而言,GoldenGate
    提供了一个Flume adapter但价格不菲,据说DBVisit正在尝试使用自己的CDC的方式来解决数据从Oracle到Kafka的迁移

等数据迁移到Kafka中的时候,可以做如下选择:

  • 1、使用一些如Cloudera Search, Elastisearch 的文本索引技术
  • 2、使用流处理方式来处理数据,将其导入到NoSQL数据库当做物化视图来使用
  • 3、转移至审计系统
  • 4、转移至监控系统
  • 3、在不同的Dashboard进行展示
  • 3、用作系统缓存

版权声明:
欢迎转载本站的所有内容,本站的所有文章使用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议,唯一的要求就是保留署名权,请在转载时注明出处。

病人记录的健康信息PGHD

patient-generated health-information (PGHI) or patient-generated health data (PGHD). 这样一些在医院、医疗机构之外由患者或护理人员创建、收集、记录的与某个健康问题相关的观察、检验结果、 抑或是对已有EHR中某项数据的确认或变更等信息。

这样的信息在患者诊疗或健康管理过程中究竟应该扮演怎么样的角色?ONC在年底就他们所作的工作编制了这么一个报告,目录结构如下

一 问题是什么

1.临床中的PGHD

2.科研中的PGHD

3.政策上的PGHD

二机会在哪里

三有哪些顾虑

1.医疗机构的顾虑

2.患者的顾虑

3.技术因素

4.隐私与安全问题

四 下一步

整体报告见文件

版权声明:
欢迎转载本站的所有内容,本站的所有文章使用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议,唯一的要求就是保留署名权,请在转载时注明出处。

Yelp公司总结的微服务架构的实践经验

英文版:
Service Principles
中文版:
Yelp公司总结的微服务架构的实践经验/

Service Principles

创建

首先探讨系统的整体架构

在你开始考虑设计服务之初,也就是动手写代码和设计之前,和团队成员、其他服务领域的专家聊一聊。除了如何与现有的特性、产品以及服务如何适配之外,考虑一下你想要额外添加的功能。考虑一种最合理的组织整体功能的方式。有时候添加新功能意味着要对现有组件进行重组。

我们希望避免那些简单的 “append-only”服务架构,也就是说development只存在于新的服务中

核实是否能够给现有服务添加新的功能

在编写新的服务之前,应该核实是否现有服务不包括你的功能。它可能会与现有的功能存在冲突,处理相同的信息,或者只是在现有服务功能范围内的演化。另一方面,如果给现有服务添加新的功能会让服务的使用者感到困惑的话,最好就不要添加新的功能了。

考虑你的功能是否更适合作为一个库

尽管这篇文档是讲服务的,但值得注意的是一些功能更适合做成库。为了帮助大家更好的决策,我们介绍了库与服务之间进行取舍的一些经验:

升级速度 对于库来讲更适合哪些用户期望很长时间才进行升级的场合(通常数周或数月,甚至于数年)。一般来说,这要求功能本身相对小且自包含,所以本身变更的可能就小。相反,如果你还正在进行开发,或者你希望能够快速推送一些bug修订给用户,这样的功能更适合作为一个服务。这样功能就回更复杂一些,常常需要依赖外部的一些库。

性能和可靠性 库与调用请求的寻址空间一样,而服务则处于不同的网络地址。假使其他东西都是一样的,访问一个库 要比服务更快更可靠。但是,如果功能对资源需求较高,比如CPU,内存和硬盘,那么作为一个服务能够让客户端的运行效率更高,能够使得服务所依赖的硬件独立于客户端的硬件而水平扩展。

技术无关性
大多数情况下,Yelp使用的是Python,有一些后台服务是Java的。如果你的服务希望 Python and Java都能调用,那么做成服务能够帮你避免重复写两个库。

服务应由团队而不是个人负责管理

每个服务应由团队而不是个人负责管理,这样出了问题,就不会出现只有一个开发人员知道如何解决bug。实践中也就是说,每个服务从最开始都至少要2个人员参与,分摊维护的责任。

服务是长期的投入

Services are a long-term commitment

当你编写代码时,你的团队会进行持续的维护和运营支持。随着时间推移,你的服务用户将依赖服务才能够运营。你需要持续的监控性能、一致性和 brown-outs.你或许也要处理下游系统的故障。

部署到分布式系统之前的考虑因素

一个服务的推出往往花费的时间比你想象的要长。这可能是由于未预料到的不同服务间的交互,或者是搭建监控环境时的困难所导致的。负载测试没有100%完美的,因此需要部署成功之前制定一个多个阶段和迭代的持续计划。

服务大点更好Prefer larger services

尽量把相关功能整成一个较大的服务而非多个很小的服务。记住 你的大服务应该是逻辑内聚的,比如你仍然要具体的描述服务的功能。该原则的原理如下:

  • 流程内调用比服务间调用要更快、更可靠
  • 单独更改一个服务比在多个服务间协调变更要简单一些。实际上,更改服务接口的成本相对是很高的
  • 在运营层面上,保证统一的流程正常运行的话,数量越少越容易.
  • 有些运维任务必须在每个服务上单独进行,比如库版本的更新。服务更少这个工作量越小

最小化服务调用链的深度

在对服务进行架构时,调用链长度越小越好 (service A calls services B, C and D)比(A calls B calls C calls D)好。原理如下:

  • 更容易来推出调用链; 在长度较小的情况下, B, C and D 没有依赖任何外部的服务,而在较长的情况下B和C服务都依赖其他服务。注意 这与 three-tier architecture很匹配。
  • 这样能提高性能,在较短的情况下,服务的调用可以并发执行(只要服务间互相独立即可)而较长的情况下只能串行执行

最小化你的团队所拥有的服务数目

你所在的团队可能负责某个产品或一些产品的交付。你们所开发的服务应该与这一目标相统一。如果你们所拥有的服务过多,也就是说你的团队过于面面俱到,或者你们服务的统一程度还不够.

如果你们团队已经在负责大量的重要服务,且新功能并不属于任何已有的服务,在你们团队能够接受构建新服务的任务之前你可能需要把任务推出去。也应避免2个以上团队负责某个服务的情况

接口

你的服务接口可能不只是对外发布的REST 接口. 日志、数据备份、数据流等其他服务使用的都要考虑在内。接口指的是对客户端有用的所有东西的总和.

比如我们一直在模仿的接口设计的实践, 参考 GitHub API v3PayPal REST API

接口要易于理解

在设计接口时, 要遵循如下最佳实践:

  • 使用自描述的名称。对内对外保持一直
  • 让领域专家评审你的接口
  • 使用一种显而易见的方式来完成每个操作
  • 在将现有功能移植成服务时不一定会成为最好的网络节点。远端执行会改变一致性、可靠性和性能的本质。设计服务的边界时应保证与其他系统是松耦合的.
  • 将读与更新操作的接口分离. (See CQRS as an example)
  • 尽可能的最小化、简单化你的接口。这样测试起来也方便
  • 尽可能对存在疑虑的地方写上文档
  • 跟自己发问: “在没有和你请教之前,新人能够看懂你的接口?”

接口要尽可能健壮

设计接口时把它当做是暴露给整个互联网来使用的。只暴露那些客户端需要的信息。尽可能不要提供不安全的、高成本的操作

将只读和能够改变状态的方法区分开来。理想情况下,只读方法是可缓存的且是幂等的

接口变更应该要向后兼容

接口应该有某种版本控制机制。当改变一个服务接口时,之前存在的客户端仍然能够调用你之前版本的接口。你不能破坏这些客户端。要么做好计划持续的支持这些旧的客户端,要么花些时间使得它们和更新相协调。同时有多个版本的接口并存是可以接受的。

测试

应该能够对任何接口变更进行自动化测试

Yelp没有单独的QA工程师。相反我们靠计算机来进行校验工作。你的服务由你来负责维护测试工具。测试应该在开发和测试环境中都能够快速可靠的完成。

一个优秀的测试工具就像一个金字塔。最基础的是单元测试:很多快速的很小的测试代码中的单个实现的细节。中间一层是集成测试,这时候对服务进行交互的多个组件进行校验。最上面是很小但很重要的验收测试,主要校验你的服务是否能够与其他服务进行交互

最主要的是测试你的接口

接口是你们协议的重要部分,也就是客户端使用和交互的东西。如果你改变了接口,破坏或改变它原来的功能你会影响所有调用你服务的客户端。这个影响是很大的。

这也就是为什么接口测试是最主要的。接口测试能够告诉你客户端实际看到的是什么,持续的测试能够保证客户端总是看到这些结果。确保接口的所有现用版本的性能是一致的。尽可能早的编写测试,整个黑盒测试所看到的结果应该驱动你的接口设计

运维

服务的运行由你来负责

你的团队负责你们服务的持续运维。运维团队是解决整体站点问题的第一道防线,但是涉及到服务就只能做些边边角角的工作。监控服务的健康度是你的职责所在,做一些有意义的提醒以及出现问题时的方案。你是最了解服务运行机制的人,因此你也是发现和解决问题的最佳人选

为服务编写runbook。其中应包含常见的运维场景(诸如部署、监控和问题处理)。记录已知的错误。

引导客户的诉求

你要能够准确清晰的向客户传达你们服务的运行特征。我们建议你要积极地监控和对服务进行测试以理解这些特征,以确保哪些你所承诺要达到的维护程度。

比如,如果我告诉客户99.99%的正常运行情况下99%的请求都在100ms以下。也就是说我要不停的监控性能和可用性来保证我的承诺。

不同服务运维承诺不同是可取的。a “cat picture of the day”服务的正常运行时间只是团队内部用来调剂气氛的就不需要实时的监控和提醒了。一个生产系统中的对主要节点很重要的服务就需要多关注正常运行时间、性能和其他可能会出现的问题

故障计划

SOA的特质之一是分布式系统中故障场景数量的急剧增加。从运维角度来看,这意味着你的服务必须
strive to be honest about the collaborating services and datastores it requires to operate, and those whose downtime can be gracefully handled.

服务启动之初就要有如何确定外部的依赖关系和记录它们之间关系的计划。外部链接的指标,以及主动式和开发层面的保护措施以保障服务在外部故障之后的处理。最后一点,你要实时的监控这些潜在的weak points,根据严重程度来提醒当班团队.

另外,服务可能在跨机器、跨rack和跨数据中心间运行,每种情况都可能出现故障。要深刻理解这样的场景下服务的表型。

设计良好的服务要考虑所有的故障点,做出合理的决策来减少每个故障的可能性。

补充材料

版权声明:
欢迎转载本站的所有内容,本站的所有文章使用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议,唯一的要求就是保留署名权,请在转载时注明出处。

第四篇-微服务架构在Netflix的应用:团队和流程设计相关的经验教训

<微服务架构在Netflix的应用>系列博文-共四篇

英文版: 第一部分: The Four-Tier Engagement Platform
中文版:第一部分:移动应用所需要的四层架构/

英文版:第二部分:http://nginx.com/blog/time-to-move-to-a-four-tier-application-architecture/
中文版:第二部分:是时候转移到四层架构上来了/

英文版:第三部分:微服务架构在Netflix的应用:架构设计的经验教训
中文版:第三部分:微服务架构在Netflix的应用:架构设计的经验教训

英文版:第四部分:Adopting Microservices at Netflix: Lessons for Team and Process Design
中文版:第四部分:微服务架构在Netflix的应用:团队和流程设计相关的经验教训

In a previous blog post, we shared best practices for designing a microservices architecture, based on Adrian Cockcroft’s presentation at nginx.conf2014 about his experience as Director of Web Engineering and then Cloud Architect at Netflix. In this follow-up post, we’ll review his recommendations for retooling your development team and processes for a smooth transition to microservices.
Optimize for Speed, not Efficiency

Source: Xyzproject@Dreamstime.com

The top lesson that Cockcroft learned at Netflix is that speed wins in the marketplace. If you ask any developer whether a slower development process is better, no one ever says yes. Nor do management or customers ever complain that your development cycle is too fast for them. The need for speed doesn’t just apply to tech companies, either: as software becomes increasingly ubiquitous on the Internet of Things – in cars, appliances, and sensors as well as mobile devices – companies that didn’t used to do software development at all now find that their success depends on being good at it.

Netflix made an early decision to optimize for speed. This refers specifically to tooling your software development process so that you can react quickly to what your customers want, or even better, can create innovative web experiences that attract customers. Speed means learning about your customers and giving them what they want at a faster pace than your competitors. By the time competitors are ready to challenge you in a specific way, you’ve moved on to the next set of improvements.

This approach turns the usual paradigm of optimizing for efficiency on its head. Efficiency generally means trying to control the overall flow of the development process to eliminate duplication of effort and avoid mistakes, with an eye to keeping costs down. The common result is that you end up focusing on savings instead of looking for opportunities that increase revenue.

In Cockcroft’s experience, if you say “I’m doing this because it’s more efficient,” the unintended result is that you’re slowing someone else down. This is not an encouragement to be wasteful, but you should optimize for speed first. Efficiency becomes secondary as you satisfy the constraint that you’re not slowing things down. The way you grow the business to be more efficient is to go faster.
Make Sure Your Assumptions are Still True

Many large companies that have enjoyed success in their market (we can call them incumbents) are finding themselves overtaken by nimbler, usually smaller, organizations (disruptors) that react much more quickly to changing consumer behavior. Their large size isn’t necessarily the root of the problem – Netflix is no longer a small company, for example. As Cockcroft sees it, the main cause of difficulty for industry incumbents is that they’re operating under business assumptions that are no longer true. Or, as Will Rogers put it,

It’s not what we don’t know that hurts. It’s what we know that ain’t so.”

Of course, you have to make assumptions as you formulate a business model, and then it makes sense to optimize your business practices around them. The danger comes from sticking with assumptions after they’re no longer true, which means you’re optimizing on the wrong thing. That’s when you become vulnerable to industry disruptors who are making the right assumptions and optimizations for the current business climate.

As examples, consider the following assumptions that hold sway at many incumbents. We’ll examine them further in the indicated sections and describe the approach Netflix adopted.

Computing power is expensive. This was true when increasing your computing capacity required capital expenditure on computer hardware. See Put Your Infrastructure in the Cloud.
Process prevents problems. At many companies, the standard response to something going wrong is to add a preventative step to the relevant procedure. See Create a High Freedom, High Responsibility Culture with Less Process.

Here are some ways to avoid holding onto assumptions that have passed their expiration date:

As obvious as it might seem, you need to make your assumptions explicit, then periodically review them to make sure they still hold true.
Keep aware of technological trends. As an example, the cost of solid state storage drive (SSDs) storage continues to go down. It’s still more expensive than regular disks, but the cost difference is becoming small enough that many companies are deciding the superior performance is worth paying a bit more for. [Ed: In this entertaining video, Fastly founder and CEO Artur Bergman explains why he believes SSDs are always the right choice.]
Talk to people who aren’t your customers. This is especially necessary for incumbents, who need to make sure that potential new customers are interested in their product. Otherwise, they don’t hear about the fact that they’re not being used. As an example, some vendors in the storage space are building hyper-converged systems even as more and more companies are storing their data in the cloud and using open source storage management software. Netflix, for example, stores data on Amazon Web Services (AWS) servers with SSDs and manages it with Apache Cassandra. A single specialist in Java distributed systems is managing the entire configuration without any commercial storage tools or help from engineers specializing in storage, SAN, or backup.
Don’t base your future strategy on current IT spending, but instead on level of adoption by developers. Suppose that your company accounts for nearly all spending in the market for proprietary virtualization software, but then a competitor starts offering an open source-based product at only 1% the cost of yours. If people start choosing it instead of your product, than at the point that your share of total spending is still 90%, your market share has declined to only 10%. If you’re only attending to your revenue, it seems like you’re still in good shape, but 10% of market share can collapse really quickly.

Put Your Infrastructure in the Cloud
Source: Fbmadeira | Dreamstime.com

Source: Fbmadeira@Dreamstime.com

In Make Sure Your Assumptions are Still True, we mentioned that in the past it was valid to base your business plan on the assumption that computing power was expensive, because it was: the only way to increase your computing capacity was to buy computer hardware. You could then make money by using this expensive resource in the right way to solve customer problems.

The advent of cloud computing has pretty much completely invalidated this assumption. It is now possible to buy the amount of capacity you need when you need it, and to pay for only the time you actually use it. The new assumption you need to make is that (virtual) machines are ephemeral. You can create and destroy them at the touch of a button or a call to an API, without any need to negotiate with other departments in your company.

One way to think of this change is that the self-service cloud makes formerly impossible things instantaneous. All of Netflix’s engineers are in California, but they manage a worldwide infrastructure. The cloud enables them to experiment and determine whether (for example) adding servers in particular location improves performance. Suppose they notice problems with video delivery in Brazil. They can easily set up 100 cloud server instances in São Paulo within a couple hours. If after a week they determine that the difference in delivery speed and reliability isn’t large enought to justify the cost of the additional server instances, they can shut them down just as quickly and easily as they created them.

This kind of experiment would be so expensive with a traditional infrastructure that you would never attempt it. You would have to hire an agent in São Paulo to coordinate the project, find a data center, satisfy Brazilian government regulations, ship machines to Brazil, and so on. It would be six months before you could even run the test and find out that increased local capacity didn’t improve your delivery speed.
Create a High Freedom, High Responsibility Culture with Less Process

In Make Sure Your Assumptions are Still True, we observed that many companies create rules and processes to prevent problems. When someone makes a mistake, they add a rule to the HR manual that says “well, don’t do that again.” If you read some HR manuals from this perspective, you can extract a historical record of everything that went wrong at the company. When something goes wrong in the development process, the corresponding reaction is to add a new step to the procedure. The major problem with creating process to prevent problems is that over time you build up complex “scar tissue” processes that slow you down.

Netflix doesn’t have an HR manual. There is a single guideline: “Act in NetFlix’s best interest.” The idea is that if an employee can’t figure out how to interpret the guideline in a given situation, he or she doesn’t have enough judgment to work there. If you don’t trust the judgment of the people on your team, you have to ask why you’re employing them. It’s true that you’ll have to fire people occasionally for violating the guideline. Overall, the high level of mutual trust among members of a team, and across the company as a whole, becomes a strong binding force.

The following books outline new ways of thinking about process if you’re looking to transform your organization:

The Goal: A Process of Ongoing Improvement by Eliyahu M. Goldratt and Jeff Cox. This book has become a standard management text at business schools since its original publication in 1984. Written as a novel about a manager who has only 90 days to improve performance at his factory or have it closed down, it embodies Goldratt’s Theory of Constraints in the context of process control and automation.
The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win by Gene Kim and Kevin Behr. As the title indicates, it’s also a novel, about an IT manager who has 90 days to save a project that’s late and over budget, or his entire department will be outsourced. He discovers DevOps as the solution to his problem.

Replace Silos with Microservice Teams

Most software development groups are separated into silos, with no overlap of personnel between them. The standard process for a software development project starts with the product manager meeting with the user experience and development groups to discuss ideas for new features. After the idea is implemented in code, the code is passed to the quality assurance (QA) and database administration teams and discussed in more meetings. Communication with the system, network, and SAN administrators is often via tickets. The whole process tends to be slow and loaded with overhead.
silos-base

Source: Adrian Cockcroft

Some companies try to speed up by creating small “start-up”-style teams that handle the development process from end to end, or sometimes such teams are the result of acquisitions where the acquired company continues to run independently as a separate division. But if the small teams are still doing monolithic delivery, there are usually still handoffs between individuals or groups with responsibility for different functions. The process suffers from the same problems as monolithic delivery in larger companies – it’s simply not very efficient or agile.
Source: Adrian Cockcroft

Source: Adrian Cockcroft

Conway’s law says that the interface structure of a software system will reflect the social structure of the organization that produced it. So if you want to switch to a microservices architecture, you need to organize your staff into product teams and use DevOps methodology. There are no longer distinct product managers, UX managers, development managers, and so on, managing downward in their silos. There is a manager for each product feature (implemented as a microservice), who supervises a team that handles all aspects of software development for the microservice, from conception through deployment. The platform team provides infrastructure support that the product teams access via APIs. At Netflix, the platform team was mostly AWS in Seattle, with some Netflix-managed infrastructure layers built on top. But it doesn’t matter whether your cloud platform is in-house or public; the important thing is that it’s API-driven, self-service, and automatable.
Source: Adrian Cockcroft

Source: Adrian Cockcroft

Adopt Continuous Delivery, Guided by the OODA Loop

A siloed team organization is usually paired with monolithic delivery model, in which an integrated, multi-function application is released as a unit (often version-numbered) on a regular schedule. Most software development teams use this model initially because it is relatively simple and works well enough with a small number of developers (say, 50 or fewer). However, as the team grows it becomes a real issue when you discover a bug in one developer’s code during QA or production testing and the work of 99 other developers is blocked from release until the bug is fixed.

In 2009 Netflix adopted a continuous delivery model, which meshes perfectly with a microservices architecture. Each microservice represents a single product feature that can be updated independently of the other microservices and on its own schedule. Discovering a bug in a microservice has no effect on the release schedule of any other microservice. Continuous delivery relies on packaging microservices in standard containers. Netflix initially used AWS machine images (AMIs) and it was possible to deploy an update into a test or production environment in about 10 minutes. With Docker, that time is reduced even further, to mere seconds in some cases.

At Netflix, the conceptual framework for continuous development and delivery is an Observe-Orient-Decide-Act (OODA) loop.
Source: Adrian Cockcroft (http://www.slideshare.net/adrianco)

Source: Adrian Cockcroft (http://www.slideshare.net/adrianco)

Observe refers to examining your current status to look for places where you can innovate. You want your company culture to implicitly authorize anyone who notices an opportunity to start a project to exploit it. For example, you might notice what the diagram calls a “customer pain point”: a lot of people abandoning the registration process on your website when they reach a certain step. You can undertake a project to investigate why and fix the problem.

Orient refers to analyzing metrics to understand the reasons for the phenomena you’ve observed at the Observe point. Often this involves analyzing large amounts of unstructured data, such as log files; this is often referred to as big data analysis. The answers you’re looking for are not already in your business intelligence database. You’re examining data that no one has previously looked at and asking questions that haven’t been asked before.

Decide refers to developing and executing a project plan. Company culture is a big factor at this point. As previously discussed, in a high-freedom, high-responsibility culture you don’t need to get management approval before starting to make changes. You share your plan, but you don’t have to ask for permission.

Act refers to testing your solution and putting it into production. You deploy a microservice that includes your incremental feature to a cloud environment, where it’s automatically put into an AB test to compare it to the previous solution, side by side, for as long as it takes to collect the data that shows whether your approach is better. Cooperating microservices aren’t disrupted, and customers don’t see your changes unless they’re selected for the test. If your solution is better, you deploy it into production. It doesn’t have to be a big improvement, either. If the number of clients for your microservice is large enough, then even a fraction of a percent improvement (in response time, say) can be shown to be statistically valid, and the cumulative effect over time of many small changes can be significant.

Now you’re back at the Observe point. You don’t always have to perform all the steps or do them in strict order, either. The important characteristic of the process is that it enables you quickly to determine what your customers want and to create it for them. Cockcroft says “it’s hard not to win” if you’re basing your moves on enough data points and your competitors are making guesses that take months to be proven or disproven.

The state of art is to circle the loop every one to two weeks, but every microservice team can do it independently. With microservices you can go much faster because you’re not trying to get entire company going around the loop in lockstep.
How NGINX Plus Can Help

At NGINX we believe it’s crucial to your future success that you adopt a 4-tier application architecture in which applications are developed and deployed as sets of microservices. We hope the information we’ve shared in this post and its predecessor, Adopting Microservices at Netflix: Lessons for Architectural Design, are helpful as you plan your transition to today’s state-of-the-art architecture for application development.

When it’s time to deliver your apps, NGINX Plus offers an application delivery platform that provides the superior performance, reliability, and scalability your users expect. Fully adopting a microservices-based architecture is easier and more likely to succeed when you move to a single software tool for web serving, load balancing, and content caching. NGINX Plus combines those functions and more in one easy to deploy and manage package. Our approach empowers developers to define and control the flawless delivery of their microservices, while respecting the standards and best practices put into place by a platform team. Click here to learn more about how NGINX Plus can help your applications succeed.

版权声明:
欢迎转载本站的所有内容,本站的所有文章使用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议,唯一的要求就是保留署名权,请在转载时注明出处。

第三篇-微服务架构在Netflix的应用:架构设计的经验教训

<微服务架构在Netflix的应用>系列博文-共四篇

英文版: 第一部分: The Four-Tier Engagement Platform
中文版:
第一部分:移动应用所需要的四层架构/

英文版: 第二部分:http://nginx.com/blog/time-to-move-to-a-four-tier-application-architecture/
中文版:
第二部分:是时候转移到四层架构上来了/

英文版: 第三部分:微服务架构在Netflix的应用:架构设计的经验教训
中文版:
第三部分:微服务架构在Netflix的应用:架构设计的经验教训

英文版:
第四部分:Adopting Microservices at Netflix: Lessons for Team and Process Design
中文版:
第四部分:微服务架构在Netflix的应用:团队和流程设计相关的经验教训

在最近的一些博客里我们解释了采用四层的架构对于开发和部署微服务的应用程序是很重要的。
如果你仍然采用十年前的开发流程和应用架构,你不能很快地获取和满足移动端用户的需求,移动端用户可以从越来越多的APP中进行选择。

向微服务架构的转换给市场上的公司带来了很多的机会。对于系统架构和开发人员,它在为用户提供新的用户体验的同时又带来了一种前所未有的控制力和速度。但在现在这样紧张的节骨眼上,感觉上是不允许出一点差错的。现实世界中,你不可能革新期间就停止APP的开发和部署的。你深深明白未来的成功取决于能否成功迁移到微服务架构中来,但是你该怎么来做呢?

Netflix_Logo_Digital+Video

幸运的是,微服务的早期实践者本着开源的精神慷慨地分享他们的专业知识,不仅有开源代码,也会在会议上做一些演讲,写一些博客。Netflix就是其中之一。Adrian Cockcroft作为web工程和云计算架构师总监负责监督了公司内负责DVD租赁系统的100人的工程师团队从传统开发模式到只需要很少人员负责数百个后台服务的微服务架构来为数百万的Nrtflix客户提供数字娱乐服务。Battery Ventures公司的技术人员Cockcroft是微服务和云架构方面著名的布道者,目前供职于Nginx技术咨询委员会。
后续的两篇文章中,我们会给大家将一些从去年Cockcroft做的2场演讲,一场是10月的NGINX大会上,一场是几个月之后的硅谷微服务meetup中的一些启发。

  • 这篇里面主要是给微服务架构一个定义,阐述了一些设计微服务架构的最佳实践
  • 后面的一篇讨论了采用软件设计新思路以及绕着这种新思路来重组团队的原因和方式。

什么是微服务架构?

Cockcroft 把微服务架构定义为由松耦合的有相应语境的元素构成的一种面向服务的架构

松耦合意味着你可以独立更新这些服务。更新其中一个服务并不会改变其他的服务。
如果你的系统里有大量的特殊服务,但是又必须同时更新它们,它们又不是微服务,因为它们不是松耦合的。在向微服务迁移的时候人们常常会把数据库的耦合看的过重,也就是所有服务都连的是同一个数据库,更新其中一个服务就意味着要改变数据库的schema。这种情况你需要对数据库进行拆分

bounded contexts的概念来源于Eric Evans的书 Domain Driven Design 。就软件开发的目的而言,拥有恰当语境的微服务本身是自包含的。由于微服务和其他微服务之间交互是严格通过API来进行的,你不需要共享数据结构、数据库表结构和对象的内部表达形式,在不了解其他服务的内部结构的情况下你也可以理解和更新一个微服务的代码。

如果你开发的是互联网应用,你已经很熟悉这些概念了,实际上只不过用的不是同样的叫法。大多数移动APP都用到了一些后台服务,这样用户可以在APP里实现Facebook里共享、从Google Map里得到地理位置、在Foursquare找到一家餐馆。假如你的APP与这些服务是紧耦合的,这样你在更新之前必须与开发团队进行协调来确保你的更新不会破坏任何东西。

在使用微服务架构时,你要把其他的开发团队看作是这些后台服务:也就是那些你的微服务通过API交互的外部服务。微服务之间最通用的协议就是它们的API足够稳定,也是向前兼容的。

就跟Google Map 的API不可能事先提醒就进行更改是不能所接受的,这样的话,你是API可以演进,但是必须要与之前的版本兼容

微服务架构设计的最佳实践

Cockcroft解释他在Netflix的职位是云架构师,他的职责不是管理架构,而是发现和标准化公司工程师所形成的架构。Netflix开发团队提出了几条设计和实现微服务架构的最佳实践

每个微服务的数据单独存储

不同微服务不要使用同一个后台数据存储。让开发团队选择适合每个微服务的数据库。或许,不同团队使用同样的数据结构来存储会减少工作量,但当其中某个团队想要更改数据结构的时候,其他服务不得不跟着改变。

数据的拆分会使得数据管理异常复杂,是因为单独的存储系统不容易同步,易于出现不一致的情况,外键也会发生意外的改变。你需要一个后台运行的主数据管理的工具来发现和修复不一致的情况。比如,你需要检查每个存储订阅者ID的数据库来确保所有的ID都是同一个。这个工具可以自己写或者直接买。很多商用的关系型数据库都提供此类核对,它常常过于耦合,不能支持很好的伸缩性。

使用类似程度的成熟度来维护代码

微服务中所有代码都保持同样的类似程度的成熟度和稳定度。也就是说,你想要重写或给一个运行良好的已部署好的微服务添加一些代码的话,最好的方式常常 是对于新的或要改动的代码,新建一个微服务,现有的微服务丢着不管就行。 [编辑注:这种架构常常称之为immutable infrastructure principle.] 这样的话,你可以迭代式的部署和测试新代码,直至没有bug,性能足够好,现有的微服务不会出现故障或性能下降.一旦新的微服务和原始的服务一样稳定,如果确实需要进行功能合并的话,你可以将其合并在一起,或者处于性能的考虑合并它们。然而,就Cockcroft’s的经验来讲,常常是你发现你的服务太大而要进行拆分。

每个微服务都单独进行编译构建

每个微服务都单独进行编译构建,这样你就从代码库里某个版本中抽取单独的组件。这样,你可以拿到多个类似文件的微服务,但却是不同的版本的。这样如果要对codebase进行清理会比较麻烦,但对于在新建微服务时添加新文件时的便利性的话,是值得的。The asymmetry is intentional: 你想要引入新的微服务、文件或者功能,很容易又不会存在风险

部署到容器之中

将微服务部署到容器中很重要是因为这意味着你需要一款部署的工具。只要一个微服务是在容器之中,该工具就应该知道如何部署。无论是那种容器都没有关系。也就是说,Docker看起来很快会成为容器的行业标准。

将服务器看做是无状态的

将那些特别是部署了客户端代码的服务器视作是可替换的一组之中的一个。这些服务器的功能都是一样的,你无须关心某一个。只需要关心要实现你的目标是否数量足够,你可以使用自动伸缩来按需调整数目。如果其中一个服务器宕机了,可以由其他一个替换。避免了那些单个服务器完成特殊功能的系统中存在的雪崩现象,

Cockcroft打了个比方,你把服务器看做奶牛而不是宠物。如果生产系统中某个服务器负责某个特殊的功能,你通过名称认识这个服务器,这个服务器宕机后大家都回很难过,这也就是一个宠物。相反,如果你把服务器看作是一些奶牛。你关心的是你每天能挤多少奶,如果有一天你发现今天挤的奶少了,你知道是哪头牛有问题,你可以换掉它。

Netflix Delivery Architecture is Built on nginx

下面是一段软广吧。不过nginx还是很NB的。
Netflix is a longtime nginx user and became the first customer of NGINX, Inc. after it incorporated in 2011. Indeed, Netflix chose nginx as the heart of their delivery infrastructure, the Netflix Open Connect Content Delivery Network (CDN), one of the largest CDNs in the world. With the ability to serve thousands, and sometimes millions, of requests per second, nginx is an optimal solution for high-performance HTTP delivery and enables companies like Netflix to offer high-quality digital experiences to millions of customers every day.

Video Recordings

Fast Delivery

Fast Delivery nginx.conf2014, October 2014

Migrating to Microservices, Part 1

Migrating to Microservices, Part 1 Silicon Valley Microservices Meetup, August 2014

Migrating to Microservices, Part 2

Silicon Valley Microservices Meetup, August 2014

版权声明:
欢迎转载本站的所有内容,本站的所有文章使用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议,唯一的要求就是保留署名权,请在转载时注明出处。

第二篇-是时候转移到四层架构上来了

<微服务架构在Netflix的应用>系列博文-共四篇

英文版: 第一部分: The Four-Tier Engagement Platform
中文版:
第一部分:移动应用所需要的四层架构/

英文版: 第二部分:http://nginx.com/blog/time-to-move-to-a-four-tier-application-architecture/
中文版:
第二部分:是时候转移到四层架构上来了/

英文版: 第三部分:微服务架构在Netflix的应用:架构设计的经验教训
中文版:
第三部分:微服务架构在Netflix的应用:架构设计的经验教训

英文版:
第四部分:Adopting Microservices at Netflix: Lessons for Team and Process Design
中文版:
第四部分:微服务架构在Netflix的应用:团队和流程设计相关的经验教训

新年伊始,你也许计划提升你现有的数字化体验或者从头构建新的网站或系统。如果你要做这些都话,首要的你要牢记在心的是”web“不再只是指 ”web browser“。专家这些年一直在提”mobile first approach“来进行系统开发。但今年的移动流量已经增长至接近60%,这已经是不能再拖的了。互联式设备数量的激增,流量从桌面端向移动端的转变,万物互联的潮水意味着项目必须以不同设备上的用户体验为出发点。
过去的专注于单个集成式的包含大多数功能和特性的整体式模型-既往的应用架构开始不适合这个你需要根据特殊设备特殊用户来调整用户体验的年代。此外,你不能通过很多旧的架构模式和行为实现现如今的系统所要求的敏捷性、灵活性和可扩展性的要求。

为了开发和部署能够有效的吸引和留住不同设备上的移动端的APP,你需要有一种崭新的应用设计的思路。本文中将会阐述为何整体式的架构模型不再适用,同时介绍一种新的架构模型,能够帮助你迎接当今web,乃至于未来web的挑战。

为什么软件架构的标准在变化


Monolithic Architecture, Source: Martin Fowler
在传统的 monolithic 架构中,应用程序处于中间那层,也就是说前端是展现层,后端是数据层。应用程序将数据传输给web浏览器,也就是展现层,它能给用户提供向应用程序请求信息、展现信息、管理和更改信息的方式,应用程序读写信息到数据层,数据层也就是数据库或其他存储设备负责管理和维护数据。应用程序本身负责与前后两层之间进行交互的业务逻辑以及数据的转换。

并不是monolithic架构自身存在缺陷,只是它已经过时了,在智能手机和其他移动设备设计之前就已经存在了,那时候应用程序在展现层只需要跟一种实体进行交互,这种缺陷并不是由于层数亦或是层与层之间数据的处理方式,而是应用程序本身被写成一个单独的统一的代码块。monolithic的天性导致开发人员很难用敏捷性和灵活性对应用程序进行改造以适应移动终端用户的需求,满足运营团队自由伸缩应用程序规模以满足实际的需求。

monolithic 的设计理念阻碍了应用程序开发流程诸多阶段的敏捷性。即使应用程序的功能是以模块化方式组织的,人以模块的更改都需要对整个应用程序进行编译和测试。这本身是恨耗时的,对于那些一年内只更新很少次的公司来讲可能是可以接受的,但要跟上如今的大环境,一年只更新几次的APP恐怕难以在竞争中存活下来。你需要很快的响应渐进式的更新来为用户提供更好的性能和最新的功能。在这样的一个世界里,更新APP永远不会给大多数用户带来不便。

Source: Martin Fowler


Microservices Architecture, Source: Martin Fowler

将应用程序拆分成模块长久以来被视为最佳实践。最近,开源项目的成功使得多数开发人员能够借助外部的一些库来实现特殊的功能。这些开源库常常用于那些开发人员不熟悉的特殊功能,或仅仅是为了节省时间,或者是出于维护安全性的考虑。对于 monolithic设计而言 就不存在从诸多方案中任选其一的灵活性,应用程序往往是由一些高度耦合的组件开发而成。

最后一点,三层架构缺乏伸缩性。事实上,提出这种架构理念的年代并不存在 elasticity and rapid scaling 。由于应用程序的功能组件是打包成一个整体的,你要响应客户端需求变更的唯一方式就是对整体进行扩展。由于应用程序是紧耦合的,三层架构的应用程序通常是没有办法对某个特殊部分单独进行扩展的。不管是一个电子商务的平台、社交媒体的应用还是一个博客,现如今应用程序的基本要求是能够按需伸缩,成本越低越好。对应用程序进行伸缩控制的过程要简单、自动化和智能。比如说某个应用架构能够让你根据用户注册的突发量来部署额外的Node.js节点。

版权声明:
欢迎转载本站的所有内容,本站的所有文章使用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议,唯一的要求就是保留署名权,请在转载时注明出处。

第一篇-移动应用所需要的四层架构

<微服务架构在Netflix的应用>系列博文-共四篇

英文版: 第一部分: The Four-Tier Engagement Platform
中文版:
第一部分:移动应用所需要的四层架构/

英文版: 第二部分:http://nginx.com/blog/time-to-move-to-a-four-tier-application-architecture/
中文版:
第二部分:是时候转移到四层架构上来了/

英文版: 第三部分:微服务架构在Netflix的应用:架构设计的经验教训
中文版:
第三部分:微服务架构在Netflix的应用:架构设计的经验教训

英文版:
第四部分:Adopting Microservices at Netflix: Lessons for Team and Process Design
中文版:
第四部分:微服务架构在Netflix的应用:团队和流程设计相关的经验教训

Michael Facemire, John McCarthy和作者最近向整个软件技术行业发起了倡议:老式的web不是为移动APP和网站而设计的,也不能处理互联式产品的实时需求。是时候提出一种新架构了。

大致总结如下:

移动互联网把传统的web架构推到了悬崖的边缘。为传统PC的浏览器而设计的三层架构不够灵活,不能很好地扩展,也不能提供良好的移动端的用户体验,满足互联式产品的新兴需求。移动互联网的volatility and velocity of change需要的是一种分布式的四层架构,我们称之为“engagement platform”。
这个平台能够将技术功能分成4部分:客户端、分发端、集成聚合端、和服务端。

移动互联网APP的新需求需要将CDN、应用服务器供应商、移动端中间件供应商、PAAS供应商、各种初创公司和其他公司围绕着这四层架构整合起来。
CIO需要立即规划从三层架构到四层架构的迁移工作。

是时候扔掉三层架构,即表现层、应用层和数据层,转向能够满足新需求的四层架构模型:

“engagement platform”支持分布式的四层架构,能够提供优质的用户体验、优异的性能,以及与任何设备之间的模块化集成。

Figure 1 The Four-Tier Engagement Platform Makes Delivery Its Own Tier

四层架构的处理流程如下:

  • 客户端层负责不同设备的唯一性的确定。 这一展现层将每个app以及设备(桌面端、移动端,浏览器或原生APP)的特殊功能与后台应用程序的服务隔离起来。这个边界使得开发人员可以将后台服务的开发与消费它们的app独立开来,比如航班状态和入港通知等等。确定明确的边界提高了开发人员的效率,无需顾及繁重的维护工作,一个良好的网络环境也是很重要的。
  • 分发层处理中间的和最后一英里的问题。通过客户端层的信息决定交付特定场景下具体内容的最佳方式。通过over-the-wire的内容转换—这里与聚合层不同,聚合层使用的基于协议的转换,利用 edge-of-network cache 功能来增加动态数据, 如Akamar等提供的CDN、如Instart Logic的分发优化方案、如Riverbed Stingray的应用分发控制和on-premises in-memory database caches一起完成这方面的任务
  • 聚合层负责内部和外部服务的集成和数据的转换。这样的API层有两方面的角色,不同APP请求和服务
    的发现和客户端请求与后台服务的双向转换。这样能够使得底层数据的组装和服务更加简洁,能够提供相对实时的数据格式的转换。服务组合外加上商务智能、分析、基于角色的访问等更加动态。
  • 服务层包括了内部外部提供数据和功能。通过一系列连贯的可部署的服务来动态组装服务和业务流程。
    该层负责为上述三层提供数据,不关心数据具体如何使用。其他几层可以部署在防火墙内也可以部署在防火墙外,或者二种方式相结合。这样不论是APP使用还是生态系统中其他系统使用,在服务的动态组合和访问上就提供了相当的灵活性

未来的展望

问: 如果未来是engagement platform的天下,如何实现呢?

答: 颠覆现在的软件行业的核心架构。IBM, Microsoft, Oracle, and Akamai一直在推三层架构,现在将被
Netflix, Kinvey, and Salesforce.com提出的四层架构所替代。

是时候供应商、投资人员、架构师和开发人员对如何来构建和使用engagement platform展开讨论了。

engagement platform”支持分布式的四层架构,能够提供优质的用户体验、优异的性能,以及与任何设备之间的模块化集成,并且能够推动这些颠覆的演化:

  • 公司将依赖于供应商的生态系统来deliver engagement. 你无须购买这个engagement platform平台。而且这个engagement platform平台也不是全部受你直接控制。相反,你以松耦合的方式组装各种
    engagement 功能,而且能够按需扩展,同时能够保持灵活性,也能够解决持续交付的问题。
  • HTTP traffic on Nginx will surpass the traffic on Apache. If you don’t know what those things are, don’t worry about it. If you don’t but think you should, then see the last chart here and learn about it here and here.
  • IBM, Oracle, Microsoft, SAP, and Salesforce.com will rethink their middleware products and architectures. Adding mobile app lipstick on an application server won’t solve the delivery challenge by itself. These companies will slowly overcome their reluctance and begin to operate in a four-tier, ecosystem-dependent platform. But it will take five years for that to happen. Microsoft Azure is the farthest along, but still tentative in its strategy and execution.
  • The content delivery network industry will accumulate content and performance optimization services. Akamai, Limelight, and Amazon CloudFront have done good work for the Web. But new approaches from Instart Logic and rumblings from Akamai point to the delivery-tier future.
  • Platform-as-a-service providers like Amazon, Google, IBM, Microsoft, and Salesforce will grow many new platform services. For example, services in the aggregation tier loosely coupled with an intelligent delivery tier will handle notification at scale, including personalized messages, open-message analytics, and device and network customization.

FHIR标准

大多数在HIT这个行业浸淫略久的人都听到过HL7的字眼,HIT 行业的标准不外乎有2个目的,交互共享数据(HL7 V2消息,V3消息,CDA,X12,共享文档规范诸如此类),表达医疗行业的知识(各类术语字典,数据集数据元标准,Arden syntax,CDSC,GELLO诸如此类),而FHIR应该归属于第一类,与它的前辈不同的是,它抛弃了既往顺着发展了10多年,乃至于20年的那块田(封闭又自恃过高,怎么说这点呢,所有的标准文件都有自己独特的脱离了整个软件行业的编辑器生成,这些模型也不能为其他通用型软件所读取,最可恨的是没有配套的各种开源库开放给大家试错,降低学习成本,恶心的是居然个破标准还要收费),也就是在上世纪90年代末XML在整个软件领域刮起一阵风,到处都在说系统集成时应运而生的V3消息,CDA等,毫无疑问它们都是为不同厂家的不同系统之间交换数据而生的,而它们的下场都很惨,用现在的话说,都不够敏捷,学习成本过高,迭代也不够快。

在FHIR卷土重来的时候就把基调定好了,思想上这次要全面拥抱互联网技术,用通用的互联网技术来做原来没有成功的事情,仍然还是想实现医疗健康领域数据的无缝流动,打通整个数据闭环。 它的诱人之处我认为有如下三点:
1、过去的很多年,美国人造了各种各样的标准,国际友人也造了各式各样的轮子来解决上面的问题,最近的2-3年里很多人抛出了这样一个问题,能不能用同一种模型,经过适当的演化就能表达医疗数据(电子病历、健康档案、个人健康记录),又能表达医学知识(临床指南类决策支持用的知识,质控指标类的知识),就目前FHIR发展的现状来看,这是一个还不错的选择。有很多这方面的尝试,美国的ONC最近也在这件事上砸了些钱希望能推动的更快一些。
2、拥抱互联网技术
卫生部这几年在推的区域平台、医院平台的技术点在我看来离现如今的互联网技术太远了,作为已经被抛弃的SOAP流的SOA架构的残留物,着实没听到在BAT等企业有何应用,最近几年在人人学Amazon的同事,新浪、京东等一批国内 企业都在推一个叫open API 或者是restful api或者叫HTTP API的东东,以此来解决各自内部千千万产品间、产品内部的数据流动的问题,简而言之就是以一种方式圈定某个领域的业务对象,每种对象都使用同样的方法来实现一些功能,类比到厨艺的话,就是说约定好如何区分食材,每种食材都有哪些烹饪方法,这样子整个医疗领域就大约有100-200种资源(最小的信息单元,当然这里面的粒度的拿捏很是讲究),用到的“烹饪方法”就是HTTP协议定义好的(诸如put/post/get等)。数据本身的表达格式也从原来V2 V3单纯的EDI格式、XML格式演化到了目前比较流行的JSON,以后或许还会演化出其他更为适合的方式。这件事情一方面降低了学习认知整个标准的门槛,另一方面即使不使用它所规定的格式,顺着这样的思路,你也能解决一些问题,这里的问题不单单是之前它的老前辈(v2\v3\cda)所更care的产品与产品间的数据交换数据共享,你也可以借此实现产品内部的功能(京东的李大学总裁就介绍过它们在这方面的一些探索和实践),比如面临的移动端和PC端开发时功能复用的问题。当然也有人会问,这东西能作为数据的存储模型来用么,这个问题是HL7 V3 RIM CDA所没能很好的解决的问题,它们的抽象程度太高了,但时代变了,Nosql数据库现在已经有很多 可供选择,如果你要使用关系型数据库的话,也有一些这方面的探索可供参考。
3、尽管国内目前关注度不够,但在著名的代码托管平台Github上已经有大量的各种编程语言(java c# dephi javascipt swift等)、各种平台可用的一些开源代码,有适合PC端的,也有适合移动端的,这是很喜人的。

欢迎交流,联系方式:
webChat:搜索“妞妞她爹”
qq:512139097
群:
奉上一些链接供大家把玩
1、汉化版https://github.com/wanghaisheng/fhir-cn
英文版http://hl7.org/implement/standards/fhir/
2、开源库
https://github.com/jamesagnew/hapi-fhir
https://github.com/smart-on-fhir/smart-on-fhir.github.io
https://github.com/fhirbase

互联网医疗在过去的一年里如火如荼,希望大家能够一起来汉化和开发FHIR相关的产品
FHIR – Fast Health Interoperable Resources (hl7.org/fhir) – 是由HL7创建的新一代标准框架.FHIR 整合了 HL7 V2,V3 和 CDA 的优点,同时利用了最新的Web标准,紧紧围绕着 implementability 可实现性.

FHIR 解决方案是基于一些称之为“资源”的模块化组件的. 这些资源可以很容易的组装进生产系统中,以已有方案的一小部分成本来解决实际的临床和管理上存在的问题.
FHIR适用于多种场景– 智能手机APP、云平台上的通信、基于EHR的数据共享、大型医疗机构内服务器通信和其他。

更多相关信息可以查看
http://wanghaisheng.github.io/fhir-cn/doc/summary.html
http://wanghaisheng.github.io/fhir-cn/doc/overview.html
一、汉化工作我已经开了个头
1、https://github.com/wanghaisheng/fhir-cn
二、可以山寨借鉴学习的有
https://github.com/jamesagnew/hapi-fhir
https://github.com/smart-on-fhir/smart-on-fhir.github.io

讨论群组
194806088

互联网医疗的APP store 小伙伴们在哪里

早上起来在HIT最有价值的CIO群里爬楼,看到宁老的下面一段话:
“发现很多医院在找这个软件那个软件的,如果能有人把所有软件列成清单,搞一个软件超市或软件交易平台,是不是可以帮助到大家呢,用户和厂家都可以在软件超市里逛,平台化交易。”
估计有这种想法的人也不在少数,又在网上搜了一大圈,满地的各种“产业联盟” 各种“学会、协会”,干活的着实太少,最近的这一年真是蛮热闹,独领风骚的Dr2也承诺要开放源代码,打造医疗领域的大平台,只是不见其动静。
晚上又到处逛,看了一下这个网站,比我们国内的众多联盟靠谱多了,https://healthservices.atlassian … Platform+Consortium
被所谓的宗旨再一次冲昏了头脑
“定义开放的标准(当然不是自己造,能站在巨人肩膀上就站上,HL7 FHIR, SNOMED, LOINC, etc)来促进医疗服务和医疗软件组件的互操作性和数据共享加快基于标准的医疗软件开发速度,提供sandox环境来进行调试、一致性测评和认证提供一个类似APP store的平台来促进产品的推广和应用

又热血青年了一把,有没有人一起搞呀,业余的哈,找几个小伙伴做点有意义的事情嘛。
具体的设计的话可以抄这个https://www.mashape.com/explore