西维蜀黍

【Distributed System】SOA 与 MicroServices

要知道,我们对 SOA 概念的理解其实是在不断的变化。

SOA(Service Oriented Architecture,服务导向架构)

从最初的 SOA 概念来说,SOA 主要为了解决一个大系统中不同子系统的相互操作性(interopearability),即为了实现这个大系统,我们希望能够复用已经存在或者说已经开发好的小系统(它们可能基于不同的编程语言,甚至运行在不同的操作系统下)。因此,这也可以描述为系统的集成(integration)问题。

因此,在那时候,我们有了 ESB (Enterprise Service Bus,企业服务总线)、WSDL、BPEL 和 SOAP 等等这些概念。它们都是为了解决系统的集成问题而诞生的。

企业服务总线(Enterprise Service Bus,ESB)

**企业服务总线(Enterprise Service Bus,ESB)**的概念是从服务导向架构(Service Oriented Architecture, SOA)发展而来。SOA描述了一种IT基础设施的应用集成模型;其中的软构件集是以一种定义清晰的层次化结构来相互耦合。一个ESB是一个预先组装的SOA实现,它包含了实现SOA分层目标所必需的基础功能部件。

在企业计算领域,企业服务总线是指由中间件基础设施产品技术实现的、 通过事件驱动和基于XML消息引擎,为更复杂的面向服务的架构提供的软件架构的构造物。企业服务总线通常在企业消息系统上提供一个抽象层,使得集成架构师能够不用编码而是利用消息的价值完成集成工作。

需要明确的是,企业服务总线本质上解决的是一个大系统的集成问题,或者说这个大系统中不同子系统之间相互依赖的问题。

场景

Background

假设一下你通过银行前端的应用登入银行,会发生什么呢?

  1. 会显示你的名字
  2. 会显示你的账号余额
  3. 会展示你的信用卡和借记卡
  4. 会列出你的共同基金
  5. 会列出一些你可能感兴趣的,预先被计算好的,有吸引力收益的借贷产品

现在,很可能所有这些模块都来自于不同的系统和应用,通过各种接口把数据展示出来

  1. 是来自在linux和Oracle的CRM系统
  2. 是来自z/OS大型机的COBOL系统
  3. 据说是来自大型机,但是他们的嘴巴很紧,不肯告诉你任何事情,只提供CSV文件。
  4. 来自跑在Windows的混合着PHP和Ruby
  5. 来自Postgresql,Python和Java,跑在Linux和Solaris的

在下图,每条不同宽度或者样式的线表示了app之间的调用

如果你觉得上面这种情况你还可以勉强维护,那下面这种情况呢?

你可以处理400个吗?2000个怎么样?每个应用都有自己独特的生态系统,都需要用10个物理服务器或者设备跑在上面。所以,就好比有2万个移动的群体散落在大陆上,并且有着各自的技术的或者文化的边界。 所有这些群体彼此之间需要不断的,持续的交换信息,聊天,一刻也停不下来。

对这种情况,有个很好的名字,叫一团糟。

  ...


【Docker】减小 Docker 镜像体积

Problem

在构建 Docker 容器时,应该尽量想办法获得体积更小的镜像,因为传输和部署体积较小的镜像速度更快。

但 RUN 语句总是会创建一个新层,而且在生成镜像之前还需要使用很多中间文件,在这种情况下,该如何获得体积更小的镜像呢?

  ...


【Performance】性能指标(Performance Indicator)

Aspects of performance

Computer performance metrics (things to measure) include availability, response time, channel capacity, latency, completion time, service time, bandwidth, throughput, relative efficiency, scalability, performance per watt, compression ratio, instruction path length and speed up. CPU benchmarks are available.

Availability

Availability of a system is typically measured as a factor of its reliability - as reliability increases, so does availability (that is, less downtime). Availability of a system may also be increased by the strategy of focusing on increasing testability and maintainability and not on reliability. Improving maintainability is generally easier than reliability. Maintainability estimates (Repair rates) are also generally more accurate. However, because the uncertainties in the reliability estimates are in most cases very large, it is likely to dominate the availability (prediction uncertainty) problem, even while maintainability levels are very high.

  ...


【Java】集合类 - Queue - PriorityQueue类(优先队列)

PriorityQueue类

PriorityQueue 类在 Java 1.5 中引入。

PriorityQueue 是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的 Comparator 在队列实例化的时排序。

默认情况下,为最小堆(这意味着,通过 queue.poll() 方法获取的第一个元素为队列中的最小值)。

PriorityQueue 不允许空值,而且不支持 non-comparable(不可比较)的对象,比如用户自定义的类。优先队列要求使用 Java Comparable 和 Comparator 接口给对象排序,并且在排序时会按照优先级处理其中的元素。

PriorityQueue 的大小是不受限制的,但在创建时可以指定初始大小。当我们向优先队列增加元素的时候,队列大小会自动增加。

PriorityQueue 是非线程安全的,所以 Java 提供了 PriorityBlockingQueue(实现 BlockingQueue接口)用于Java 多线程环境。

  ...


【Linux】命令 - sed

Usage

usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
  • -i:直接修改文件内容

    # 将 pets.txt 文件中所有 abc 替换成 123 并写回原文件中
    $ sed -i "s/abc/123/g" pets.txt
    

开头 s - 替换匹配字符串

我使用下面的这段文本做演示:

$ cat pets.txt
This is my cat
  my cat's name is betty
This is my dog
  my dog's name is frank
This is my fish
  my fish's name is george
This is my goat
  my goat's name is adam

把其中的 my 字符串替换成 Wei’s,下面的语句应该很好理解

  • s 表示替换命令
  • /my/ 表示匹配my
  • /Wei’s/ 表示把匹配字符串替换成 Wei’s
  • /g 表示把一行中所有的匹配字符串都进行替换,如果没有 g 则只有每行第一个匹配的 my 被替换成 Wei’s
$ sed "s/my/Wei's/g" pets.txt
This is Wei's cat
  Wei's cat's name is betty
This is Wei's dog
  Wei's dog's name is frank
This is Wei's fish
  Wei's fish's name is george
This is Wei's goat
  Wei's goat's name is adam

注意:如果你要使用单引号,那么你没办法通过 \这样来转义。因此,用双引号就可以了,因为,在双引号内可以用 \” 来实现对双引号的转义。

  ...