自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(299)
  • 资源 (3)
  • 收藏
  • 关注

原创 消息的衰减重试

为了保证消息肯定至少被消费一次,RocketMQ会把这批消息重新发回到broker,在延迟的某个时间点(默认是10秒,业务可设置)后,再次投递到这个ConsumerGroup。而如果一直这样重复消费都持续失败到一定次数(默认16次),就会投递到DLQ死信队列。应用可以监控死信队列来做人工干预可以修改broker-a.conf文件messageDelayLevel = 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h...

2020-10-31 23:11:35 354

原创 消息消费端的确认机制

RocketMQ提供了ack机制,以保证消息能够被正常消费。发送者为了保证消息肯定消费成功,只有使用方明确表示消费成功,RocketMQ才会认为消息消费成功。中途断电,抛出异常等都不会认为成功consumer.registerMessageListener((MessageListenerConcurrently) (list,consumeOrderlyContext) -> { list.stream().forEach(messageExt -> System.out....

2020-10-31 23:10:42 475

原创 消息的的可靠性原则

在实际使用RocketMQ的时候我们并不能保证每次发送的消息都刚好能被消费者一次性正常消费成功,可能会存在需要多次消费才能成功或者一直消费失败的情况,那作为发送者该做如何处理呢?...

2020-10-31 23:09:14 230

原创 消费端的负载均衡

和kafka一样,消费端也会针对Message Queue做负载均衡,使得每个消费者能够合理的消费多个分区的消息。消费端会通过RebalanceService线程,10秒钟做一次基于topic下的所有队列负载消费端遍历自己的所有topic,依次调rebalanceByTopic根据topic获取此topic下的所有queue选择一台broker获取基于group的所有消费端(有心跳向所有broker注册客户端信息)选择队列分配策略实例AllocateMessageQueueStra...

2020-10-31 23:08:24 180

原创 如何保证消息消费顺序呢?

通过分区规则可以实现同类消息在rocketmq上的顺序存储。但是对于消费端来说,如何保证消费的顺序?我们前面写的消息消费代码使用的是MessageListenerConcurrently并发监听,也就是基于多个线程并行来消费消息。这个无法保证消息消费的顺序。RocketMQ中提供了MessageListenerOrderly 一个类来实现顺序消费,consumer.subscribe("store_topic_test","*");consumer.registerMessageList...

2020-10-31 23:06:13 467

原创 自定义消息发送规则

通过自定义发送策略来实现消息只发送到同一个队列因为一个Topic 会有多个Message Queue ,如果使用Producer 的默认配置,这个Producer 会轮流向各个Message Queue 发送消息。Consumer 在消费消息的时候,会根据负载均衡策略,消费被分配到的Message Queue如果不经过特定的设置,某条消息被发往哪个Message Queue ,被哪个Consumer 消费是未知的如果业务需要我们把消息发送到指定的Message Queue 里,比如把同一类型..

2020-10-31 23:04:21 307

原创 消息的顺序消费

首先,需要保证顺序的消息要发送到同一个messagequeue中;其次,一个messagequeue只能被一个消费者消费,这点是由消息队列的分配机制来保证的;最后,一个消费者内部对一个mq的消费要保证是有序的。我们要做到生产者 - messagequeue - 消费者之间是一对一对一的关系。...

2020-10-31 23:02:29 347

原创 消息发送到topic多个MessageQueue

接下来演示一下对topic创建多个messageQueue的演示1. 创建一个队列,设置2个写队列以及2个读队列,如果读和写队列不一致,会存在消息无法消费到的问题2. 构建生产者和消费者:参考上面写的生产者消费者代码3. 消费者数量控制对于队列的消费情况 a) 如果消费队列为2,启动一个消费者,那么这个消费者会消费者两个队列, b) 如果两个消费者消费这个队列,那么意味着消息会均衡分摊到这两个消费者中 c) 如果消费者数大于readQueueNum...

2020-10-31 22:41:20 398

原创 RocketMQ消息发送及消费的基本原理

这是一个比较宏观的部署架构图,rocketmq天然支持高可用,它可以支持多主多从的部署架构,这也是和kafka最大的区别之一原因是RocketMQ中并没有master选举功能,所以通过配置多个master节点来保证rocketMQ的高可用。和所有的集群角色定位一样,master节点负责接受事务请求、slave节点只负责接收读请求,并且接收master同步过来的数据和slave保持一直。当master挂了以后,如果当前rocketmq是一主多从,就意味着无法接受发送端的消息,但是消费者仍然能够继续消费。.

2020-10-31 22:34:38 872

原创 RocketMQ消息支持的模式-OrderProducer(顺序)

前面我们学习kafka的时候有说到,消息可以通过自定义分区策略来失效消息的顺序发送,实现原理就是把同一类消息都发送到相同的分区上。在RocketMQ中,是基于多个Message Queue来实现类似于kafka的分区效果。如果一个Topic 要发送和接收的数据量非常大, 需要能支持增加并行处理的机器来提高处理速度,这时候一个Topic 可以根据需求设置一个或多个Message Queue。Topic 有了多个Message Queue 后,消息可以并行地向各个Message Queue 发送,消费者也

2020-10-31 22:19:46 774

原创 RocketMQ消息支持的模式-OneWay

单向(Oneway)发送特点为发送方只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答.效率最高

2020-10-31 22:18:25 554

原创 RocketMQ消息支持的模式-消息异步发送

异步发送是指发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。 MQ 的异步发送,需要用户实现异步发送回调接口(SendCallback)。消息发送方在发送了一条消息后,不需要等待服务器响应即可返回,进行第二条消息发送。发送方通过回调接口接收服务器响应,并对响应结果进行处理异步代码改造producer.send(msg, new SendCallback() { @Override public void onSuccess(SendResult sendR...

2020-10-31 22:17:22 721

原创 RocketMQ消息支持的模式-消息同步发送

普通消息的发送和接收在前面已经演示过了,在上面的案例中是基于同步消息发送模式。也就是说消息发送出去后,producer会等到broker回应后才能继续发送下一个消息

2020-10-31 22:15:17 138

原创 rocketmq控制台安装

启动好服务以后,总得有一个可视化界面来看看我们配置的节点情况吧。rocket官方提供了一个可视化控制台,大家可以在这个地址下载https://github.com/apache/rocketmq-externals这个是rocketmq的扩展,里面不仅包含控制台的扩展,也包含对大数据flume、hbase等组件的对接和扩展。下载源码包https://github.com/apache/rocketmq-externals/archive/master.zip解压并修改配置cd...

2020-10-31 21:56:12 393

原创 消息发送和接收基本应用

添加jar包依赖<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.5.2</version></dependency>生产者public class RocketMqProducer { p...

2020-10-31 21:35:07 530

原创 RocketMQ安装内存不足的问题

这是因为bin 目录下启动 nameserv 与 broker 的 runbroker.sh 和 runserver.sh 文件中默认分配的内存太大,rocketmq比较耗内存,所以默认分配的内存比较大,而系统实际内存却太小导致启动失败,通常像虚拟机上安装的 CentOS 服务器内存可能是没有高的,只能调小。实际中应该根据服务器内存情况,配置一个合适的值# There is insufficient memory for the Java Runtime Environment to continu.

2020-10-31 21:02:28 1475

原创 单机环境RocketMQ的安装

下载并解压安装包1. 下载rocketmq的安装文件: http://rocketmq.apache.org2. 【unzip rocketmq-all-4.5.0-bin-release.zip】 解压压缩包启动nameserver1. 【nohup sh mqnamesrv &】进入到bin目录下,运行namesrv,启动NameServer ->ps: nohupcommand & 表示在后台运行2. 默认情况下,nameserver监听的是9876端...

2020-10-31 20:58:00 109

原创 RocketMQ的架构

集群本身没有什么特殊之处,和kafka的整体架构类似,其中zookeeper替换成了NameServer。在rocketmq的早版本(2.x)的时候,是没有namesrv组件的,用的是zookeeper做分布式协调和服务发现,但是后期阿里数据根据实际业务需求进行改进和优化,自组研发了轻量级的namesrv,用于注册Client服务与Broker的请求路由工作,namesrv上不做任何消息的位置存储,频繁操作zookeeper的位置存储数据会影响整体集群性能RocketMQ由四部分组成1)...

2020-10-31 20:53:43 127

原创 RocketMQ的发展历史

RocketMq是一个由阿里巴巴开源的消息中间件, 2012年开源,2017年成为apache顶级项目。它的核心设计借鉴了Kafka,所以我们在了解RocketMQ的时候,会发现很多和kafka相同的特性。同时呢,Rocket在某些功能上和kafka又有较大的差异,接下来我们就去了解RocketMQ1. 支持集群模型、负载均衡、水平扩展能力2. 亿级别消息堆积能力3. 采用零拷贝的原理,顺序写盘,随机读4. 底层通信框架采用Netty NIO5. NameServer代替Zook..

2020-10-31 20:47:10 949

原创 MQ消息存储选择

从主流的几种MQ消息队列采用的存储方式来看,主要会有三种1. 分布式KV存储,比如ActiveMQ中采用的levelDB、Redis, 这种存储方式对于消息读写能力要求不高的情况下可以使用2. 文件系统存储,常见的比如kafka、RocketMQ、RabbitMQ都是采用消息刷盘到所部署的机器上的文件系统来做持久化,这种方案适合对于有高吞吐量要求的消息中间件,因为消息刷盘是一种高效率,高可靠、高性能的持久化方式,除非磁盘出现故障,否则一般是不会出现无法持久化的问题3. 关系型数据库,比如Acti

2020-10-31 20:45:08 864

原创 思考一下消息中间件的设计

可以先从基本的需求开始思考最基本的是要能支持消息的发送和接收,需要涉及到网络通信就一定会涉及到NIO消息中心的消息存储(持久化/非持久化)消息的序列化和反序列化是否跨语言消息的确认机制,如何避免消息重发高级功能消息的有序性是否支持事务消息消息收发的性能,对高并发大数据量的支持是否支持集群消息的可靠性存储是否支持多协议...

2020-10-31 20:35:02 55

原创 什么是JMX?

JMX全称是Java Management Extensions。Java 管理扩展。 它提供了对Java应用程序和JVM的监控和管理功能。通过JMX,我们可以监控1. 服务器中的各种资源的使用情况,CPU、内存2. JVM内存的使用情况3. JVM线程使用情况比如前面讲的Actuator中,就是基于JMX的技术来实现对endpoint的访问...

2020-10-31 18:04:48 2792

原创 Actuator对于JMX支持

除了REST方式发布的Endpoint,Actuator还把它的端点以JMX MBean的方式发布出来,可以通过JMX来查看和管理。操作步骤在cmd中输入jconsole,连接到spring-boot的应用就可以看到JBean的信息以及相应的操作。比如可以在操作菜单中访问shutdown的endpoint来关闭服务...

2020-10-31 18:02:33 414 1

原创 关于health的原理

应用健康状态的检查应该是监控系统中最基本的需求,所以我们基于health来分析一下它是如何实现的。SpringBoot预先通过org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration这个就是基于spring-boot的自动装配来载入的。所以,我们可以在actuator-autoconfigure这个包下找到spring.factories。Actuator中提供了...

2020-10-31 18:00:43 610

原创 Actuator提供的endpoint

启动服务之后,可以通过下面这个地址看到actuator提供的所有Endpoint地址http://localhost:8080/actuator可以看到非常多的Endpoint。 有一些Endpoint是不能访问的,涉及到安全问题。如果想开启访问那些安全相关的url,可以在application.xml中配置, 开启所有的endpointmanagement.endpoints.web.exposure.include=*health针对当前SpringBoot应用的健康...

2020-10-31 17:57:53 524 1

原创 SpringBoot另一大神器-Actuator

微服务应用开发完成以后,最终目的是为了发布到生产环境上给用户试用,开发结束并不意味着研发的生命周期结束,更多的时候他只是一个开始,因为服务在本地测试完成以后,并不一定能够非常完善的考虑到各种场景。所以需要通过运维来保障服务的稳定。在以前的传统应用中,我们可以靠人工来监控。但是微服务中,几千上万个服务,我们需要了解每个服务的健康状态,就必须要依靠监控平台来实现。所以在SpringBoot框架中提供了 spring-boot-starter-actuator 自动配置模块来支持对于SpringBoo..

2020-10-31 17:54:56 149

原创 简单介绍日志的发展历史

最早的日志组件是Apache基金会提供的Log4j,log4j能够通过配置文件轻松的实现日志系统的管理和多样化配置,所以很快被广泛运用。也是我们接触得比较早和比较多的日志组件。它几乎成了Java社区的日志标准。据说Apache基金会还曾经建议Sun引入Log4j到java的标准库中,但Sun拒绝了。 所以sun公司在java1.4版本中,增加了日志库(Java Util Logging)。其实现基本模仿了Log4j的实现。在JUL出来以前,Log4j就已经成为一项成熟的技术,使得Log4j在选择上占据.

2020-10-31 17:07:07 529

原创 Java中常见的日志框架

可能是太过于常见了,所以使得大家很少关注,只是要用到的时候复制粘贴一份就行,甚至连日志配置文件中的配置语法都不清楚。另外一方面,Java中提供的日志组件太多了,一会儿log4j,一会儿logback,一会儿又是log4j2.不清楚其中的关联Java中常用的日志框架: Log4j、Log4j 2、Commons Logging、Slf4j、Logback、Jul(Java Util Logging)...

2020-10-31 17:01:31 139 1

原创 spring-boot-starter-logging

在实际应用中,日志是最重要的一个组件:1. 它可以为系统提供错误以及日常的定位;2. 也可以对访问的记录进行跟踪;3. 当然,在很多大型的互联网应用中,基于日志的收集以及分析可以了解用户的用户画像,比如兴趣爱好、点击行为。...

2020-10-31 16:59:54 287

原创 什么是Starter

Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。我们在Maven的依赖中加入spring-boot-starter-web就能使项目支持Spring MVC,并且Spring Boot还为我们做了很多默认配置,无需再依赖spring-web、spring-webmvc.

2020-10-31 16:04:35 2291

原创 深入理解条件过滤Conditional

在分析AutoConfigurationImportSelector的源码时,会先扫描spring-autoconfiguration-metadata.properties文件,最后在扫描spring.factories对应的类时,会结合前面的元数据进行过滤,为什么要过滤呢?原因是很多的@Configuration其实是依托于其他的框架来加载的,如果当前的classpath环境下没有相关联的依赖,则意味着这些类没必要进行加载,所以,通过这种条件过滤可以有效的减少@configuration类的数量从而降.

2020-10-31 11:13:12 198

原创 Spring框架中的SpringFactoriesLoader

为了给大家补一下基础,我在这里简单分析一下SpringFactoriesLoader这个工具类的使用。它其实和java中的SPI机制的原理是一样的,不过它比SPI更好的点在于不会一次性加载所有的类,而是根据key进行加载。首先,SpringFactoriesLoader的作用是从classpath/META-INF/spring.factories文件中,根据key来加载对应的类到spring IoC容器中。...

2020-10-31 11:08:47 165

原创 @EnableAutoConfiguration注解的实现原理

了解了ImportSelector和ImportBeanDefinitionRegistrar后,对于EnableAutoConfiguration的理解就容易一些了它会通过import导入第三方提供的bean的配置类:AutoConfigurationImportSelector@Import(AutoConfigurationImportSelector.class)从名字来看,可以猜到它是基于ImportSelector来实现基于动态bean的加载功能。之前我们讲过Springboot @..

2020-10-31 11:07:36 305

原创 AutoConfigurationImportSelector是什么?

Enable注解不仅仅可以像前面演示的案例一样很简单的实现多个Configuration的整合,还可以实现一些复杂的场景,比如可以根据上下文来激活不同类型的bean,@Import注解可以配置三种不同的class1. 第一种就是前面演示过的,基于普通bean或者带有@Configuration的bean进行诸如2. 实现ImportSelector接口进行动态注入3. 实现ImportBeanDefinitionRegistrar接口进行动态注入...

2020-10-31 11:04:54 525

原创 深入分析EnableAutoConfiguration

EnableAutoConfiguration的主要作用其实就是帮助springboot应用把所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器中。再回到EnableAutoConfiguration这个注解中,我们发现它的import是这样@Import(AutoConfigurationImportSelector.class)public @interfaceEnableAutoConfiguration {...

2020-10-31 11:03:20 1243

原创 简单分析EnableAutoConfiguration

我们把EnableAutoConfiguration放在最后讲的目的并不是说它是一个新的东西,只是他对于springboot来说意义重大。Enable并不是新鲜玩意仍然是在spring3.1版本中,提供了一系列的@Enable开头的注解,Enable主机应该是在JavaConfig框架上更进一步的完善,是的用户在使用spring相关的框架是,避免配置大量的代码从而降低使用的难度比如常见的一些Enable注解:EnableWebMvc,(这个注解引入了MVC框架在Spring 应用中需要用到...

2020-10-31 10:33:32 629

原创 简单分析ComponentScan

ComponentScan这个注解是大家接触得最多的了,相当于xml配置文件中的<context:component-scan>。它的主要作用就是扫描指定路径下的标识了需要装配的类,自动装配到spring的Ioc容器中。标识需要装配的类的形式主要是:@Component、@Repository、@Service、@Controller这类的注解标识的类。ComponentScan默认会扫描当前package下的的所有加了相关注解标识的类到IoC容器中;...

2020-10-31 10:30:19 418

原创 简单分析@Configuration

Configuration这个注解大家应该有用过,它是JavaConfig形式的基于Spring IOC容器的配置类使用的一种注解。因为SpringBoot本质上就是一个spring应用,所以通过这个注解来加载IOC容器的配置是很正常的。所以在启动类里面标注了@Configuration,意味着它其实也是一个IoC容器的配置类。传统意义上的spring应用都是基于xml形式来配置bean的依赖关系。然后通过spring容器在启动的时候,把bean进行初始化并且,如果bean之间存在依赖关系,则分析.

2020-10-31 10:28:47 291

原创 从SpringBootApplication注解入手

为了揭开springboot的奥秘,我们直接从Annotation入手,看看@SpringBootApplication里面,做了什么?打开SpringBootApplication这个注解,可以看到它实际上是一个复合注解@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration -实际上是@Configuration@En...

2020-10-31 10:25:35 90

原创 springboot约定优于配置的体现

约定优于配置的体现主要是1. maven的目录结构a) 默认有resources文件夹存放配置文件b) 默认打包方式为jar2. spring-boot-starter-web中默认包含spring mvc相关依赖以及内置的tomcat容器,使得构建一个web应用更加简单3. 默认提供application.properties/yml文件4. 默认通过spring.profiles.active属性来决定运行环境时读取的配置文件5. EnableAutoConfi...

2020-10-31 10:07:00 440

score.csv (score.csv)

load data local inpath '/export/servers/hivedatas/score.csv' into table score2 partition(year='2018',

2020-02-29

teacher.csv

load data local inpath '/export/servers/hivedatas/student.csv' overwrite into table student;

2020-02-29

student.csv

load data local inpath '/export/servers/hivedatas/student.csv' into table student;

2020-02-29

空空如也

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

TA关注的人

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