本文基于ActiveMQ In Action,所用版本为ActiveMQ 5.4.1。
Why we need a MOM
无论是我们熟悉的System V消息队列、POSIX消息队列,还是这种分布式消息队列,都可以认为是进程间通信的一种机制。System V消息队列或POSIX消息队列仅适用于单个系统内进程间的通信,无法进行跨网络的多机进程间通信。当然,你可以将System V消息队列或POSIX消息队列改造成适用于分布式环境,也就是将单系统消息抽象到比Socket通信更高的层次,并提供更抽象的系统接口。让现存的所有系统都进行这种改变可能需要一些时日,而且涉及统一的标准制定(例如POSIX),所以我们暂且不讨论这种可能性,而在各种系统现状的前提下来解决分布式环境下进程间通信的问题。
万幸的是,对于分布式环境中各个实体之间的通信,已经有了比较统一的实用模型,TCP/IP,以太网。虽然仍有其他的协议,但通过各种隧道、映射手段基本可以实现异构网络之间的互联互通,当然,是围绕TCP/IP模型的。通过Socket接口的抽象,已经能够比较容易得进行网络通信,但是从零开始,利用Socket搭建一个能够在各种系统的进程之间安全、可靠地投递大量消息,并且支持各种投递模式的服务仍然很困难,这就是MOM需要做的。
有人会问,为何不用RPC呢。RPC更适用于对实时性要求较高的场景,而在对实时性要求不高的场景中,RPC的优势不再,却还会带来系统各部分紧耦合造成的问题,例如难维护、相互影响、应对变化能力弱。对实时性要求不高的场景,松耦合的架构优势更大,易于维护和扩展、相互影响较小。
松耦合之于紧耦合、异步之于同步,其抽象层次更高。松耦合的系统一定是由很多紧耦合的部分组成的,异步的过程也是由很多同步的过程组成的。假设有Caller、Callee两个子进程需要协作,A可以直接利用RPC调用B的执行逻辑,如果在其之间加上队列Queue,架构变成Caller->Queue->Callee,并且将Queue的长度设置为0,那么和RPC没什么区别(当然长度为0的Queue是不存在的,只是为了解释而已),依然是紧耦合的。随着Queue的长度增大,Caller和Callee之间的耦合性越来越弱,互相的影响越来越小。
总结:
- RPC具有紧耦合的特点,应用之间互相依赖,整个系统依赖链路延迟、带宽、可靠性,可扩展性差,不适合分布式环境(不可靠的网络、多个应用实例);
- MOM具有松耦合的特点,链路之间解耦,适用于分布式环境。
- 进程间通信方式:
- 信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
- 管道:包括无名管道(pipe)、高级管道(popen)、有名管道(named pipe);
- 消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 信号量: 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
- 共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
- 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
- 事件驱动框架常用队列来实现。
Activemq
- 2003,Geronimo,开源
- 企业级面向消息的中间件
- 兼容JMS(Java Message Service)标准(目前1.1)
- 多个附加特性
- Apache Software Foundation
- Apache License
- 高可用性、高性能、可扩展、高可靠、安全
- 客户端C/C++, .NET, Perl, PHP, Python, Ruby等等
Features
JMS compliance
决定了基本特点,只要是兼容JMS的provider,就具有以下基本特点:同步/异步消息投递、一次仅且一次消息投递、持久订阅者等等。
Connectivity
支持的连接协议:HTTP/S, IP multicast, SSL, STOMP, TCP, UDP, XMPP。连接器分为传输连接器和网络连接器。
Pluggable persistence and security
- 消息在broker的持久化存储可以用KahaDB,也支持JDBC可访问的数据库。
- 简单认证,利用属性文件和标准JAAS登陆模块的认证。
Broker clustering
- broker之间可构成网络,提高可用性。
- 支持多种拓扑结构。
Dramatically simplified administration
多种管理方式:通过JMX,利用工具JConsole或ActiveMQ web console, 通过处理ActiveMQ通知消息, 利用命令行脚本,监视各种日志。