分布式消息中间件-ActiveMQ

本章知识点:

什么是消息中间件

消息中间件能做什么

AciiveMQ简介

从JMS规范来了解ActiveMQ

    JMS定义

    JMS体系结构

    消息传递域

        点对点消息传递域

        发布订阅消息传递域

    消息结构组成

        属性

        JMS API定义了5种消息体格式

    持久订阅

    JMS消息的可靠性机制

    JMS的事务性会话和非事务性会话

    消息的持久化和非持久化存储

Broker是什么

怎么保证幂等性

P2P模型和PUB/SUB模型总结
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

什么是消息中间件?

可靠消息机制进行平台无关的数据传输

消息中间件能做什么?

比如电商平台注册功能来分析:用户注册一个服务,不单单是insert一条数据到数据库就完事了,还需要发送激活邮箱,发送新人红包或者积分,发送营销短信等一系列操作,都需要耗时1s,那么整个注册过程就需要耗时4s才能响应给用户。

可以对这些相对独立操作(子域)实现异步化执行,类似多线程并行处理概念。

多线程可以实现异步化,只是消息持久化、消息重发这些条件,多线程并不能满足。

消息队列就很好地满足这些条件,实现异步,解耦,削峰。

在秒杀地业务场景,流量非常大,通过消息队列可以很好地解决流量削峰问题。

秒杀描述:

用户提交过来地请求,先写入消息队列,消息队列是有长度地,如果消息队列的长度超过指定长度,直接抛弃。

秒杀的具体核心处理业务,接收消息队列中消息进行处理,这里的消息处理能力取决于消费端本身的吞吐量。

还有在弱一致性事务模型中,可以采用分布式消息队列来实现最大能力通知来实现数据最终一致性。

AciiveMQ简介:

基于JMS规范,高可用,高性能,可伸缩面向消息服务的系统。

ActiveMQ特性:

  1. 多语言和协议编写客户端
  2. 对spring的支持
  3. 完全支持jms1.1和j2ee1.4规范

从JMS规范来了解ActiveMQ

JMS定义:

JMS(java Message Service)Java消息服务,是一组Java应用程序接口,它提供消息的创建、发送、接收、读取等一系列服务。

JMS定义了一组公共应用程序接口和相应的语法,类似Java数据库的统一访问接口JDBC,与厂商无关的API。

JMS体系结构:

消息传递域:

JMS规范中定义了两种消息传递域:点对点消息传递域和发布/订阅 消息传递域。

类似qq聊天的时候,在群里面发消息(发布/订阅)和给群里单独一个同学发消息(点对点)。

点对点消息传递域:

  1. 每个消息只能有一个消费者
  2. 消息的生产者和消费者之间没有时间上的相关性,实现异步消费。

发布订阅消息传递域:

  1. 每个消息可以有多个消费者
  2. 生产者和消费者之间有时间上的相关性,订阅一个主题的消费者只能消费自它订阅之后发布的消息。
  3. JMS规范允许客户创建持久订阅,可以在一定程度上降低时间上的相关性要求。
  4. 持久订阅允许消费者消费它在未处于激活状态时发送的消息。

消息结构组成:

JMS消息由消息头、属性、消息体组成。

消息头(Header)-消息头包含消息的识别信息和路由信息。

消息头的属性:

  1. JMSDestination:消息发送的目的地,queue或者topic。
  2. JMSDeliveryMode:传送模式。持久模式和非持久模式。
  3. JMSPriority:消息优先级(优先级分为10个级别,0-9(递增),如果不设置优先级,默认级别是4)
  4. JMSMessageID:唯一识别每个消息的id

属性:

按照类型可以分为应用设置属性,标准属性和消息中间件定义的属性。

  1. 应用程序设置和添加的属性,比如Message.setStringProperty("key","value");消费端接收方式:Enumeration em=message.getPropertyNames()。
  2. JMS定义的属性
  3. JMSprovider特定的属性

JMS API定义了5种消息体格式(Text,Map,Byte,Stream,Object),可以使用不同形式发送接收数据,并可兼容现有的消息格式:比如

  1. TextMessage:简单文本
  2. MapMessage:键值对
  3. BytesMessage:字节流
  4. StreamMessage:java中的输入输出流
  5. ObjectMessage:Java中的可序列化对象
  6. Message:没有消息体,只有消息头和属性

持久订阅:

比如QQ,我们退出QQ,但是下次登录的时候登录后还可以接受到离线消息。

持久订阅就是这样的道理,持久订阅有两个特点:

  1. 持久订阅者和非持久订阅者针对的是发布订阅模型
  2. 当Broker发送消息给订阅者时,如果订阅者处于未激活状态:持久订阅者可以收到消息,而非持久订阅者收不到消息。
  3. 当然这种方式也有一定的影响:当持久订阅者处于未激活状态时,Broker需要为持久订阅者保存消息;如果持久订阅者订阅的消息过多会溢出。
  4. 持久订阅时,客户端向JMS服务器注册一个自己身份的ID,当这个客户端处于离线状态时,JMS Provider会为这个ID保存所有发送到主题的消息,当客户端再次连接JMS Provider时,会根据自己的ID得到所有自己处于离线时发送到主题的消息。
  5. 这个身份ID在代码中的体现就是connection的ClientID,聊天设备相当于clientID,qq号相当于订阅者名称,每个设备只能一个qq号登录,就实现了连接和订阅者。

JMS消息的可靠性机制:

相当于我们寄出一个快递出去,收件人没有收到快递,就认为这个包裹处于待签收状态,这样才能保证包裹能够安全达到收件人手里。消息中间件也是一样。

消息的消费通常包括3个阶段:客户端接收消息、客户端处理消息、消息被确认。

JMS的事务性会话和非事务性会话:

JMS Session接口提供了session.commit()和session.rollback()方法。

在事务状态下发送操作,消息并未正在投递到中间件,而只有进行session.commit()操作之后,消息才会发送到中间件,再转发到适当的消费者进行消费。如果是调用session.rollback()操作,则表明,当前事务期间内所发送的消息都取消掉。

通过在创建session的时候使用true or false来决定当前的会话是事务性还是非事务性。

connection.creatSession(Boolean.True,Session.AUTO_ACKNOWLEDGE);

在事务性会话中:

消息的确认是自动进行,也就是通过session.commit()之后,完成消息的签收。

注意:必须保证发送端和接受端都是事务性会话。

在非事务性会话中:

消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)

有三个选项:

  1. Session.AUTO_ACKNOWLEDGE:表示session会自动确认所接受到的消息。
  2. Session.CLIENT_ACKNOWLEDGE:表示客户端程序通过调用消息的确认方法来确认所接收到的消息。
  3. Session.DUPS_OK_ACKNOWLEDGE:使得session将“惰性”地确认消息,即不会立即确认消息,这样可能导致消息重复投递。

消息的持久化和非持久化存储:

消息的持久化存储也是保证消息的可靠性最重要的机制之一,也就是消息发送到Broker上以后,如果broker出现故障宕机了那么存储在broker上的消息不应该丢失。

设置消息持久化:

    producer.setDeliveryMode(DeliveryMode.PERSIS.TENT)----持久化到磁盘或数据库,会有资源浪费,性能开销,多个步骤组成。当消费者处理返回ack,消息会从磁盘删除。

设置消息非持久化:

    producer.setDeliveryMode(DeliveryMode.NONPERSIS.TENT)----存储在内存,mq挂了,消息会丢失。

消息的非持久化存储:

消息提供者会使用存储转发机制,先将消息存储到稳定介质中,等消息发送成功后再删除,如果是jms.provider挂掉了,那么这些未到达的消息不会丢失;jms provider恢复正常后,会重新读取这些信息,并传送给对应的消费者。

Broker是什么:

消息队列核心,控制中心,负责消息路由,保存订阅和连接信息,消息服务提供者。

怎么保证幂等性:

网络延迟情况下,可能造成消息重复消费,MQ本身无法解决幂等,需要在消费端判断全局id来解决消息是否重复消费。

P2P模型和PUB/SUB模型总结:

P2P模型:

  1. 如果session关闭时,有一些消息已经被收到,但是没有被签收,消费者下一次连接到相同队列时,会接收。
  2. 用户可以在receiver方法中设定了消息的选择条件(消息过滤)。
  3. 如果是持久化消息,消息会被持久化保存,直到消息被签收。

PUB/SUB模型:

  1. 持久化订阅和非持久化订阅。
  2. 在非持久化订阅的前提下,不能重复恢复或者重新指派一个未签收的消息。
  3. 如果所有的消息都要被签收,需要使用持久订阅。

猜你喜欢

转载自blog.csdn.net/qq_38357267/article/details/89397552