分布式复习--ActiveMQ

  1. activeMQ安装
  2. activeMQ的应用场景
  3. JMS的概念和模型
  4. 通过JMS的api去实现了一个p2p的发送代码
  5. JMS的消息结构组成:消息头、消息体、消息属性
  6. JMS的域模型(点对点、pub/sub)
  7. JMS的可靠性机制
    1. 事务型: session.commit
    2. 非事务型: ack类型 :AUTO_ACK / CLIENT_ACK /DUPS_ACK
  8. 本地事务、消息的持久性
  9. 轻量级的Broker。自己启动一个broker实例
  10. spring+activeMQ整合
  11. 持久化和非持久化发送策略
  12. consumer消费消息是pull还是push (prefetchSize)
  13. 传输协议(client-broker) tcp/nio/udp/http(s)/vm/ssl
  14. 消息持久化策略
    1. kahadb
    2. AMQ
    3. JDBC
    4. 内存
    5. levelDB
  15. activeMQ高性能策略(networkConnector)
    1. 静态网络连接
    2. 动态网络连接

 

应用场景

1,异步消息 2,应用解耦 3,流量销峰             

安装ActiveMQ

  1. 下载activeMq安装包
  2. tar -zxvf **.tar.gz
  3. sh bin/activemq start 启动activeMQ服务

active 是一个web应用程序,启动在内置的jetty中。     在active-mq  的/conf 中jetty的配置   jetty.xml

  <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
             <!-- the default port number for the web console -->
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8161"/>
    </bean>
启动activeQM之后 可以使用ip:port(8161)的方式访问 activeQM 管理平台   

什么是MOM

面向消息的中间件,使用消息传送提供者来协调消息传输操作。 MOM需要提供API和管理工具。 客户端调用api。 把消息发送到消息传送提供者指定的目的地

在消息发送之后,客户端会技术执行其他的工作。并且在接收方收到这个消息确认之前。提供者一直保留该消息。

JMS的概念和规范

  Java消息服务(java message service) 是java平台中面向消息中间件的API,用于在两个应用程序之间或分布式系统中 发送消息进行异步通信。绝大对数MOM供应商都对JMS提供了支持。

消息传递域

点对点(p2p)

  1. 每个消息只能有一个消费者
  2. 消息的生产者和消费者之间没有时间上的相关性。无论消费者在生产者发送消息的时候是否处于运行状态,都可以提取消息

发布订阅(pub/sub)

  1. 每个消息可以有多个消费者
  2. 生产者和消费者之间存在时间上的相关性,订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS规范允许提供客户端创建持久订阅

JMS API

ConnectionFactory  连接工厂

Connection 封装客户端与JMS provider 之间的一个虚拟连接

Session   生产和消费信息的一个单线程上下文;用于创建producer,consumer,message,queue...\

Destination  消息发送或消息接收的目的地 

MessageProducer/MessageConsumer  消息提供者和消费者

消息组成

消息头:包含消息的识别信息和路由信息

消息体:TextMessage/ MapMessage/ BytesMessage/ StreamMessage  / ObjectMessage (可序列化对象)     

属性

JMS的可靠性机制

JMS 消息在消费端被确认之后,才认为是被成功消费。消息的消费包含三个阶段  客户端接收消息、客户端处理消息、消息被确认

事务性会话

Session session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);

设置为true的时候,在消费端 message会在session.commit()之后自动签收

非事务性会话

Session session=connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);

当非事务性会话时 消息何时被确认  取决于创建会话时的应答模式

AUTO_ACKNOWLEDGE

当客户端成功从recive方法返回以后,或者[MessageListener.onMessage] 方法成功返回以后,会话会自动确认该消息

CLIENT_ACKNOWLEDGE   client_acknowledge

客户端通过调用消息的textMessage.acknowledge(); 确认消息。

在这种模式中,如果一个消费者消费一共是10个消息,那么消费了5个消息,然后在第5个消息通过textMessage.acknowledge(),那么之前的所有消息都会被确认消费

DUPS_OK_ACKNOWLEDGE

延迟确认

 

本地事务

在一个JMS客户端,可以使用本地事务来组合消息的发送和接收。JMS Session 接口提供了commit和rollback方法。

JMS Provider会缓存每个生产者当前生产的所有消息,直到commit或者rollback,commit操作将会导致事务中所有的消息被持久存储;rollback意味着JMS Provider将会清除此事务下所有的消息记录。在事务未提交之前,消息是不会被持久化存储的,也不会被消费者消费

事务提交意味着生产的所有消息都被发送。消费的所有消息都被确认;

事务回滚意味着生产的所有消息被销毁,消费的所有消息被恢复,也就是下次仍然能够接收到发送端的消息,除非消息已经过期了

JMS (pub/sub)模型

  1. 订阅可以分为非持久订阅和持久订阅
  2. 当所有的消息必须接收的时候,则需要用到持久订阅。反之,则用非持久订阅

   

JMS  (P2P)模型

  1. 如果session关闭时,有一些消息已经收到,但还没有被签收,那么当消费者下次连接到相同的队列时,消息还会被收到
  2. 如果用户在receive方法中设定了消息选择条件,那么不符合条件的消息会留在队列中不会被接收
  3. 队列可以长久保存消息直到消息被消费者签收。消费者不需要担心因为消息丢失而时刻与jms provider保持连接状态

Broker 

   每个active MQ 进程实例都是一个 broker  可以实现自己的broker

BrokerService brokerService=new BrokerService();
try {
    brokerService.setUseJmx(true);
    brokerService.addConnector("tcp://localhost:61616");
    brokerService.start();
} catch (Exception e) {
    e.printStackTrace();
}
JMS和MQ的关系:
  JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。
而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。
  
支持JMS的开源MQ:
  目前选择的最多的是ActiveMQ。
  ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。
ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

主要特点:
  1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WSNotification,XMPP,AMQP;
  2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务);
  3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性;
  4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上;
  5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA;
  6. 支持通过JDBC和journal提供高速的消息持久化;
  7. 从设计上保证了高性能的集群,客户端-服务器,点对点;
  8. 支持Ajax;
  9. 支持与Axis的整合;
  10. 可以很容易得调用内嵌JMS provider,进行测试;
  11. ActiveMQ速度非常快;一般要比jbossMQ快10倍。

  优点:
  是一个快速的开源消息组件(框架),支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,XA,和J2EE1.4容器无缝结合,并且支持轻量级容器和大多数跨语言客户端上的Java虚拟机。
  消息异步接受,减少软件多系统集成的耦合度。
  消息可靠接收,确保消息在中间件可靠保存,多个消息也可以组成原子事务。
  缺点:
  ActiveMQ默认的配置性能偏低,需要优化配置,但是配置文件复杂,ActiveMQ本身不提供管理工具;
  示例代码少;主页上的文档看上去比较全面,但是缺乏一种有效的组织方式,文档只有片段,用户很难由浅入深进行了解,
  文档整体的专业性太强。在研究阶段可以通过查maillist、看Javadoc、分析源代码来了解。

猜你喜欢

转载自blog.csdn.net/tengxvincent/article/details/81357454