自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(576)
  • 资源 (4)
  • 收藏
  • 关注

原创 21. SqSentinel使用陷阱

SqSentinel基于Spring AOP使用注解@SqSentinelResource的方式对请求进行限流和降级处理, 使用方式可参见SqSentinel接入指南, 在使用过程中需慎入如下陷阱。陷阱1: Spring AOP仅对Spring管理的bean进行增强操作。NewOrderArrivalHallRunnable是内部类,非ApplicationContext管理的类,因此即使使用@SqSentinelResource注解,限流降级功能也不会生效。eclipse 警告fallbackE...

2020-12-24 16:12:56 189

转载 泛型中? super T和? extends T的区别

原文链接经常发现有List<? super T>、Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。extendsList<? extends Number> foo3的通配符声明,意味着以下的赋值是合法的:// Number "extends" Number (in th.

2020-12-18 17:12:01 226 1

转载 通俗易懂,TCP为啥要三次握手?

偶然的机会,看到一篇朋友圈里推荐的文章老生常谈,TCP为啥要三次握手?感觉这应该是看过的"TCP三次握手"中最通俗易懂的啦。猛然想到了大学里讲编译原理的孙悦红老师,"没有听不懂的课程,只有讲的不清楚的课程"...

2020-12-14 11:22:02 72

原创 计算时间差的正确姿势

第一步先摆出结论,第二步摆出证据证明结论来自阿里开发手册:获取当前毫秒数System.currentTimeMillis(),而不是new Date().getTime();注意:如果想要获取更加精确的纳秒级时间值,使用System.nanoTime()的方式。在jdk8中,针对统计时间等场景,推荐使用Instant类。直白点就是: 当想获取当前毫秒数时,System.currentTimeMillis()优于new Date().getTime()。 如果你想获取到的时间值更精..

2020-12-14 11:01:48 465

原创 redis性能指标数据

基础:单机 4G内存 1000M带宽 redis版本:5.0.7测试: 单机redis命令avg rt维度: 100000request,200客户端并发,value字节数分别为20000|2000|200|20结论: 1. string类型get请求单机qps 10W,set|list|zset|hash 6K上下 2. string类型的value值大小会影响到avg rt,2000字节以下影响很小, 2000以上影响较明显(这个影响其实并非redis本身的性能...

2020-12-04 18:46:29 1214

原创 响应式编程学习指南

1. 响应式编程入门JDK历史版本对响应式编程的支持。jdk8中,已经出现了一些响应式编程的影子(CompletableFuture&Stream)。jdk9通过java.util.concurrent.Flow包,提供了对于 Reactive 的完整支持。Reactive响应式流入门这篇文章基于jdk9给出了一个"hello world"级别的例子,给初学者一个初式的印象。2. 进一步了解响应式编程spring5及spring boot2开启了对响应式编程的支持,这两个版本基于jdk8

2020-11-13 14:01:29 468

转载 Project Reactor 深度解析

现在, Java 的各种基于 Reactor 模型的响应式编程库或者框架越来越多了,像是 RxJava,Project Reactor,Vert.x 等等等等。在 Java 9, Java 也引入了自己的 响应式编程的一种标准接口,即java.util.concurrent.Flow这个类。这个类里面规定了 Java 响应式编程所要实现的接口与抽象。我们这个系列要讨论的就是Project Reactor这个实现。这里也提一下,为了能对于没有升级到 Java 9 的用户也能兼容,java.util.con

2020-11-13 11:43:56 2915

转载 Project Reactor 核心原理解析

一、开篇本文将解析 Spring 的 Reactor 项目的源码。主要目的是让自己能深入理解 Reactor 这个项目,以及 Spring 5 和 Spring Boot 2。Project Reactor 项目地址:https://github.com/reactorReactor 项目主要包含 Reactor Core 和 Reactor Netty 两部分。Reactor Core 实现了反应式编程的核心功能,Reactor Netty 则是 Spring WebFlux 等技术的基础。本

2020-11-12 11:01:18 1347

原创 RocketMQ集群中某台主broker宕机后,consumer端发生了什么

首先,我们明确下从broker在rocketmq集群中到底扮演着什么角色?1. 当主服务器宕机时,从服务器会接管消息消费,但不会接管消息发送(持有异议)2. 主服务器压力过大时,从服务器接管拉取服务。参阅: https://blog.csdn.net/qian_348840260/article/details/109628130在哪里选择拉取的broker?DefaultMQPushConsumerImpl#pullMessage 拉取回调中决定下一次拉取选择主broker还是从...

2020-11-11 19:39:19 2492

转载 RocketMQ HA机制(主从同步)

原创:https://mp.weixin.qq.com/s/QnFDFBOoI6pDZf8L2KpBDg温馨提示:建议参考代码RocketMQ4.4版本,4.5版本引入了多副本机制,实现了主从自动切换,本文并不关心主从切换功能。本节目录 1、初识主从同步 2、提出问题 3、原理探究 3.1 RocketMQ主从读写分离机制 3.2 消息消费进度同步机制 3.2.1 从服务定时同步主服务器进度 3.2.2 主服务器消息拉取时更...

2020-11-11 18:36:58 826

原创 Rocketmq 消息消费监控

比较通用的消息监控方式: 累加consumer负载的consumer queue的消息延迟量,消息延迟量= brokerOffset-consumerOffset.这个统计并不严谨:1. consumer queue中存储的消息是全量消息,而consumer客户端订阅的往往是过滤消息 ( by tag)2. consumerOffset并非实时更新,可能异步更新,也可能是下次拉取消息的时候更新的,也可能因为此条消息消费卡顿导致一直无法正常更新进度,因此存在一定的更新延迟。推荐的监控方式:

2020-11-09 16:41:19 1295

转载 Reactive响应式流入门

再谈响应式在前一篇文章 从Reactive编程到“好莱坞” 中,谈到了响应式的一些概念,讲的有些发散。但仅仅还是停留在概念的层面,对于实战性的东西并没有涉及。所以大家看了后,或许还是有些不痛不痒。响应式编程强调的是异步化、面向流的处理方式,这两者也并非凭空生出,而是从大量的技术实践中总结提炼出来的概念,就比如:我们谈异步化,容易联想到 Java 异步IO(Asynchronized IO),而且习惯于将其和 BIO、NIO等概念来做对比。殊不知,老早出现的 Swing 框架(Java UI)就已

2020-11-04 14:53:45 1076

原创 Rocketmq 发送成功是指? (同步发送 异步发送 & 同步刷盘 异步刷盘)

同开始接触Rocketmq的童鞋总容易把同步发送(异步发送)和同步刷盘(异步刷盘)混淆在一起,纠缠同步发送是不是和异步刷盘相矛盾,发送成功是指消息commit.log成功,还是追加到映射文件中成功又或者是发送到sendThreadPoolQueue就算成功,直接返回。在这里需要明确的是,发送是指客户端的行为,同步发送是客户等待结果返回才继续向下运行程序,而异步发送是指客户端另启一线程,执行发送消息,成功后执行回调。而同步刷盘和异步刷盘是broker端的行为,异同点在于何时将映射文件中的消息flush到硬盘上

2020-10-29 11:27:49 786

原创 Rocketmq 部署架构

1、主,从服务器都在运行过程中,消息消费者是从主拉取消息还是从从拉取?答:默认情况下,RocketMQ消息消费者从主服务器拉取,当主服务器积压的消息超过了物理内存的40%,则建议从从服务器拉取。但如果slaveReadEnable为false,表示从服务器不可读,从服务器也不会接管消息拉取。2、当消息消费者向从服务器拉取消息后,会一直从从服务器拉取?答:不是的。分如下情况:1)如果从服务器的slaveReadEnable设置为false,则下次拉取,从主服务器拉取。2)如果从服务器允许读取并且从

2020-10-28 17:51:36 364 1

转载 Rocketmq TIMEOUT_CLEAN_QUEUE源码追踪

1、问题现象首先接到项目反馈使用 RocketMQ 会出现如下错误:错误信息关键点:MQBrokerException:CODE:2 DESC:[TIMEOUT_CLEAN_QUEUE]broker busy,start flow control for a while,period in queue:205ms,size of queue:880。由于项目组并没有对消息发送失败做任何补偿,导致丢失消息发送失败,故需要对这个问题进行深层次的探讨,并加以解决。2、问题分析首先我们根据关键字:

2020-10-27 11:27:20 1707

原创 RocketMQ顺序消费加锁机制

Rocketmq在顺序消费时,为了保证消息消费的有序性,使用了加锁机制,即对messageQueue进行全局加锁,其实现原理可参考源码分析RocketMQ顺序消息消费实现原理,本节不作源码分析,重点在解答为什么要全局加锁。不少文章给出的原因是:当topic的队列个数小于消费组中消费者的个数,会导致多个消费者消费同一个queue,存在竞争。但是查看AllocateMessageQueueStrategy的实现源码,发现topic的队列个数小于消费组中消费者的个数时,会导致超出个数的消费者无队列可消费,即负载不

2020-10-22 14:11:33 2118 7

原创 RocketMQ 同步刷盘&异步刷盘

刷盘的入口方法在CommitLog#putMessagehandleDiskFlush(result, putMessageResult, msg); public void handleDiskFlush(AppendMessageResult result, PutMessageResult putMessageResult, MessageExt messageExt) { // Synchronization flush if (FlushDiskTy

2020-10-21 16:26:28 1147

转载 Rocketmq broker写入能力查看

如何证明 RocketMQ 集群本身没有问题呢?其实也很简单,我们通常一个常用的技巧是查看 RocketMQ 消息写入的性能,执行如下命令:cd ~/logs/rocketmqlogs/grep 'PAGECACHERT' store.log | more其输出的结果如下图所示:在 RocketMQ Broker 中会每隔 1 分钟打印出上一分钟消息写入的耗时分布,例如 [<=0ms] 表示在这一秒钟写入消息在 Broker 端的延时小于 0ms 的消息条数,其他的依次类推,通

2020-10-20 11:21:13 650

转载 RocketMQ 消费端限流机制

RocketMQ 消息消费端会从 3 个维度进行限流:消息消费端队列中积压的消息超过 1000 条 消息处理队列中尽管积压没有超过 1000 条,但最大偏移量与最小偏移量的差值超过 2000 消息处理队列中积压的消息总大小超过 100M为了方便理解上述三条规则的设计理念,我们首先来看一下消费端的数据结构,如下图所示:PullMessageService 线程会按照队列向 Broker 拉取一批消息,然后会存入到 ProcessQueue 队列中,即所谓的处理队列,然后再提交到消费端线程池中

2020-10-20 11:15:32 5161 1

原创 rocketmq 查找消息堆积原因的一种思路(jstack)

rocketmq发生消息堆积时,我们可以通过jstack打印出线程的堆栈信息(可连续打印多次观察变化)。重点搜索 ConsumeMessageThread_ 开头的线程状态,例如下图所示:如果发现大量的线程总是处于runnable状态,且堆栈信息中包含类似HttpClientUtil.doGet的信息,且有可能是因为http请求处理慢,导致大量线程被占用,消费能力不足导致消息堆积。解决思路,优优http请求,如设置较短的过期时间等。如果发现大量的消费线程处于WAITING(parking)状态,

2020-10-20 10:58:41 2008 2

转载 源码分析RocketMQ之消息消费重试机制

主要关注业务方在消息消费失败后,返回 ConsumeConcurrentlyStatus.RECONSUME_LATER ,专业术语:业务方每条消息消费后要告诉 MQ 消费者一个结果(ack,message back),触发 MQ 消息消费重试机制,然后 MQ 消费者需要反馈给 MQ(Broker)。备注:主要针对的还是非顺序消息,顺序消息在后续专题详细分析。1、消息消费处理代码入口:ConsumeMessageConcurrentlyService ConsumeRequest run方法

2020-10-19 17:36:24 545

原创 Rocketmq offset进度管理

下文以DefaultMQPushConsumerImpl集群模式消费消息为例。概述消息消费完成后,需要将消费进度存储起来,即前面提到的offset。广播模式下,同消费组的消费者相互独立,消费进度要单独存储;集群模式下,同一条消息只会被同一个消费组消费一次,消费进度会参与到负载均衡中,故消费进度是需要共享的。消费者端提交offset入口入口在org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService#

2020-10-19 17:24:48 1606 1

原创 Rocketmq 顺序消费的几点建议

为了保证消息消费的有序性,Rocketmq在发送消息时需要通过MessageQueueSelector指定具体发送的consumerQueue。顺序消费的事件监听器为 MessageListenerOrderly,表示顺序消费。在使用时,需求注意以下几点:1. 消费端为了保证有序消费,在拉取消费和消费消息时,都会在broker端获取queue的锁。如果topic的队列个数小于消费组中消费者的个数,会导致多个消费者消费同一个queue,会频繁的获取queue的锁,释放锁,产生竞争 。因此在使用顺序

2020-10-16 17:31:28 1386

原创 Rocketmq中的DefaultMQPushConsumer是如何拉取消息的?

1 假设关系图如下:图12 启动流程如下:3 一切美好的事情都从PullMessageService的run方法开始了: 3.1 run方法会不断的从LinkedBlockingQueue中获取PullRequest对象,然后根据PullRequest进行消息拉取。 问题1:是谁把PullRequest放到LinkedBlockingQueue中呢? 答:第一次加入是在consumer的rebalance流程中,rebalance完毕会将PullReques...

2020-10-14 17:17:32 887

原创 从Rocketmq的事务消息来看数据的强一致性

在分布式系统中经常遇到类似的场景: 本地执行DB业务操作,并通知微服务执行其他的业务操作。这里就涉及到数据一致性的问题,如何保证两个系统的操作同时成功或者同时失败?Rocketmq事务消息可以保证业务与消息发送这两个操作的强一致性,为大家提供了一种思路。传统的操作:事物{ 1.调用接口 2.业务逻辑处理}上述传统操作存在如下问题: 调用接口成功但业务逻辑处理失败,有可能导致数据不一致。调用接口后,正好kill -9,必然导致数据不一致。Rocketmq是如...

2020-10-10 17:59:40 362 1

原创 rocketmq中的读写队列

在创建或更改topic时,需要配置writeQueueNums和readQueueNums数,这里的读写队列有什么作用?初识rocketmq的童鞋,很容易把读写队列和读写分离混淆在一起。其实在rocketmq里是完全不同的两个概念。读写分离,是用HA机制,将一个节点的数据同步到另外一个节点,主节点多用于写(也可读),从节点只用于读。往往一主多从,通过读写分离减轻系统压力。读写队列,则是在做路由信息时使用。在消息发送时,使用写队列个数返回路由信息,而消息消费时按照读队列个数返回路由信息。在物理文件层面

2020-10-09 11:33:13 6882 9

转载 RocketMQ 如何基于mmap+page cache实现磁盘文件的高性能读写?

1、mmap:Broker读写磁盘文件的核心技术今天我们要给大家介绍一个非常关键的黑科技,很多人可能都不太熟悉,这个技术就是mmap技术,而Broker中就是大量的使用mmap技术去实现CommitLog这种大磁盘文件的高性能读写优化的。通过之前的学习,我们知道了一点,就是Broker对磁盘文件的写入主要是借助直接写入os cache来实现性能优化的,因为直接写入os cache,相当于就是写入内存一样的性能,后续等os内核中的线程异步把cache中的数据刷入磁盘文件即可。那么今天我们就要对这个

2020-09-27 16:19:51 422

原创 httpclient驱逐连接策略

生产事故:早高峰订单量突涨,下游etq接口调用异常(部分),org.apache.http.NoHttpResponseException: serverfailed to respond。第一感觉下游应用服务响应能力不足(服务端连接数配置过低或者需要扩容)。线上日志分析发现,此case频率并不高,一分钟发生1-2次,异常10次左右恢复正常,后续继续观察,未再有异常抛出。疑问:应用服务响应能力不足一般会导致上游服务响应时间过长,并持续一段时间,如果无降级且量一直在增长,甚至有可能引发雪崩。但日.

2020-09-25 15:37:00 1012

原创 RocketMq product 故障规避机制

消息发送高可用设计与故障规避机制熟悉 RocketMQ 的小伙伴应该都知道,RocketMQ Topic 路由注册中心 NameServer 采用的是最终一致性模型,而且客户端是定时向 NameServer 拉取 Topic 的路由信息,即客户端(Producer、Consumer)是无法实时感知 Broker 宕机的,这样消息发送者会继续向已宕机的 Broker 发送消息,造成消息发送异常。那 RocketMQ 是如何保证消息发送的高可用性呢?RocketMQ 为了保证消息发送的高可用性,在内部引

2020-09-22 16:36:49 605 2

原创 RocketMQ 中 clientId的使用陷阱

试验环境部署架构部署了两套 RocketMQ 集群,在 DefaultCluster 集群上创建 Topic——dw_test_01,并在 DefaultClusterb 上创建 Topic——dw_test_02,现在的需求是 order-service-app 要向 dw_test_01、dw_test_02 上发送消息。给出的示例代码如下:public static void main(String[] args) throws Exception{ // 创建第一...

2020-09-22 16:20:16 3515 1

原创 20. 首汽sentinel简介

一、sentinel简介Sentinel是一个具有流量控制、熔断降级、系统负载保护等多个维度保护服务稳定性的开源框架二、使用sentinel 的目的通过使用Sentinel, 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。当异常发生时,非核心链路走降级策略,降低一定的用户体验来,保证系统的稳定性..三、使用方式步骤一: 升级组件版本到1.1.5或者以上 1

2020-09-19 13:30:12 135

转载 19. Sentinel 主流框架适配

使用 Sentinel 需要用 try-catch-finally 将需要保护的资源(方法或者代码块)包装起来,在目标方法或者代码块执行之前,调用 ContextUtil#enter 方法以及 SphU#entry 方法,在抛出异常时,如果非 BlockException 异常需要调用 Tracer#trace 记录异常,修改异常指标数据,在 finally 中需要调用 Entry#exit 方法,以及 ContextUtil#exit 方法。为了节省这些步骤,Sentinel 提供了对主流框架的适配,

2020-09-19 13:15:42 407

转载 18. Sentinel 动态数据源:规则动态配置

经过前面的学习,我们知道,为资源配置各种规则可使用 Sentinel 提供的各种规则对应的 loadRules API,但这种以编码的方式配置规则很难实现动态修改。但基于 Sentinel 提供的各种规则对应的 loadRules API,我们可以自己实现规则的动态更新,而这一功能几乎在每个需要使用 Sentinel 的微服务项目中都需要实现一遍。Sentinel 也考虑到了这点,所以提供了动态数据源接口,并且提供了多种动态数据源的实现,尽管我们可能不会用到。动态数据源作为扩展功能放在 sentinel

2020-09-19 13:13:16 1651

原创 17. Sentinel 集群限流的实现

Sentinel不仅仅支持单机限流,也支持集群限流。Sentinel 支持两种模式启动集群限流服务端,分别是嵌入模式、独立模式。嵌入模式(Embedded)集群限流服务端作为应用的内置服务同应用一起启动,与应用在同一个进程,可动态的挑选其中一个节点作为集群限流服务端,独立模式(Alone)集群限流服务端作为一个独立的应用部署集群限流 每一次qps请求都需要与集群限流服务器通讯,无疑增了性能的损耗(Sentinel作了很多优化,据说性能接近于redis)。因此生产环境不建...

2020-09-19 13:08:49 651

转载 16. 自定义 ProcessorSlot 实现开关降级

开关降级在我们公司的电商项目中是每个微服务都必须支持的一项功能,主要用于活动期间、每日流量高峰期间、主播带货期间关闭一些无关紧要功能,降低数据库的压力。开关降级实现起来很简单,例如,我们可以使用 Spring AOP 或者动态代理模式拦截目标方法的执行,在方法执行之前,先根据 key 从 Redis 读取 value,如果 value 是 true,则不执行目标方法,直接响应服务降级。这种方式付出的性能损耗就只有一次 redis 的 get 操作,如果不想每个请求都读 Redis 缓存,也可以通过动态配

2020-09-19 12:39:16 362

原创 15. ParamFlowSlot 热点参数限流

热点参数限流并非在 Sentinel 的 core 模块中实现的,而是在扩展模块中实现的。主要是根据同一资源不同的参数进行限流。之前的限流策略都是针对资源维度的,热点参数限流则将维度细化到资源的某个参数上。热点参数限流统计指标及获取指标的方式与FlowSlot等不同,使用ParamMapBucket来统计数据,使用HotParameterLeapArray来实现滑动窗口。...

2020-09-19 11:58:35 893

原创 14. AuthoritySlot 来源访问控制

AuthoritySlot 来源访问控制,也称为黑白名单控制。根据配置中的limitApp,对不同的origin进行限制,如果是白名单的则不做限流,如果黑名单的禁止访问。其实更像一种对访问来源系统的授权操作。源码很简单,代码风格同FlowSlot....

2020-09-19 11:24:27 376

原创 13. SystemSlot 自适应限流

系统自适应限流规则配置系统自适应限流规则针对所有流量类型为 IN 的资源生效,因此不需要配置规则的资源名称。SystemRule 定义的字段如下:public class SystemRule extends AbstractRule { private double highestSystemLoad = -1; private double highestCpuUsage = -1; private double qps = -1; private long a

2020-09-19 11:14:38 256

原创 12. DegradeSlot 熔断降级

熔断降级是Sentinel生产环境使用范围最广的一种降级手段。前文讲的限流降级其实并不常用。QPS增加分为正常增加和异常增加,在流量为王的互联网时代,QPS正常增加一般都通过横向扩展机器,而不是硬性拒绝访问来处理,避免影响用户体验。而QPS异常增加,比如说受到攻击等,则往往在四七层进行拦截(lvs或者nginx)。熔断规则可配置的属性public class DegradeRule extends AbstractRule { // 可配置字段 private double cou

2020-09-19 11:02:50 770

原创 11. DefaultController&RateLimiterController

DefaultControllerDefaultController 是默认使用的流量效果控制器,直接拒绝超出阈值的请求。当 QPS 超过限流规则配置的阈值,新的请求就会被立即拒绝,抛出 FlowException。适用于对系统处理能力明确知道的情况下,比如通过压测确定阈值。实际上我们很难测出这个阈值,因为一个服务可能部署在硬件配置不同的服务器上,并且随时都可能调整部署计划。public class DefaultController implements TrafficShapingContro

2020-09-18 18:22:46 681

一份详尽的jdbc教材

一份非常详尽的jdbc教材,入门和提高必备。JAVA程序员

2018-06-27

JAVA单点登录

单点登录实例、JAR包及相关说明、常见异常等.非常不错的资源。

2013-04-26

lucene in action第二版(word版)

这是公认的最优秀的讲解lucene的书。书中详细讲解了lucene 2.9 API的使用,并指明了使用lucene构建搜索引擎的经验,包括:内存溢出、分页技巧、分词、结果打分、update索引注意事项等等。

2010-04-02

"四人帮"设计模式(达内串讲)

介绍了"四人帮模式"中最常见的十九种,很值的收藏一下

2009-05-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除