RocketMQ梳理 - namesrv
RocketMQ梳理 - namesrv一、前言最近实习用到了rocketmq,在完成项目后,心血来潮,突然想深入地了解一下rocketmq,特在此记录一下。
本文结合rocketmq官方文档和网上的一些零零散散的资料,常识去简单梳理rocketmq整体执行流程,作为个人学习历程的记录。
二、整体模块如下
这是从gitHub上down下来的rocketmq源码,可以大致分为以下模块:
rocketmq-namesrv:namesrv服务,更新和路由发现 broker服务。
rocketmq-broker:mq的核心,主要做消息存储,可以接收consumer和producer的请求,然后通过调用rocketmq-store服务对消息进行处理。
rocketmq-store:存储层实现。
rocketmq-remoting:基于netty的底层通信实现,rocketmq的底层实现。
rocketmq-common:common服务,比如一些配置文件、常量。
rocketmq-client:java版本的mq客户端。
rocketmq-filter:消息过滤服务,相当于在broker和co ...
Hadoop核心组件—Yarn的工作流程
Hadoop核心组件—Yarn的工作流程一、作业提交阶段
Client 向整个集群提交 Job,同时申请一个 job_id
ResourceManager 收到 Client 的请求后,给 Client 返回该 job 资源的提交路径、hdfs 路径、job_id (每一个 job 都有一个唯一的 job_id)
Client 收到 ResourceManager 的响应后,将 Jar包、Configuration信息、InputSplit(数据分片信息)等数据到指定的资源提交路径
Client 向 ResourceManager 发送执行作业请求
二、作业初始化阶段
ApplicationManager 将 Job 添加到 ResourceScheduler(资源调度器),其维护了一个 job队列
当轮到任务执行,ResourceScheduler 通知 ApplicationManager 有空闲的 NodeManager 可以用来执行当前任务
ApplicationManager 调用分配给它的 NodeManager,在其中开辟一个 Container,并在容器中启动需要被执 ...
关于加密解密的小小总结
关于加密解密的小小总结一、前言这篇文章不讲具体的加密算法,主要总结加密解密在项目中的具体应用,其中加密算法介绍内容来自
流程内容自于自己平常工作学习的总结,在这里小小记录一下。
二、可逆加密与不可逆加密加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。
1、不可逆加密常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我们可以统称为SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA后面的数字表示的是加密后的字符串长度,SHA1默认会产生一个160位的信息摘要。
由于这些加密都是不可逆的,因此比较常用的场景就是用户密码加密,其验证过程就是通过比较两个加密后的字符串是否一样来确认身份的。网上也有很多自称是可以破解MD5密码的网站,其原理也是一样,就是有一个巨大的资源库,存放了许多字符串及对应的MD5加密后的字符串,通过你输入的MD5加密串来进行比较,如果过你的密码复杂度 ...
PostgreSQL 存储过程
PostgreSQL 存储过程一、前言最近在实习期间遇到的一些问题,其实逻辑思路很简单,就是需要把关联表的一些脏数据清除,逻辑就是从原表获得所有id,再根据这个id去关系表中遍历所有数据,根据关系表中的数据进行判断更新。
理想的 sql 如下:
1234567update dt_app_user_rel r2set r2.is_delete=1where r2.range_type=2 and r2.data_key not in ( select r1.data_key from dt_app_user_rel r1 where r1.app_id=r2.app_id and r1.range_type=1 and r1.is_delete=0)
这过程中存在单表的自查询和更新,但这种情况是不被允许的,这个时候就需要用到存储过程了。
这里先附上存储过程的简单结构:
1234567891011121314151617-- 基础的存储过程语法模板create or replace procedure public.proc_check_data(check_period charact ...
Flink中TaskManager与Slots的关系
Flink中TaskManager与Slots的关系一、基本概念1、TaskManagerFlink 采用 Master-Slave 主从架构,其中 JobManager 作为集群 Master节点 ,主要负责任务协调和资源分配,TaskWorker (TaskManager) 作为Salve节点,用于执行流task。
JobManager是控制一个应用程序执行的主进程,相当于集群的Master节点,且整个集群有且只有一个活跃的 JobManager ,JobManager 负责整个 Flink 集群任务的调度以及资源的管理。
Flink TaskManager 执行作业流的 task,并且缓存和交换数据流,TaskManager 负责执行用户代码。根据实际需求为 TaskManager 配置内存将有助于减少 Flink 的资源占用,增强作业运行的稳定性。
2、SlotsFlink中每一个worker(TaskManager)都是一个 JVM进程 ,它可能会在独立的线程上执行一个或多个subtask。为了控制一个TaskManager能接收多少个task,TaskManager通过t ...
怎么去实现动态扩展机制SPI
怎么去实现动态扩展机制SPI一、前言关于动态扩展机制SPI,在之前我有发过该类的文章,感兴趣的可以去看一下,或者可以自己去百度了解一下,在本篇文章中就不做过多的赘述了。
本篇主要是着重于怎么去实现SPI,参考于Dubbo SPI,感兴趣的可以去了解一下。
二、实现Dubbo SPI的核心类在于ExtensionLoader,通过加载本地目录的配置文件以实现动态植入扩展类。
1、配置类定义我们这里仿照Dubbo里面对配置文件的定义,讲扩展接口的配置定义在资源路径下的 META-INF/extensions/ 目录下,配置文件以对应扩展接口的类路径命名
配置文件的内部以 Key-Value 键值对形式定义,key 由自己定义,value为对应实现类的类路径
具体的结构如下图所示:
基于上面的定义,给出获取实现类最简单的方式:
程序运行情况:
2、模块化实现基于上面的思路,已经可以简单的实现了,现在我们把它给完善一下。
核心类属性
内部方法 getExtensionLoader
首先传入扩展接口的类型 ,以获取对应泛型的 ExtensionLoader 对象,在这里还可以做一 ...
Dubbo SPI
Dubbo SPI一、什么是SPI机制?SPI (Service Provider Interface),主要用于扩展的作用。
举个例子来说,假如有一个框架有一个接口,他有自己默认的实现类,但是在代码运行的过程中,你不想用他的实现类或者想扩展一下他的实现类的功能,但是此时你又不能修改别人的源码,那么此时该怎么办?这时spi机制就有了用武之地。一般框架的作者在设计这种接口的时候不会直接去new这个接口的实现类,而是在Classpath路径底下将这个接口的实现类按作者约定的格式写在一个配置文件上,然后在运行的过程中通过java提供的api,从所有jar包中读取所有的这个指定文件中的内容,获取到实现类,用这个实现类,这样,如果你想自己替换原有的框架的实现,你就可以按照作者规定的方式配置实现,这样就能使用你自己写的实现类了。
spi机制其实体现了设计思想中的解耦思想,方便开发者对框架功能进行扩展。
二、Spring中的SPI - SpringFactoriesLoader相信spring大家都不陌生,在spring扩展也是依赖spi机制完成的,只不过spring对于扩展文件约定在Classpa ...
设计模式-建造者模式
设计模式 - 建造者模式建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
一、简介建造者模式,相当于是对工厂生产产品的一种装配,由于这种装配可能随时改变,所以需要抽取出来,实现产品局部与整体的解耦(当然话又说回来,单个孤立产品还需要建造者?那就是多此一举)。着重理解装配的含义,对应在程序中就是相当于调用顺序,以及调用参数问题。理解起来还阔以哈,比起那几个工厂模式用的稍微少一丢丢。
一般建造者模式都有以下几种固定的角色:
抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者 (ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart1和 buildPart2),另一种是返还结构方法(retrieveResult)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有 ...
Spring循环依赖
Spring循环依赖1、为什么会出现循环依赖问题? 在Spring中bean的生命周期大致为:
从文件中得到UserService.class
推断使用的构造方法(有参或无参)
获得Class普通对象
依赖注入
初始化前(@PostConstruct)
初始化(afterPropertiesSet)
初始化后(AOP等操作)
若定义了AOP,生成代理对象(与原先的Class是两个不同的对象)
将对象或代理对象放入单例池
依赖注入问题主要发生在依赖注入缓解,场景如下
12345678910111213@Componentpublic class AService { @Autowired private BService bService;}@Componentpublic class BService { @Autowired private AService aService;}
当AService依赖注入时,需要获取BService,由于BService尚未初始化,在单例池中找不到,需要创建,而 ...
Feign远程调用原理
Feign远程调用原理1、Feign远程调用流程图
2、基于面向接口的动态代理方式生成实现类 在使用feign 时,会定义对应的接口类,在接口类上使用Http相关的注解,标识HTTP请求参数信息
在Feign 底层,通过基于面向接口的动态代理方式生成实现类,将请求调用委托到动态代理实现类,基本原理如下所示:
3、根据Contract协议规则,解析接口类的注解信息,解析成内部表现:
4、基于 RequestBean,动态生成Request 根据传入的Bean对象和注解信息,从中提取出相应的值,来构造Http Request 对象
5、使用Encoder 将Bean转换成 Http报文正文(消息解析和转码逻辑) Feign 最终会将请求转换成http消息发送出去,传入的请求对象最终会解析成消息体,如下所示:
6、拦截器负责对请求和返回进行装饰处理 在请求转换的过程中,Feign 抽象出来了拦截器接口,用于用户自定义对请求的操作,比如,如果希望Http消息传递过程中被压缩,可以定义一个请求拦截器。
7、基于重试器发送HTTP请求 Feig ...