- 博客(32)
- 收藏
- 关注
原创 JVM内存模型和垃圾回收
目录1.JVM内存划分1.1程序计数器1.2 栈1.3 堆1.4 方法区1.5 直接内存2.垃圾收集2.1 对象生命周期判定2.1.1 引用计数算法2.1.2 可达性分析算法2.2 垃圾收集算法2.3 HotSpot虚拟机垃圾回收实现3.垃圾收集器参考1.JVM内存划分 Java虚拟机在运行字节码构成的程序时会将内存区域...
2019-04-17 19:04:38
505
原创 Artemis架构解析
目录前言1.Artemis Broker1.1 外部工具与接口1.1.1 命令行工具1.1.2 RESTful API1.1.3 JMX1.1.4 管理控制页面1.2 Artemis核心功能1.2.1 接入层(Acceptor)1.2.2 安全层(Security)1.2.3 协议管理(Protocol Management)1.2.4 服务...
2019-01-22 18:16:10
5218
9
原创 1.Spring的Bean容器及其Bean的生命周期
1.Bean容器 对应Spring应用,应用对象存活于Spring容器中(container),Spring容器负载对象的创建、配置、装载以及对象的生命周期的管理。 Spring容器可以分为两组不同的类型:Bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持; 应用上下文(由...
2018-12-18 18:02:49
439
翻译 Artemis高可用性和故障转移(19)
我们将高可用性定义为系统在一个或多个服务器发生故障后继续运行的能力。高可用性的一部分是故障转移,我们将其定义为客户端连接在服务器发生故障时从一台服务器迁移到另一台服务器的能力,以便客户端应用程序可以继续运行。1.实时备份群组 Artemis运行服务器作为有效备份组链接在一起,每个活动服务器可以有一个或多个备份服务器。一个备份服务器仅被一个活动服务器拥有。在发送故障转移之前,备...
2018-09-05 18:11:25
2831
1
翻译 Artemis集群(18)
Artemis集群允许将Artemis服务组组合在一起,便于共享消息的负载处理。集群中每个活动节点都是一个活动的Artemis服务,它管理自己的消息并处理自己的连接。集群中的每个节点都通过broker.xml配置文件来声明与其他节点关系,从而形成集群。当一个集群节点连接到另一节点时,通过在内部创建一个core bridge来建立他们之间的连接。不需要为每个节点都声明一个明确的bridge,...
2018-09-05 16:38:32
5340
5
翻译 Artemis资源限制(17)
有时,除了与授权和身份验证相关的正常安全设置之外,对某些用户可以执行的操作设置特定限制是有非常有用的。 例如,限制用户可以创建的连接数或用户可以创建的队列数。 如下是一个简单的通过XML配置限制用户资源的配置:<resource-limit-settings> <resource-limit-setting match="myUser"> ...
2018-09-05 14:47:57
686
翻译 Artemis分页(16)
Artemis支持包含数百万条消息的庞大队列,但是服务器运行的内存有限。这种情况下,不可能将所有队列消息都存储在内存中,因此Artemis会在需要时将内存的消息分页到磁盘中,从而允许大量的队列占用较少的内存。当地址中所有消息占用内存大小超过配置的最大大小时,Artemis开始将消息分页到磁盘中。1.页面文件 在文件系统中消息按地址进行存储。每个地址都有一个单独的文件夹,其中消...
2018-09-05 14:39:10
752
翻译 Artemis大型消息(15)
Artemis支持发送和接收大消息,即使客户端和服务器在有限内存环境中运行。对可以发送或使用的消息大小的唯一实际限制是可用的磁盘空间。客户端和服务器只运行在50MiB的RAM的环境中,我们测试了发送和使用最大8 GiB大小的消息! 要发送大型消息,用户可以在消息体上设置InputStream,在发送该消息时,Artemis将读取InputStream。例如,FileInputSt...
2018-09-05 12:31:46
1065
翻译 Artemis逾期消息(14)
可以在发送消息时设置消息的存活时间。Artemis将不会投递超过存活时间的消息。如果消息在达到存活时间后还未被投递,服务器可以丢弃该消息。可以为Artemis分配一个逾期地址,以便在消息逾期后从队列中删除并发送到逾期地址。多个不同的队列可以绑定到同一个逾期地址,这些逾期消息可以被消费用于进一步的检测。CORE API 使用Artemis CORE API客户端可以直接在消息里...
2018-09-05 10:34:58
1118
翻译 Artemis消息的重新投递(13)
消息可能无法成功投递(例如,使用事务会话在进行消息消费时被回滚)。这样的消息回到其队列准备重新传递。 但是,这意味着在不会成功的情况下可以一次又一次地传递消息,从而无限期地保留在队列中,导致堵塞系统。 有两种方法可以处理这些未投递的消息:延迟重新投递:可以延迟消息的重新投递。 这使客户端有时间从任何瞬态故障中恢复,并防止其网络或CPU资源过载。 死信地址:也可以配置一个死信...
2018-09-05 10:29:50
1266
翻译 Artemis保证消息的发送和提交(12)
事务实现 当使用Artemis提交或回滚事务时,提交或回滚的请求将发送到服务器,并且将阻塞客户端,直到从服务器收到提交或回滚的生效响应。 当在服务器上收到提交或回滚时,它将被提交到日志,并且根据参数journal-sync-transactional的值为true,服务器将确保在发送响应到客户端之前将提交或回滚操作持久化存储。如果此参数的值为false,直到某个时间将响应发送到...
2018-09-04 18:33:37
1253
翻译 Artemis流量控制(11)
流控制用于限制客户端和服务器之间或服务器和另一个服务器之间的数据流,以防止客户端或服务器被数据淹没。1.消费者流量控制 当客户端在消费消息时可以控制服务器和客户端之间的数据流。出于性能原因,客户端通常在通过receive()方法传递消息给使用者之前缓冲消息,或者通过消息监听器异步地缓冲消息。 如果消费者无法像传递消息那样快速处理消息并将其存储在内部缓冲区中,那么最终可能会出现...
2018-09-04 17:13:24
640
翻译 Artemis资源管理配置与定时消息(10)
资源管理配置 Artemis拥有自己的资源管理器,用于处理JTA事务的生命周期。启动事务时,将通知资源管理器并保留事务及其当前状态的记录。在某些情况下,可能出现启动事务但后来被遗忘了。也许客户端异常,再也没有重连。如果发生这种情况,那么事务将无限期的等待。 Artemis为了处理这类问题,通过配置可以扫描并回滚它找到的任何旧事务。默认值为3000000毫秒(5分钟),即删除任何...
2018-09-04 16:44:54
1313
翻译 (9)Artemis网络孤立(脑分裂)
如果一个主或备份服务器在网络中被孤立,可能会发生故障转移,并且会照成有2个存活的服务器同时在集群中提供消息服务(主和备份服务器同时成为存活服务器),我们称这个为脑裂。如下有两种不同的配置来缓解此问题。1.仲裁选举 主和备份服务器都使用仲裁选举来决定在断开复制连接时的操作。服务器将请求集群中的每个主服务器进行投票,以确定它是否认为它复制到或者复制来源的服务器仍然存活。在这种情况...
2018-08-29 17:04:52
623
翻译 (8)Artemis检测(僵尸连接、慢消费者、代理异常)
僵尸连接检测 本节将讨论连接生存时间(TTL)并解释Artemis如何处理客户端崩溃和已经退出但是未完全关闭资源的客户端。没有队列的TTL(即当队列多长时间后没有被使用,如没有消费者,则队列会被删除,Artemis的TTL只有消息和连接的TTL概念)。default-purge-on-no-consumers定义也只是这个队列没有消费者后立即清除队列,无法定义队列没有消费者保留多长时间后...
2018-08-29 16:39:06
1661
4
翻译 (7)Artemis传输配置
1.接收器(Acceptor) 在Artemis传输中接收器是一个重要的概念,如下broker.xml中接收器的配置:<acceptor name="netty">tcp://localhost:61617</acceptor> 可以在acceptor元素中定义一个或多个接收器。每台服务器接收器的数量没有上限。每个接收器定义了一种可以与Ar...
2018-08-28 15:58:26
2967
翻译 (6)Artemis持久化策略
Artemis拥有两种持久化方案,一种是使用针对消息持久化高度优化并且拥有出色性能的日志系统;另一种是JDBC存储,使用JDBC连接到数据库。JDBC存储还在开发中,可以使用日志功能(基本上除了分页和大消息外的所有场景)。 1.日志文件 日志文件由磁盘上的一组文件组成。每个文件都是预先创建好并且固定大小并且最初是填充满的。当服务器上进行操作,如:增、删、改消息都将记入到日志,...
2018-08-28 15:18:46
1881
4
翻译 (5)Artemis支持SQL过滤
Artemis支持基于SQL 92子集语法的过滤表达式。与JMS选择器类似,但是预定义标识符不同。过滤语法使用在如下几个地方:预定义队列,在预定义队列时可以在core或者jms的broker.xml中为队列定义过滤表达式。只有与表达式匹配的消息才能进入队列。 使用可选的过滤器定义core桥接器,仅桥接匹配的消息。 使用可选的过滤器定义转移,仅转移匹配的消息。 在创建消费者、队列和在...
2018-08-28 11:28:43
358
翻译 (4)Artemis支持的协议
目录 1.AMQP1.1 消息转换1.2 拦截和更改消息1.3 AMQP广播地址(TOPIC)1.4 AMPQ事务消息1.5 AMQP消息投递调度2.MQTT2.1 留用(retain)消息2.2 will消息2.3 debug日志2.4 通配符(wild)订阅3.STOMP3.1 将STOMP目的地映射到地址和队列3.2 STOMP心跳...
2018-08-28 11:16:15
2313
翻译 (3)Artemis寻址模型
概述 Artemis使用独特、灵活的寻址模型,其包括三个主要概念:地址,队列和路由类型。 地址:地址代表了一个消息的端点,通过配置地址有全局唯一的名称,一个地址可以绑定0到多个队列,并且绑定一个路由类型。 队列:当消息匹配到对应地址,取决于配置的路由类型消息会被发往一个或者多个队列。队列可以配置为自动创建和删除。 路由类型:路由类型决定如何将消息发送到与地...
2018-08-27 22:59:42
2154
翻译 (2)如何使用Artemis
1 Artemis服务器发行版目录结构 |___ bin | |___ examples | |___ common | |___ features | |___ perf | |___ protocols | ...
2018-08-27 18:03:29
7118
翻译 (1)Artemis简介
1.简介 Artemis是通过基于netty的非堵塞IO架构开发的,拥有出色的性能。由jboss捐献的HornetQ的衍生版本,可能作为下一代ActiveMQ的存在。 选择Artemis的原因开源、高可用性、Java编写、高性能的日志保证持久化消息像非持久化消息一样拥有出色的表现、功能齐全、简洁的设计、灵活的集群可以通过不可靠的全球网络创建地理上分布的集群。 Arte...
2018-08-27 17:44:33
18592
11
原创 Linux系统环境变量
环境变量1.1 环境变量概念 环境变量是一个在操作系统中具有特定名字的对象,它包含了一个或者多个应用程序所将要使用的信息。 在shell中经常会用环境变量来存储有关shell会话和工作环境的信息。通过环境变量,可以在内存中存储数据,以便程序或者shell运行脚本能够轻松访问它们。 环境变量分为两类:全局变量、局部变量。 全局变量对于shell会话和所有生成的子shell都是...
2018-06-07 17:44:19
439
原创 shell进程
shell进程1.1 shell的基本概念 shell做为一种和Linux系统的特殊交互式工具,为用户提供了启动程序、管理文件系统中的文件及运行在Linux上的进程的途径。shell通过解析输入的文本命令,在内核中执行来达到与系统交互的功能。shell包含了一组内部命令,通过这些命令可以进行文件管理、程序管理及运行等操作。 除了在文本命令界面上(or虚拟控制器终端or终端仿真器)通过...
2018-06-07 15:55:17
6782
原创 设计模式-优雅代码(二)
一、模板模式 模板模式:在方法定义了执行方式or算法的骨架,子类实现具体的步骤。可以在执行架构不变的情况情况下调整具体的算法实现方式。针对有共同的执行步骤但是具体的执行内容不同的模块是一种很好的封装方式。 例子: 1.Arrays中的sort(T[])方法和Comparable接口的组合方式就是使用了模板模式。 2.如果我们要对某些对象进行排序,是这个类继承Comparab...
2018-05-27 23:23:18
461
原创 JUnit5常用注解解析(二)
1. 能被自动注册解析器解析的参数 Junit5中扩展定义了ParameterResolver,它可以在运行时动态解析参数。如果一个测试的构造函数或者测试@Test、@BeforeEach、@BeforeAll等方法接收参数,这个参数必须被已注册的ParamterResolver解析。 下面介绍几个能被自动注册的内置解析器解析的参数,其他参数解析器必须通过@ExtendWith声明来注...
2018-05-13 21:17:22
2051
原创 JUnit5常用注解解析(一)
1、简介 JUnit5有别与之前的版本,进行了模块化,它由几个不同的模块组成,这些模块分别来自三个不同的子项目: JUnit5 = JUnit Platform + JUnit Jupiter + JUnitVintage Junit Platform是在JVM上启动测试框架的基础平台,还定义了TestEngine API,该API可用于开发在平台上运行的测试框架。此外,...
2018-04-28 23:39:23
5694
4
原创 RocketMQ集群No route info of this topic解决方案
1.问题描述 在针对RocketMQ集群做模拟故障测试,测试环境: 1.两台linux服务器,系统配置MEM:64G,CPU:32 core。RocketMQ版本4.2.0。 2.每台服务器上部署一个nameSvr,主broker、备broker(两台服务器之间互为主备) 当在模拟其中一台RocketMQ服务器故障时(强制停止这台服务器所有程序进程),R...
2018-04-08 16:08:19
25807
1
原创 rabbitmq_mqtt插件单队列性能瓶颈优化
1、说明 1.1、场景 最近在线直播答题燃爆了,为了搞个支持百万级并发、低延时的基础消息平台,选择了RabbitMQ作为消息中间件,为啥要选RabbitMQ呢,RabbitMQ社区活跃久经沙场、除了AMQP消息协议外支持通过插件方式同时支持MQTT、STOMP协议同时各协议能互通、高性能、支持集群等等原因,选择了它。 在使用方面作为要支持网页端消息基础平台,由于Rabb...
2018-03-25 18:39:55
8852
7
原创 设计模式-优雅代码(一)
说明 每个设计模式都配有实例,实例使用java实现,对于实例部分嫌弃篇幅大的可以跳过,今天只写第一部分,后续的会慢慢补充。一、适配器模式 适配器大家都很熟悉,可以把对适配器模式的理解代入适配器中就很容易理解记忆了。到底什么是适配器模式呢,就是把一个接口转换成另外一个接口。 例子: 1.有一套电视遥控器接口,接口包含startTV开电视、stop...
2018-01-11 23:34:40
1173
原创 Haproxy 在服务可用情况下返回503
1.异常分析:haproxy集群作为负载代理,底层挂着多个服务程序,20w个用户同时并发请求,在100%请求协议为http情况下服务良好,无异常;当请求为websocket 75% http30%情况下,出现大量503服务不可以异常。首先查看底层服务器,底层服务器运行平稳,压力未满,对应的503请求未发送到底层服务器,查看haproxy日志,发现大量如下日志: haproxy完全
2017-09-23 11:54:51
13000
原创 DefaultMQProducer.send(message, timeout)的消息发送状态sendResult.getSendStatus()
使用DefaultMQProducer.send(message,timeout);可以通过sendResult.getSendStatus()查看发送到RocketMQ的信息是否发送成功,在使用如下代码进行发送信息,并对信息发送是否确认成功,如果不成功进行重新发送时:public class MQProductor { private static final Logg
2016-10-11 17:36:08
11368
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人