ActiveMQ架构及特性

2021-06-05 19:29:05 885

架构
  1. 主从模式(Master Slave): JDBC方案 相较于集群, 该模式解决高可用的问题
  2. 集群(Broker Clusters): 相对于主从模式, 该模式可以进行负载均衡, 一个client1连接broker1发送消息,另一个client2连接broker2消费消息,这时就需要将broker1上的消息路由到broker2上。而当broker2上的consumer挂了,也需要将消息转发到其它的有consumer的broker上,避免消息大量堆积无法处理
  3. 同时使用主从和集群
传输模式
  1. 点对点传输: 一个生产者对应一个消费者, 生产者向broker推送数据, 数据存储在borker中, 点对点传输消费者可以接收到在连接之前生产者所推送的数据
  2. pub/sub: 订阅topic来接收相应数据,一个生产者可向多个消费者推送数据, 基于发布/订阅模式的传输方式消费者只能接收到连接之后生产者推送的数据
发送策略
  1. 异步发送: 异步发送可能丢失消息, 因为消息可能还没到broker中, mq就宕机了, 此时异步消息都在生产者内存中, 所以需要设置异步回调
  2. 同步发送, 效率比异步稍低, 但更稳定
延时消息和定时消息
  1. 需要通过配置启用broker的功能
  2. 可以设置延时时间[DELAY], 重复投递次数[REPEAT], 重复投递间隔[PERIOD]
  3. 也可以直接使用cron表达式
  4. cron表达式的优先级高于另外三个参数,如果在设置了cron的同时,也有repeat和period参数,则会在每次cron执行的时候,重复投递repeat次,每次间隔为period。就是说设置是叠加的效果。例如每小时都会发生消息被投递10次,延迟1秒开始,每次间隔1秒
重试策略
  1. ActiveMQ中的消息重发,指的是消息可以被broker重新分派给消费者,不一定是之前的消费者
  2. 事务会话中,当还未进行session.commit()时,进行session.rollback(),那么所有还没commit的消息都会进行重发
  3. 使用客户端手动确认的方式时,还未进行确认并且执行Session.recover(),那么所有还没acknowledge的消息都会进行重发。
  4. 所有未ack的消息,当进行session.closed()关闭事务,那么所有还没ack的消息broker端都会进行重发,而且是马上重发.
  5. 消息被消费者拉取之后,超时没有响应ack,消息会被broker重发
  6. 重发指的是消息经过broker重新进行转发给消费者,经过测试,1和2的情况消息重发会发送给原来的消费者,3和4可以转发消息给别的消费者。累计次数超过设置的maximumRedeliveries时消息都会都会进入死信队列
  7. 消息的重发时间间隔和重发次数, 间隔 1 次数 6 (6次之后进入死信队列)
可靠性机制
  1. 消息接收确认, 消息只有在被确认之后, 才认为已经被成功地消费了, 消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息和消息被确认. 在事务性会话中,当一个事务被提交的时候, 确认自动发生
  2. 消息持久性,JMS支持以下两种消息提交模式:
  3. 消息优先级 可以使用消息优先级别来指示JMS provider首先提交紧急的消息。优先级分10个级别,从0(最低)到9(最高). 如果不指定优先级,默认级别是4。需要注意的是,JMS provider并不一定保证接照优先级的顺序提交消息
  4. 顺序消息, 保证消息在多个consumer的消费顺序
  5. 消息过期,可以设置消息在一定时间后过期,默认是永不过期
  6. 消息的临时目的地,可以通过会话上的createTemporaryQueue方法和createTemporaryTopic 方法来创建临时目的地。它们的存在时间只限于创建它们的连接所保持的时间。 只有创建临时目的地的连接上的消息消费者才能够从临时目的地中提取消息
  7. 持久订阅 首先消息生产者必须使用PERSISTENT提交消息。客户可以通过会话上的 createDurab1eSubscriber方法来创建一个持久订阅,该方法的第一个参数必须 是一个topic。第二个参数是订阅的名称。JMS provider会存储发布到持久订阅对应的topic上的消息。如果最初创建 持久订阅的客户或者任何其它客户,使用相同的连接工厂和连接的客户ID,相同的主题和相同的到订阅名,再次调用会话上的createDurab1eSubscriber方法,那么持久订阅就会被激活。JMS provider会向客户发送客户处于非激活状态时所发布的消息。持久订阅在某个时刻只能有一个激活的订阅者。持久订阅在创建之后会一直保留,直到应用程序调用会话上的unsubscribe方法
  8. 本地事务 在一个JMS客户端,可以使用本地事务来组合消息的发送和接收。JMS Session接口提供了commit和rollback方法。事务提交意味着生产的所有消息被发送,消费的所有消息被确认;事务回滚意味生产的的所有消息被销毁,消费的所有消息被恢复并重新提交,除非它们已经过期. 事务性的会话总是牵涉到事务处理中,commit或rollback方法一旦被调用,一个事务就结束了,而另一个事务被开始。关闭事务性会话将回滚其中的事务。得要注意的是,如果使用请求/回复机制,即发送一个消息,同时希望在同一个事务中等待接收该消息的回复,那么程序将被挂起,因为知道事务提交,发送操作才会真正执行 需要注意的还有一个,消息的生产和消费不能包含在同一个事务中
消息存储方式
  1. AMQ消息存储一基于文件的存储方式,是以前的默认消息存储
  2. KahaDB消息存储一提供了容量的提升和恢复能力,是现在的默认存储方式, 消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址, KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化。在Kaha中,数据被追加到datalogs中。当不再需要log文件中的数的时候,log文件会被丢弃。
  3. JDBC消息存储一消息基于JDBC存储的
  4. Memory消息存储一基于内存的消息存储
Destination特性
  1. 通配符
  2. 组合队列, 允许用一个虚拟的destination代表多个destinations。这样就可以通过composite destinations在一个操作中同时向多个queue发送消息
  3. 自动删除删除不活动的Destinations
  4. 虚拟Destinations, 解决消费者不能分组消费消息
  5. 镜像队列


ActiveMQ架构及特性

架构主从模式(Master Slave): JDBC方案 相较于集群, 该模式解决高可用的问题集群(Broker Clusters): 相对于主从模式, 该模式可以进行负载均衡, 一个client1连接broker1发送消息,另一个client2连接broker2消费消息,这时就需要将broker1
2021-06-05

freemarker 时间显示不正常 设置时区

项目在本地开发的时候显示正常,部署上服务器就一直差8个小时,最后发现freemarker官方文档有这样的说明time_zone:时区的名称来显示并格式化时间。 默认情况下,使用JVM的时区。 也可以是 Java 时区 API 接受的值,或者 "JVM default" (从 FreeMarker 2
2020-03-28
IDEA 2019.1 xml 不高亮

IDEA 2019.1 xml 不高亮

前几天更新了idea后,发现xml里的代码都没有了高亮,变得跟记事本一个德性了打开setting ,搜索 File Types,找到xml项, 查看下方的匹配格式,果然没有xml,(idea真是厉害)点击右方的+,输入*.xml,点击ok,解决问题
2020-03-28

npm install 淘宝镜像

npm install --registry=https://registry.npm.taobao.org
2020-03-28
Java中方法的参数传递机制

Java中方法的参数传递机制

来看一段代码 public class Man { private String name; private Integer age; public String getName() { return name; } publi
2020-03-28
基于自定义注解手写权限控制

基于自定义注解手写权限控制

方法一: AOP 方法二: 拦截器项目结构项目依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-w
2020-03-28

Docker 部署 详细全过程 附代码

Docker 部署本站 全过程环境:CentOS7.61. 安装Docker其他版本CentOS可以参考这个https://help.aliyun.com/document_detail/187598.html查看本机内核版本,内核版本需高于 3.10uname -r 确保 yum 包最新yum u
2020-03-28

SpringBoot 启动普通java工程

引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.9</version> </dependency>
2020-03-28

Vue.js DOM操作

<template> <input type="button" @click="reply($event)" value="回复"> </template> export default { methods: { replyFun(e) {
2020-03-29
CentOS7编译调试OpenJDK12

CentOS7编译调试OpenJDK12

1. 下载源码https://hg.openjdk.java.net/jdk/jdk12点击左侧的browse,再点击zip,就可以下载zip格式的源码压缩包。unzip xxx.zip 解压文件2. 安装jdkyum install java-11-openjdk-devel -y3. 运行con
2020-04-23
编写自己的Spring Boot Starter

编写自己的Spring Boot Starter

1.新建一个maven项目命名规则统一是xxx-spring-boot-starter完整pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
2020-06-29