大型移动APP开发之服务器端MQ技术选型Word下载.docx
《大型移动APP开发之服务器端MQ技术选型Word下载.docx》由会员分享,可在线阅读,更多相关《大型移动APP开发之服务器端MQ技术选型Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。
JMS是早期消息中间件进行标准化的一个尝试,它仅仅是在API级进行了规范,离创建互操作能力还差很远。
与JMS不同,AMQP是一个Wire级的协议,它描述了在网络上传输的数据的格式,以字节为流。
因此任何遵守此数据格式的工具,其创建和解释消息,都能与其他兼容工具进行互操作。
AMQP的实现有:
RabbitMQ,OpenAMQ等。
常见消息中间件产品
ActiveMQ
ActiveMQ是一个基于Apcache2.0licenced发布,开放源码的JMS产品。
其特点为:
1)提供点到点消息模式和发布/订阅消息模式;
2)支持JBoss、Geronimo等开源应用服务器,支持Spring框架的消息驱动;
3)新增了一个P2P传输层,可以用于创建可靠的P2PJMS网络连接;
4)拥有消息持久化、事务、集群支持等JMS基础设施服务。
HornetQ
Document:
http:
//docs.jboss.org/hornetq/2.2.14.Final/user-manual/en/html/index.html
HornetQ是一个支持集群和多种协议,可嵌入、高性能的异步消息系统。
HornetQ完全支持JMS,HornetQ不但支持JMS1.1API同时也定义属于自己的消息API,这可以最大限度的提升HornetQ的性能和灵活性。
在不久的将来更多的协议将被HornetQ支持。
HornetQ拥有超高的性能,HornetQ在持久化消息方面的性能可以轻易的超于其它常见的非持久化消息引擎的性能。
当然,HornetQ的非持久化消息的性能会表现的更好!
HornetQ完全使用POJO,纯POJO的设计让HornetQ可以尽可能少的以来第三方的包。
从设计模式来说,HornetQ这样的设计入侵性也最小。
HornetQ既可以独立运行,也可以与其它Java应用程序服务器集成使用。
HornetQ拥有完善的错误处理机制,HornetQ提供服务器复制和故障自动转移功能,该功能可以消除消息丢失或多个重复信息导致服务器出错。
HornetQ提供了灵活的集群功能,通过创建HornetQ集群,您可以享受到到消息的负载均衡带来的性能提升。
您也可以通过集群,组成一个全球性的消息网络。
您也可以灵活的配置消息路由。
HornetQ拥有强大的管理功能。
HornetQ提供了大量的管理API和监控服务器。
它可以无缝的与应用程序服务器整合,并共同工作在一个HA环境中
ActiveMQ和HornetQ的比较:
特点
HornetQ2.0GA
ActiveMQ5.3.0
客户端语言
Java,JMS1.1Stomp
Java,C#,C等jms1.1,jms1.2
应用协议
STOMP
OpenWire,StompREST,WSNotification,XMPP,AMQP
支持的传送协议
TCP,SSL,HTTP等
In-VM,TCP,SSL,NIO,UDP,JGoup,JXTA等
监测jms消息
支持
消息目标队列的分类
使用Diverts(排他和非排他)可以使用过滤相匹配消息被转移
虚拟目标队列,镜像队列(队列自动复制)和复合目的地队列
集群
1.发布消息通过广播(UDP组播)或固定客户端和服务端
2.支持负载均衡
3.消息的重分发:
发送前,配置无消费者对消息的重新分发的参数。
4.容错机制(failover):
主备服务器(每一个主服务器只能有一个冷备份服务器)
5.高可用性:
异步日志复制从主到备(快)或者通过共享文件系统的共享存储(有没有需要复制)
1.发送消息通过广播(UDP组播或者零配置)或者固定的客户端和服务端。
3.容错机制(failover):
主备服务器(每一个主服务器只有一个备服务器)
4.静态或者动态的发布。
5.针对消息的broker的重分发。
6.高可用性:
从主服务器异步日志到备份服务器(快),或者通过JDBC通过共享文件系统存储(慢)或者共享存储(有没有需要复制)
JMX监控和管理
支持,包含一个web控制台
JMS到JMS的Bridge的方式
支持,HQ到HQ和HQ到任何JMS1.1的服务器。
一次只能提供一次,并保证在HQ到HQbridges.
在集群中消息组和排他性消费。
性能(Performance)测试工具
SpecJMS
压力测试
JMeter的性能测试
持久化
仅支持异步日志系统(journal),提供两种方式:
1.JavaNIO
2.linuxAIO(仅支持linux2.6以上的版本)
支持多种方式:
1.KahaDB(比较好的可扩展性,更短的恢复时间。
)
2.AMQ消息存储(快)
3.JDBC数据库(比较慢)
安全
身份验证和授权的JAAS的配置文件中定义。
7中不同的权限。
JAAS的身份验证和配置文件授权。
3中不同的权限(读,写,管理)
Blob和Large消息的支持
调度传递(Scheduledelivery)
支持(使用ScheduleCronParser)
消息转换(xml转换为对象)
支持,但是仅仅在HQ和HQBridge之间。
支持(其中Spring提供具体的实现方案)
异步发送
Acknowledge优化
前置Acknowledge
批量Acknowledge,异步消息传递
生产者流程控制
支持(仅仅在window)
慢消费消息的处理
拦截器架构
支持,在包一级传入的数据库捕获
支持,使用一个拦截器栈捕获传入的消息
通配符的支持(WildCard)
XPATH的支持
不支持
重新传递策略
延迟交还和DLQ
DLQ,丢失的消息将无法在交付。
消息优先级和权重的设置
命令代理
支持在ActiveMQ4.2以上
AMQP支持
SOAP协议Web服务的支持
支持,使用ApacheAxis和CXF
JEE应用服务整合
支持,使用JCARA
超时消息的目标地址
检查重复的消息
集群中服务端的负载均衡
客户端负载均衡(loadbalance)
支持(随机和循环)
客户端容错机制(failover)
支持,自动故障转移和应用管理模式
支持,随机和循环使用故障转移协议
Vm传输
对Ajax的支持
未知
对Spring的支持
RabbitMQ
RabbitMQ是由LShift提供的一个AMQP的开源实现,由以高性能、健壮以及Scalability出名的Erlang写成,因此也是继承了这些优点。
AMQP里的两个主要组件:
Exchange和Queue,绿色的X就是Exchange,红色的是Queue,这两者都在Server端,又称作Broker,这部分是RabbitMQ实现的,而蓝色的则是客户端,通常有Producer和Consumer两种类型:
AMQP有四个非常重要的概念:
虚拟机(virtualhost),交换机(exchange),队列(queue)和绑定(binding)。
ñ
虚拟机:
通常是应用的外在边界,我们可以为不同的虚拟机分配访问权限。
虚拟机可持有多个交换机、队列和绑定。
交换机:
从连接通道(Channel)接收消息,并按照特定的路由规则发送给队列。
队列:
消息最终的存储容器,直到消费客户端(Consumer)将其取走。
绑定:
也就是所谓的路由规则,告诉交换机将何种类型的消息发送到某个队列中。
通常的操作流程是:
(1)消费者:
创建信息通道。
(2)消费者:
定义消息队列。
(3)消费者:
定义特定类型的交换机。
(4)消费者:
设定绑定规则(包括交换机名称、队列名称以及路由键)。
(5)消费者:
等待消息。
(6)生产者:
创建消息。
(7)生产者:
将消息投递给信息通道(注明接收交换机名称和路由键)。
(8)交换机:
获取消息,依据交换机类型决定是否匹配路由规则(如需匹配,则对比消息路由键和绑定路由键)。
(9)消费者:
获取并处理消息,发送反馈。
(10)结束:
关闭通道和连接。
队列定义参数:
exclusive:
仅创建者可以使用的私有队列,断开后自动删除。
auto_delete:
当所有消费客户端连接断开后,是否自动删除队列。
交换机定义参数:
type:
交换机类型,包括fanout,direct和topic。
当所有绑定队列都不再使用时,是否自动删除该交换机。
如所定义队列和交换机已存在,queue_declare和exchange_declare将直接使用,不会抛出异常。
交换机类型:
Fanout:
不处理路由键,将消息广播给绑定到该交换机的所有队列。
Direct:
处理路由键,对消息路径进行全文匹配。
消息路由键“dog”只能匹配“dog”绑定,不匹配“dog.puppy”这类绑定。
Topic:
处理路由键,按模式匹配路由键。
模式符号“#”表示一个或多个单词,”*”仅匹配一个单词。
如“audit.#”可匹配“audit.irs.corporate”,但“audit.*”只匹配“audit.irs”。
通过Spring配置来实现异步接收消息
MessageProducer类是用于发送消息的类。
实现如下
Java代码
1.package
com.abin.rabbitmq;
2.
3.import
org.springframework.amqp.rabbit.core.RabbitTemplate;
4.
5.public
class
MessageProducer
{
6.
private
RabbitTemplate
rabbitTemplate;
7.
8.
public
void
sendMessage(Integer
i)
9.
String
message
=
"
Hello
World
wubin
+
#"
i;
10.
//Exchange的名称为"
hello.topic"
,routingkey的名称为"
hello.world.q123ueue"
11.
rabbitTemplate.convertAndSend("
12.
message);
13.
System.out.println("
发送第"
i
个消息成功!
内容为:
14.
15.//
messages
direct
16.//
hello.direct"
hello.world.queue"
17.//
messages);
18.//
19.
}
20.
21.
setRabbitTemplate(RabbitTemplate
rabbitTemplate)
22.
this.rabbitTemplate
23.
24.
25.}
spring的配置文件如下:
applicationContext-rabbitmq.xml
1.<
?
xml
version="
1.0"
encoding="
UTF-8"
>
2.<
beans
xmlns="
http:
//www.springframework.org/schema/beans"
3.
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
//www.springframework.org/schema/beans
//www.springframework.org/schema/beans/spring-beans-3.0.xsd"
5.
<
bean
id="
connectionFactory"
class="
org.springframework.amqp.rabbit.connection.SingleConnectionFactory"
constructor-arg
value="
localhost"
/>
property
name="
username"
guest"
password"
/bean>
amqpAdmin"
org.springframework.amqp.rabbit.core.RabbitAdmin"
ref="
15.
rabbitTemplate"
16.
org.springframework.amqp.rabbit.core.RabbitTemplate"
17.
/constructor-arg>
18.
messageProducer"
com.abin.rabbitmq.MessageProducer"
ref
bean="
/property>
25.<
/beans>
对于发送消息的程序自己可以实现。
下面来看看接受消息的程序如下
HelloWorldHandler类用于接收消息的处理类,如下
java.util.Date;
HelloWorldHandler
handleMessage(String
text)
Received:
text);
System.out.println(new
Date());
11.}
!
--
创建connectionFactory
-->
创建rabbitAdmin
代理类
rabbitAdmin"
创建rabbitTemplate
消息模板类
org.springf