第一章

1.2.1小节  松耦合与ActiveMQ

ActiveMQ为应用程序架构提供送耦合实现组件。松耦合经常被引入到系统架构中,来减轻紧耦合的远程工程调用的使用。松耦合的设计是异步的,来自其他系统的调用与其他系统无关,并且没有相互依赖和时间的要求。系统能够通过ActiveMQ确保消息的传送。因此,发送消息的应用程序只要把消息发送给ActiveMQ,而不用关心消息是何时或者什么方式发送出去的。对于消息接收方,它没有必要考虑消息从哪里来或者消息什么时候到达的。在异构的系统架构中,ActiveMQ将体现出它的价值。它允许应用程序使用不同的编程语言和不同的传输协议。ActiveMQ作为中间件,允许异构的系统,以异步的方式交互数据。下面的章节,我们将讲解更多。

在设计分布式系统时,系统的耦合是非常重要的。耦合是指两个或者更多应用程序或系统之间的依赖关系。一个简单的方式理解耦合是考虑,当修改系统中的任何一个程序时,对其他程序的影响(导致多少程序修改)。当修改一个应用程序是不是必须强制修改其他的应用程序?如果答案是:是,那么系统是紧耦合的。换句话说,松耦合的架构,能够应变意料之外的修改或变化。

(COM, CORBA, DCE, and EJB)是紧耦合的系统调用,使用的是RPC。当一个应用程序调用另外一个应用程序的时候,调动者被阻塞,直到被调用者有信息返回时。

调用者被阻塞直到调用的对象有返回信息。许多系统的架构使用RPC,并且成功投产。但是这样的紧耦合设计有很多劣势:显著的问题是,即使很小的系统调整,也需要高额的修改费用。另外,系统的调用时间必须正确。两个应用程序必须在同一时间发送请求到系统B,并返回结果到系统C。在紧耦合的系统设计中,有一种设计两个应用系统是完全相互不知道的。如下图:

如上图,一个应用程序发送消息给消息中间件;或许一段时间后,另一个应用程序从消息中间件中获取消息。两个应用程序根本不知道对方系统的存在,并且发送消息没有时间限制。这样的设计,当一个系统需要修改时,对另一个系统的影响非常小,所以维护的费用就比较低。基于上述原因,当考虑分布式架构时,松耦合的系统比紧耦合的系统提供了更多的优势。这时,ActiveMQ就该上场了。

系统架构设计时,必须考虑系统的改变,改变包括添加新的硬件或者移动服务器。紧耦合的设计系统,在添加新硬件的时候,所有的应用程序可能要经历中断的过程。但松耦合的系统,不同的部分可以单独移动。考虑这样的场景:有多个实例A和多个实例B分别部署在不同的物理机上。ActiveMQ安装在另外一台单独机器上。这种情况下,移动实例A或者实例B,不会影响其他系统。事实上,可以实例化多个ActiveMQ,组成群集。这样允许ActiveMQ实例被移动而不影响整个系统的运行。在多实例(冗余)时,任何部分可以暂停下来进行升级维护,而不影响整个系统。

ActiveMQ提供了极大的灵活性,让松耦合的系统架构成为现实。如果完全一部分方式不能满足系统的需要,ActiveMQ支持消息请求/应答模式。

1.2.1小节  何时使用ActiveMQ

在系统架构中,ActiveMQ和异步消息有很多使用场合。例子如下:

l   ActiveMQ是java语言开发的,客户端当然支持java。但ActiveMQ也支持C、Perl、PHP、Ruby等语言。若你的系统架构中使用不同的语言开发,使用ActiveMQ作为消息中间件,是最好的选择。

l   ActiveMQ将广泛替换RPC风格的同步调用RPC应用。考虑到大部分客户端-服务器应用程序都在使用RPC,包括ATM、web应用程序、信用卡系统、销售点系统等等。尽管这些系统非常成功,更换为使用异步消息会带来好处,但放弃了快速的反应。同步调用的扩展能力是有限的,当请求量比较大时,请求信息将会会缓存或者堵塞,从而影响整个系统的响应速度。

l   作为事件驱动的体系结构,异步的架构允许任意扩容,来处理更多的业务。扩容不仅仅包括增加内存和硬盘(垂直伸缩),也包括随机增加物理处理机(横向扩展)。举例:当我们在亚马孙上购物时,必须经过,下订单、发票创建、付款处理、订单履行、航运等。但是,当用户下单后,立即跳转到“感谢那您的订单” 页面。不仅如此,若果没有延迟,用户还会受到一封电子邮件。在这个过程中,使用了异步调用。当用户下单后,有一个同步调用,以提交订单,而整个订单流程不会同步调用。订单的流程就是依靠异步系统完成的,若流程不能完成将通过邮件通知。这种异步流程满足系统的可扩展性和高可用性。

l   为提高应用程序的可扩展性,许多应用程序使用事件驱动的架构,以提供大规模的可扩展性。这时面向服务的(SOA)的架构,服务和服务之间的通信实现使用异步消息传递,最终达到一致性。

ActiveMQ 翻译第一章 1.2小节(松耦合与ActiveMQ和何时使用ActiveMQ)的更多相关文章

  1. Learning Scrapy 中文版翻译 第一章

    第一章:scrapy介绍 欢迎来到scrapy之旅.通过这本书,我们将帮助你从只会一点或者零基础的Scrapy初学者达到熟练使用这个强大的框架在互联网或者其他资源抓取海量的数据.在这一章节,我们将给你 ...

  2. Gradle2.0用户指南翻译——第一章. 介绍

    翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2 ...

  3. Java 7 Concurrency Cookbook 翻译 第一章 线程管理之一

    一.简介 在计算机的世界里,当我们谈论并发时,我们指的是一系列的任务同时运行于一个计算机中.这里说的同时运行,在计算机拥有多于一个处理器或者是一个多核处理器的时候才是真正的同时,在计算机只拥有单核处理 ...

  4. Java 7 Concurrency Cookbook 翻译 第一章 线程管理之六

    十一.处理线程组中的未控制异常 每种编程语言一个很重要的特性就是其所提供的用来处理程序中错误情况的机制.Java语言和其他的现代语言一样,是提供了异常机制来处理对象程序中的错误.Java提供了很多的类 ...

  5. Java 7 Concurrency Cookbook 翻译 第一章 线程管理之五

    九.使用线程本地变量 一个并发程序的最关键特征就是共享数据.这个特性在那些继承了 Thread 类或者 实现了 Runnable 接口的对象上显得更加重要. 如果你创建一个实现了 Runnable 接 ...

  6. Java 7 Concurrency Cookbook 翻译 第一章 线程管理之四

    七.创建和运行一个后台线程 Java中有一种特别的线程叫做 deamon(后台) 线程.这类线程具有非常低的权限,并且只有在同一个程序中没有其他的正常线程在运行时才会运行.注意:当一个程序中只剩下后台 ...

  7. Java 7 Concurrency Cookbook 翻译 第一章 线程管理之三

    五.睡眠和唤醒一个线程 有时,你会想要在一段特定的时间后再去中断线程的运行.举个例子,程序中的一个线程每一分钟检查一次传感器的状态,剩余的时间,线程应该处于空闲的状态.在这段空闲时间里,线程不会使用计 ...

  8. Java 7 Concurrency Cookbook 翻译 第一章 线程管理之二

    三.中断一个线程 一个拥有多个线程的Java程序要结束,需要满足两个条件之一:一是所有的非后台线程都执行结束了:二是某个线程执行了 System.exit() 方法.当你想要终结一个运行中的Java程 ...

  9. JERSEY中文翻译(第一章、Getting Started、1.1.7)

    最近发现jersey特别流行,但是中文资料非常少,深感没有资料的痛苦,所以分享一下看到的内容供他人快速入门. 今天翻译第一章.Getting Started.https://jersey.java.n ...

随机推荐

  1. DEDE调用指定文章ID来调用特定文档

    http://www.jb51.net/cms/137423.html 代码如下: {dede:arclist row=1 idlist='6'} <li><a href=" ...

  2. Git之2分钟教程

    Git之2分钟入门 普通人:“借我1000块钱”.程序猿:“借你1024吧,凑个整”. 今天是1024,是我们程序员的节日,在此,首先祝各位程序猿以及程序媛们节日快乐~然后送出一份节日礼物,没错,就是 ...

  3. PyInstaller打包python脚本

    用python写的工具写好了,想打包然后发给测试同事使用,最后选择了PyInstaller,支持Windows.Linux.OS X,支持打包成一个文件夹或单个EXE文件.   我是直接在线安装的,在 ...

  4. MySQL != 失效

    字段中包含 NULL 和 其他字符串值时, 字段既包含 NULL 也有字符串类型的值, 使用如下 SQL 无法获取值为 NULL 的部分 SELECT * FROM table_name WHERE ...

  5. [状态更新]MSE三个月快速复习计划,成功考上复旦软工

    最后更新,6月21日收到录取通知书啦,感谢当初不曾放弃的自己: 更新一下状态: 3.3日 分数出来了,过了复试线. 最初写这篇博客的时候,是希望自己能够每天或者至少每周更新下自己的复习状态,这样能够确 ...

  6. Unity3D_异步加载场景(进度条)

    创建两个场景:现在的场景“NowScene”,要加载的场景“LoadScene”: “NowScene”如图所示,“LoadScene”任意: 创建脚本“AsyncLoadScene”,复制如下代码, ...

  7. loadrunner rtsp协议模拟

    在核心网做过3年的sip消息模拟,所以rtsp消息模拟只要知道信令消息交互就非常顺利了 RTSP 实时流传输协议, 是TCP/IP协议体系中的一个应用层协议, 该协议定义了一对多应用程序如何有效地通过 ...

  8. Linux中Source的用法

    source命令:source命令的功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录.用法 ...

  9. 习题:玛丽卡(SPFA)

    玛丽卡(wikioi1021) [题目描述 ]麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复.因为她和他们不住在同一个城市,因此她开始准备她的长途旅行.在这个国家中每两个城市之间最多只有一条路相通, ...

  10. TTL 和 RS-232

    下面详细讲解下面这三种的区别 USB转TTL串口板(常用芯片PL2303,CH340) USB转RS-232串口线 TTL转RS-232串口板,RS-232转TTL串口板(常用芯片MAX3232,MA ...