Activemq
一. Activemq 是什么?
ActiveMQ 是 Apache 出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完
全支持 JMS1.1 和 J2EE 1.4 规范的 JMS Provider 实现,尽管 JMS 规范出台已经是很久的事情
了,但是 JMS 在当今的 J2EE 应用中间仍然扮演着特殊的地位。
⒈ 多种语言和协议编写客户端。语言: Java,C,C++,C#,Ruby,Perl,Python,PHP。应用协议:
OpenWire,Stomp REST,WS Notification,XMPP,AMQP
⒉ 完全支持 JMS1.1 和 J2EE 1.4 规范 (持久化,XA 消息,事务)
⒊ 对 Spring 的支持,ActiveMQ 可以很容易内嵌到使用 Spring 的系统里面去,而且也支
持 Spring2.0 的特性
⒋ 通过了常见 J2EE 服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过
JCA 1.5 resource adaptors 的配置,可以让 ActiveMQ 可以自动的部署到任何兼容 J2EE 1.4 商
业服务器上
⒌ 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
⒍ 支持通过 JDBC 和 journal 提供高速的消息持久化
⒎ 从设计上保证了高性能的集群,客户端-服务器,点对点
⒏ 支持 Ajax
⒐ 支持与 Axis 的整合
⒑ 可以很容易的调用内嵌 JMS provider,进行测试
二.JMS 是什么?
JMS 即 Java 消息服务(Java Message Service)应用程序接口是一个 Java 平台中关于面向
消息中间件(MOM)的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行异
步通信。Java 消息服务是一个与具体平台无关的 API,绝大多数 MOM 提供商都对 JMS 提供
支持。
简短来说,JMS 是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于
JDBC(java Database Connectivity),提供了应用程序之间异步通信的功能。
三.Activemq 应用场景
以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通
讯四个场景。
1.异步处理
场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.
并行方式。
(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三
个任务全部完成后,返回给客户端。
(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以
上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。
假设三个业务节点每个使用 50 毫秒钟,不考虑网络等其他开销,则串行方式的时间是 150
毫秒,并行的时间可能是 100 毫秒。
因为 CPU 在单位时间内处理的请求数是一定的,假设 CPU1 秒内吞吐量是 100 次。则串行
方式 1 秒内 CPU 可处理的请求量是 7 次(1000/150)。并行方式处理的请求量是 10 次
(1000/100)。
小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。
如何解决这个问题呢?
引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:
按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是 50 毫秒。注
册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽
略,因此用户的响应时间可能是 50 毫秒。因此架构改变后,系统的吞吐量提高到每秒 20
QPS。比串行提高了 3 倍,比并行提高了两倍。
2.应用解耦
场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系
统的接口。如下图:
传统模式的缺点:
1) 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败;
2) 订单系统与库存系统耦合;
如何解决以上问题呢?引入应用消息队列后的方案,如下图:
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用
户订单下单成功。
库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单
信息,进行库存操作。
假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系
统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解
耦。
3.流量削锋
流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。
应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,
一般需要在应用前端加入消息队列。
1. 可以控制活动的人数;
2. 可以缓解短时间内高流量压垮应用;
1. 用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,
则直接抛弃用户请求或跳转到错误页面;
2. 秒杀业务根据消息队列中的请求信息,再做后续处理。
4.消息通讯
消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比
如实现点对点消息队列,或者聊天室等。
点对点通讯:
客户端 A 和客户端 B 使用同一队列,进行消息通讯。
聊天室通讯:
客户端 A,客户端 B,客户端 N 订阅同一主题,进行消息发布和接收。实现类似聊天室效
果。
以上实际是消息队列的两种消息模式,点对点或发布订阅模式。模型为示意图,供参考。
四. Activemq 安装和部署
ActiveMQ 下载与部署。
(1).下载
到官网下载最新版本,有 windows 版本和 Linux 版本的。
http://activemq.apache.org/activemq-5111-release.html
windows 版本:apache-activemq-5.11.1-bin.zip
linux 版本:apache-activemq-5.11.1-bin.tar.gz
(2).部署
A.windows 下部署
ActiveMQ 部署,必须先安装 JDK 并配置好环境变量。
然后解压下载的 apache-activemq-5.11.1-bin.zip 压缩包到一个目录,得到解压后的目录
结构如下图:
进入 bin 目录,发现有 win32 和 win64 两个文件夹,这 2 个文件夹分别对应 windows32
位和 windows64 位操作系统的启动脚本。
其中 activemq.bat 便是启动脚本,双击启动。
ActiveMQ 默 认 启 动 到 8161 端 口 , 启 动 完 了 后 在 浏 览 器 地 址 栏 输 入 :
http://localhost:8161/admin 要求输入用户名密码,默认用户名密码为 admin、admin,这个
用户名密码是在 conf/ jetty-realm.properties 中配置的。输入用户名密码后便可看到如下图的
ActiveMQ 控制台界面了。
B.linux 下部署
1.新建一个目录 mkdir activemq
2.下载 activemq 安装包,并且上传到/activemq 目录下
apache-activemq-5.11.1-bin.tar.gz
3.解压文件
# tar -xzf apache-activemq-5.11.1-bin.tar.gz
4.运行 activemq
# cd apache-activemq-5.11.1/bin/linux-x86-64/
# ./activemq start
五. Activemq 应用方式
A 点对点模式
生产者发送一条消息到 queue,只有一个消费者能收到。
queue 实现了负载均衡,一个消息只能被一个消费者接受,当没有消费者可用时,这个
消息会被保存直到有 一个可用的消费者,一个 queue 可以有很多消费者,他们之间实现了
负载均衡,
所以 Queue 实现了一个可靠的负载均衡。
B 发布订阅模式
发布者发送到 topic 的消息,只有订阅了 topic 的订阅者才会收到消息。
topic 实现了发布和订阅,当你发布一个消息,所有订阅这个 topic 的服务都能得到这个
消息,所以从 1 到 N 个订阅者都能得到一个消息的拷贝,
六.Activemq 结合 Spring 开发
A.JMS 开发基本步骤
connection factory 对应三中 jms 对象模型中的创建连接工厂。
1.创建一个 JMS
2.通过连接工厂创建 jms 连接。设置自己需要的属性。
3.启动 jms connection 连接。
4.通过 connection 连接,创建 jms
session。既是通过 jms 连接创建会话。会话的作用
是建立客户端与服务器端的会话,及其运用哪种方式点对点或者发布订阅。
5.创建 jms destination 既是消息投递地址。也是消息队列存在的地点。
6.创建生产者,或者消费者。来设置生产者消费者的 destination 设置他们的接收地址或
者投递地址。
7.投递消息或者接收消息。