ActiveMQ 和消息简介
Apache ActiveMQ 是远程系统间进行通信的消息代理,实现了 JMS(Java Message Service,Java 消息服务)。尽管 ActiveMQ 是使用 Java 写的,但是其提供了众多语言(包括 C/C++,.NET,Perl,PHP,Python,Ruby等)的 API。本书提供了商业应用里配置,使用 ActiveMQ 需要的知识。
第一部分,我们将简单介绍 ActiveMQ 带你入门。我们讨论跟面向消息的中间件和 JMS 相关的概念以便你能了解企业消息发展背景。我们介绍了书中的例子,包括它们的使用场景以及如何运行这些例子。我们将在全书中使用这些例子,所以学习每章时透彻理解这些例子是非常重要的。第一部分提供了学习本书剩余章节的基础知识。
背景
企业消息软件早在 1980 年就存在了。它不仅是应用之间进行交流的一种方式,也是集成的一种方式。但是,开源的解决方案在近十年快速增多。Apache ActiveMQ 就是这么一种解决方案,它为应用提供了一种异步地,松耦合地,通信方式。这章将向你介绍 ActiveMQ。
ActiveMQ 是来自 Apache 软件基金会遵从 Java Message Service(JMS)1.1 规范的面向消息的中间件,它提供了高可用性,高性能,可伸缩性以及安全的企业消息服务。ActiveMQ 使用了 Apache 许可,Apache 许可是自由的,商业友好的许可证书。也因此,任何人都可以使用和修改 ActiveMQ 并重新发布而不需要任何咨询。这对于商业公司在基础架构上免费使用 ActiveMQ 是非常重要的。正如第二章描述的那样,一个面向消息的中间件充当了多个应用间事件交流的媒介,保证了它们可以被准确地送达接收者那里。因此,高可用性,高性能,和可伸缩性对一个消息中间件来说是非常重要的。
ActiveMQ 的目标提供跨越多种编程语言和平台的标准的消息中间件。ActiveMQ 实现了 JMS 规范并额外提供了一打的特性。额外的特性我们将在本书的其他章节详细介绍。
你学习ActiveMQ 的爱之初体验对你今后能否成功地运用 ActiveMQ 是非常重要的。对于菜鸟来说,ActiveMQ 看起来可能是非常复杂难学的,但是对于经验丰富的老手来说,它是非常容易理解的。本章就是以一种轻松的方式带你熟悉 ActiveMQ。你将不仅学习 ActiveMQ 的特性,也能了解到在你的开发中为什么使用 ActiveMQ 以及何时使用 ActiveMQ。
ActiveMQ 特性
经过多年的努力改进,ActiveMQ 提供了很多丰富的特性。我们将在本书讨论的特性如下:
- 服从 JMS 规范:ActiveMQ 是 JMS 1.1 规范的一种实现。正如本章后面要说的,JMS 规范提供了良好的标准和保证,包括:同步或异步的消息分发,一次和仅一次的消息分发,消息接收和订阅等等。遵从 JMS 规范的好处在于,不论使用什么 JMS 实现提供者,这些基础特性都是可用的。
- 连接性:ActiveMQ 提供了广泛的连接选项,支持的协议有:HTTP/S,IP 多播,SSL,STOMP,TCP,UDP,XMPP等等。对众多协议的支持让 ActiveMQ 拥有了很好的灵活性。许多已存在的系统使用了一个特定的协议且没有其他可选项,这对于使用者来说有非常高的学习门槛。尽管连接性是非常重要的,但和其他容器的集成也是非常重要的。第四章就主要讲解了 ActiveMQ 中传输层的连接和网络的连接。
- 持久化插件和安全插件:ActiveMQ 提供了多种持久化选择。而且,ActiveMQ 的安全性也可以完全依据用户需求进行自定义鉴权和授权。例如,ActiveMQ 使用了 KahaDB 实现了自身的持久化功能,但它也提供了标准的 JDBC 的访问支持。ActiveMQ 不光支持使用配置文件进行鉴权和授权,也支持标准的 JAAS 登录模块。这两个主题将在第 5 章 和 第 6 章讨论。
- 使用 Java 构建面向消息的应用:ActiveMQ 大部分是用于 Java 应用中来发送和接收消息。我们将在第 7 章讨论 JMS 规范 API 的使用。
- 和应用服务器集成:ActiveMQ 通常的用法是和应用服务器集成。第 8 章将提供具体的 ActiveMQ 和流行的应用服务(包括:Apache Tomcat,Jetty, Apache Geronimo 以及 JBoss)进行集成的例子。
- 客户端 API:ActiveMQ 为众多编程语言提供了完整的 API,除了 Java 之外,还有:C/C++,.NET,Perl,PHP,Python,Ruby 等等。所以在除了 Java 之外的其他编程语言的世界里也是可以使用 ActiveMQ 的。许多其他编程语言也可以使用 ActiveMQ 提供的所有特性和优势。当然了 ActiveMQ 代理还是运行于 Java 虚拟机之上,但是客户端可以使用支持的任何语言来编写。我们将在第 9 章讨论客户端的连接问题。
- 代理集群:多个 ActiveMQ 代理可以组成一个集群来提供服务。我们将在第 10 章讨论这个话题。
- 众多高级代理特性和客户端可选项:ActiveMQ 提供了很多复杂的特性用于代理和客户端连接代理。ActiveMQ 也支持使用 Apache Camel 在 XML 配置文件中使用。我们将在第 11 章和第 12 章讨论这些高级特性。
- 异常简单的管理:ActiveMQ 是以开发者思维被设计的。所以,它并不需要专门的管理员,因为它提供了简单又使用的管理特性。有很多中方法可以监控 ActiveMQ 不同层面的数据,包括使用在 JConsole 或者 ActiveMQ 的Web Console 中使用 JMX,通过处理 JMX 的告警消息,通过使用命令行脚本,甚至可以通过监控各种类型的日志。我们将在第 14 章讨论这些内容。
这里只是对 ActiveMQ 特性的初体验。正如上面所说,这些主题将在本书后面的章节逐步讲解。为了演示的目的,我们提供了几个例子,这些例子将在第 3 章开始引入。但是在提供这些例子之前,想必你定是想问为什么要使用 ActiveMQ?
为什么使用 ActiveMQ?
早在 2003 年,一群开源社区的开发者走到一块组建了 Apache Geronimo。之所以这么做,是因为他们发现世界上竟然没有一个使用了 BSD 风格许可证的好用的消息代理。Geronimo 为了兼容 Java EE,需要实现 JMS 规范。这些开发者们都拥有丰富的使用消息代理的经验,有些人甚至以前自己写过简单的消息代理,很快他们开始讨论写一个开源的消息代理的可行性。而当时市场上的消息代理服务都是闭源且收费的,这更刺激了开发者们创建开源消息代理的决心。很快,使用 Apache 许可证的开源消息中间件 ActiveMQ 项目启动了。
那么,我们为什么选择使用 ActiveMQ 呢?
松耦合
松耦合架构一般是相对于基于 RPC(Remote Procedure Calls)的紧耦合架构来说的。这种松耦合架构通常来说是异步的,一个消息发起调用后并不关心其他系统的动作,不同系统间没有独立性和实时性依赖。ActiveMQ 可以为应用提供消息分发到对端的保证。因此,消息生产者仅仅是生产和发送消息,并不关心消息怎么被分发以及何时被分发;消息消费者也是如此,它们不关心消息来自哪里以及它们是怎么被发送到 ActiveMQ 的。这在异构环境下是非常重要的,客户端可以使用不同的语言甚至不同的协议来编写。ActiveMQ 在异构环境中充当中间媒介,以异步的方式和不同系统进行交互。下一章我们再详细讨论这些内容。
当我们设计分布式系统时,耦合性是必然要考虑到的一点。耦合是指两个应用系统或多个应用系统之间的内部独立性。耦合概念的一个简单解释是一个应用的改变是否影响其他系统作出改变。一个应用变化是否会强制引起另外一个应用变化呢?如果是,那么这两个应用就是紧耦合;否则,这两个应用就是松耦合的。一般来说,紧耦合的系统比松耦合的系统更难维护,也就是说,松耦合系统更容易应对将来的变化。
第二章讨论的中间件(包括 COM,CORBA,DCE 以及 EJB)均是使用 RPC 来进行远程通信的,都被认为是紧耦合系统。使用 RPC 后,一个系统调用另外一个系统,调用者将阻塞直到被调用者发回响应。
而在系统架构中加上消息中间件后,系统就成了松耦合的了。
什么时候使用 ActiveMQ
什么时候使用 ActiveMQ 需要我们仔细考虑。下面是一些使用了 ActiveMQ 的场景:
- 异构应用集成:当系统中拥有多种编程语言编写的应用时,使用 ActiveMQ 就行松耦合解耦将是非常合适的。
- 作为 RPC 替代品:使用了 RPC 的系统一般都是紧耦合的同步系统,替换成 ActiveMQ 后就变成了松耦合的异步系统,这两种系统之间的优劣我也就不废话了,大家都懂得。
这里作者扯了一大堆皮,无非就是使用 ActiveMQ 解耦系统,将系统异步化,好处多多之类的!
下载,安装,运行
下载和安装就不必说了,可以直接去官网看文档了!
运行自带的例子的化,可以去读一下 ./docs/user-guide.html
,这个文档浅显易懂,比自己瞎折腾好多了!