当前位置: 首页 > 编程日记 > 正文

一个会画图的工程师

发现小谢图画的很好,虽然有些也是他引用的,但是我觉得还是很好所以这里收集下。

【RocketMQ源码学习】2-Namesrv

3-Remoting模块

rocketmq-remoting 模块是 RocketMQ 中负责网络通信的模块,被其他所有需要网络通信的模块依赖。它是基于 Netty 实现的,避免了网络编程很多 tricky 的问题。

首先来看下 RocketMQ NettyServer 的 Reactor 线程模型,一个 Reactor 主线程负责监听 TCP 连接请求,建立好连接后丢给 Reactor 线程池,它负责将建立好连接的 socket 注册到 selector 上去(这里有两种方式,NIO和Epoll,可配置),然后监听真正的网络数据。拿到网络数据后,再丢给 Worker 线程池。
Worker 拿到网络数据后,就交给 Pipeline,从 Head 到 Tail 一个个 Handler 的走下去,这些 Handler 是在创建 Server 的时候指定的。NettyEncoder 和 NettyDecoder 负责网络数据和 RemotingCommand 之间的编解码。NettyServerHandler 拿到解码得到的 RemotingCommand 后,根据 RemotingCommand.type 来判断是 request 还是 response,如果是 request, 就根据 RomotingCommand 的 code(code用来标识不同类型的请求) 去 processorTable 找到对应的 processor,然后封装成 task 后,丢给对应的 processor 线程池, 如果是 response 就根据 RemotingCommand.opaque 去 responseTable 中拿到对应的 ResponseFuture,把结果 set 给它。

对于 Client,经过 Pipeline 的顺序是从 Tail 到 Head。不管是 Server 和 Client,并不是每次数据流转都得经过所有的 Handler,而是会根据 Context 中的一些信息去判断。

整个数据流转过程中还有很多hook, 比如处理 command 前,处理 command 后,发送数据前,发送数据后等。

【RocketMQ源码学习】4-消息发送

Broker端,消息的处理和落地

【RocketMQ源码学习】5-消息消费

Pull 的过程比较简单(因为应用代码要去做比较多的事情),所以这里我主要来梳理一下 Push 方式的整个过程。

【RocketMQ源码学习】6-消息存储

写消息MappedFile Append Message

MappedFile 和物理文件是一一对应的,append的过程,消息的具体构成如图所示,大部分字段都很好理解,这里重点关注下 queueOffset 和 physicaloffset. queueOffset 是指对应的 consumeQueue 中的 offset, physicaloffset 是指该消息的物理offset,即图中的 wroteOffset, 它等于 fileFromOffset(当前mappedFile的物理offset) 加上 mappedFile 对应的 buffer 的 position(一个逻辑的offset).

ReputMessageService 也是一个单独的线程,它负责构建 ConsumeQueue 和 Index。

ConsumeQueue的结构如图:

Index File

Java Nio

作者jjenkov最后写了一个nio demo https://github.com/fdx321/java-nio-server. 过了一遍源码,工作过程大致如图:

【Tomcat学习笔记】2-整体架构

下面是Tomcat的整体架构

这个类图是Tomcat最主要的一个结构:

Engine、Host、Context、Wrapper 四种 Container 都可以配置 Valve,即使不配置,每个 Container 代码里都有默认的Valve(StandardEngineValve, StandardHostValve …)是处理请求的时候必须经过的。关于 Pipeline 和 Valve,就是一个水管中间有多个阀门,每个数据流过来都在阀门的地方被处理一下。 四个容器的Pipeline串起来,可以用张图来描述一下:

【Tomcat学习笔记】3-组件声明周期

LifecycleState 这个枚举类定义了生命周期的各个阶段,这个状态机是这样子滴:

【Tomcat学习笔记】4-启动流程分析

它们是如何一层一层完成初始化和启动的

以StandardServer为例:

如下面的时序图所示:

【Tomcat学习笔记】9-ClassLoader

Tomcat的三大ClassLoader

为什么 Tomcat 里要自定义 ClassLoader 呢,先来考虑一个问题:一个Tomcat 部署两个应用,App1 和 App2, App1 里定义了一个 com.fdx.AAA 类,App2 也定义了一个 com.fdx.AAA 类,但是里面的实现是不一样的,如果不自定义 ClassLoader,
而都用 AppClassLoader 来加载的话,你让它加载哪一个呢,一个 ClassLoader 是不能加载两个一样的类的。所以,ClassLoader 最重要的一个功能就是 类隔离。

【Tomcat学习笔记】14-Cluster

Tomcat Cluster 这块代码较多,代码主要在 org.apache.catalina.ha 和 org.apache.catalina.tribes 两个package. ha这个package主要做了两件事,或者说Tomcat cluster 主要就做了这两件事:集群间 Session 同步 和 集群War部署。tribes 则是Tomcat 集群通讯模块。

Tomcat 做了个集群的功能,大部分功能主要是解决session在集群中的同步,然而在有点规模的互联网公司都不怎么用它。

  1. 对于无状态的应用,通过apache/ngnix 负载均衡到 各个 tomcat就可以了
  2. 对于有状态的(session)应用,往往都自研分布式Session应用。分布式系统下用 Tomcat 的 session 会有很多限制。

Tomcat还做了个功能,监控集群中应用的变更,如果有一台的War包发生了变化,会通知其他机器自动重新部署。这个功能,在有点规模的互联网公司应该也不会用它,肯定用自研的运维系统, 可以支持更灵活的应用部署,方便和公司的运维体系打通。

Java Volatile 学习笔记

图片来源 http://mechanical-sympathy.blogspot.com

说明:他引用的这个作者在JVM方面有一定的研究,图画的不错

https://mechanical-sympathy.blogspot.com/

终于搞清楚Java的日志了

Java的日志框架很多,JUL, Log4J, Lobback, JCL, SLF4J等

先来看下slf4j官方的一张图:

关于这么多框架如何搭配使用,这篇文章总结的不错,slf4j、jcl、jul、log4j1、log4j2、logback大总结

Spring事务管理

所谓声明式事务,就是通过配置的方式省去很多代码,从而让Spring来帮你管理事务。本质上就是配置一个Around方式的AOP,在执行方法之前,用TransactionInterceptor截取,然后调用PlatformTransactionManager的某个实现做一些事务开始前的事情,然后在方法执行后,调用PlatformTransactionManager的某个实现做commit或rollback. 如图:

相关文章:

2016百度实习编程题:括号序列

不知如何解决 1.感觉贪心或者动态规划,不知道如何解决 2.做过生成合法括号序列的题目,想到用DFS补成合法的括号,然而没有成功

html动画怎么隐藏,JQuery操作div隐藏和显示的4种动画

Jquery-Div动画显示body{font-family:"宋体";font-size:13px;color:#415973;}#ShowDiv{display:none;width:300px;height:100px;border:1px solid #ccc;border-right:2px solid #888;border-bottom:2px solid #888;background-color:#f9f9f9;text-align:center;paddi…

@芥末的糖----------《后端加密》

bcryptsession 生命周期 session 标识产生的时机和清除时机:(权限验证) 用户已经登录:这个唯一标识会在用户登录时产生,用户点击退出时或者关闭浏览器时清除。 …

Java中的ClassLoader和SPI机制

深入探讨 Java 类加载器 成富是著名的Java专家,在IBM技术网站发表很多Java好文,也有著作。 线程上下文类加载器 线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextCl…

html在线缓存视频,javascript – 如何为HTML视频添加缓冲

给你的视频提供ID:用于缓冲:var vid document.getElementById("myVideoOne");alert("Start: " vid.buffered.start(0) " End: " vid.buffered.end(0));var vid document.getElementById("myVideoTwo");aler…

ComponentName(String pkg, String cls)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfeng812/article/details/51279606 开发中因为改项目包名,用了全局替换,误操作把改构造函数的第二个参数只写了类名,不是完整的全路径…

mysql干货——数据库字符集和校对规则详解

2019独角兽企业重金招聘Python工程师标准>>> 一、什么是字符集 字符是多个文字和符号的总称,包括各个国家的文字、标点符号、图形符号、数字等。字符集多个字符的集合。 字符集合种类较多,每个字符集包含的字符的个数不同。对于字符集不支持的…

android监听器在哪里创建,[转载]android开发中创建按钮事件监听器的几种方法

第一种:匿名内部类作为事件监听器类Button button(Button)findViewById(R.id.button);button.setOnClickListener(newOnClickListener(){public void onClick(View v){System.out.println(“匿名内部类作为事件监听类”);}});大部分时候,事件处理器都没有…

Go语言源码分析CAS的实现和Java如出一辙

看了Go的源码CAS这块实现和java还是类似的。 关于Java的分析参考:Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现 都是使用汇编指令:LOCKCMPXCHGL 原因很简单:单核肯定不能发挥Go的高并发性能,G…

python 的文件读写方法:read readline readlines wirte writelines

read()方法读入整个文件,把整个文件以字符串形式返回。readline() 方法每次只读一行,每运行一次只读一行。如果要读整个文件,需要结合循环判断文件结束。python判断文件末尾的标志是,读到空字符。比如:while str ! :r…

c# 模板方法模式

为什么80%的码农都做不了架构师?>>> 既然是模板肯定定义了相同的东西板式,提供了空白的地方自己添加进去就可以了 模板方法是把相同的部分抽象出来到抽象类中去定义,具体子类来实现具体的不同部分,这个思路也正式模板…

transient HashMap使用目的分析

看HashSet源码有这么一句&#xff1a; private transient HashMap<E,Object> map; 再看HashSet的Add方法&#xff1a; 实际上HashSet是复用HashMap了。 而我们去看看HashMap也会发现一样使用了transient 而不管是HashSet还是HashMapdou都要求是Serializable的&#xff…

4月29日监理师课程作业

软考信息系统监理师&#xff1a;2016年4月29日作业一、信息应用系统分析设计阶段监理1、需求分析的进入条件是什么&#xff1f;&#xff08;记&#xff09;答&#xff1a;①业主单位与承建单位正式签订建设合同&#xff0c;②并对初步的项目开发计划达成一致意见。2、需求分析的…

沉浸式导航栏html,混合开发 h5+ 沉浸式的适配

1.需要在mainfest.json plus对象里添加"statusbar": {"immersed": "true","style":"dark"}2.新建immersed.js注意 在里边不适用plus,因为plus.ready之后再js改变样式 必然造成页面闪烁跳动(function(w){document.addEventLi…

puppet yum模块、配置仓储、mount模块

转载&#xff1a;http://blog.51cto.com/ywzhou/1577335 作用&#xff1a;自动为客户端配置YUM源&#xff0c;为使用yum安装软件包提供便捷。 1、服务端配置yum模块 &#xff08;1&#xff09;模块清单 [rootpuppet ~]# tree /etc/puppet/modules/yum/ /etc/puppet/modules/yum…

最新技术选型解决方案列表

最新技术选型解决方案列表 1 概述 这是一份当前的技术选型方案&#xff0c;针对创业、中小型公司 2 目标2.1 产品目标2.1.1 SaaS 2.1.1.1 免安装 2.1.1.2 多租户 2.1.1.3 流量计费 2.1.2 可配置 2.1.2.1 需开通服务 2.1.2.2 服务自动组合 2.1…

合工大的计算机专业好不好,合肥工业大学计算机好,还是西电的好?差距有多大?...

合肥工业大学计算机好&#xff0c;还是西电的好?差距有多大?这两个大学都是教育部直属的工科院校&#xff0c;但是性质完全不一样&#xff0c;到底谁更厉害&#xff0c;结论是西电的计算机要比合肥工业大学强。首先因为西电本身就是比哈工大厉害的大学&#xff0c;学科评估方…

DataWorks V2使用PyUdf

在DataWorks上新建一个Python资源&#xff0c;命名为 test_udf.py 编辑pyudf的脚本代码&#xff0c;实现方法请参考Python实现MaxCompute UDF # -*- coding:utf-8 -*- from odps.udf import annotate #函数签名&#xff0c;SQL执行前所有函数的参数类型和返回值类型必须确定&a…

Java线程怎样映射到操作系统线程

先说多线程模型&#xff0c;参考经典教材《Operating System Concepts , Silberschatz ,9th edition》 中文版是《操作系统概念&#xff0c;第9版》 https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/4_Threads.html 一个线程是CPU利用率的基本单元&#xff0c;包…

NSUserDefaults的用法

2019独角兽企业重金招聘Python工程师标准>>> NSDictionary* defaults [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; NSLog("Defaults: %", defaults); 是用来获取设备上的所有的NSUserDefaults的设置。 上面代码输出了 2013-06…

计算机在轻工行业中的应用,计算机在不同领域中的具体应用

计算机以其卓越的性能和强大的生命力&#xff0c;在科学技术、国民经济、社会生活等各个方面得到了广泛的应用&#xff0c;并且取得了明显的社会效益和经济效益。计算机的应用几乎包括人类生活的一切领域&#xff0c;可以说是包罗万象&#xff0c;不胜枚举。据统计&#xff0c;…

自动驾驶L3量产追梦:如何跨过车规级和低成本门槛?

雷锋网新智驾按&#xff1a;从人类设想到落地前行&#xff0c;智能驾驶领域在2018年声响不断。在频繁的融资、技术创新和商业应用等信息背后&#xff0c;无数车企在公司战略中加入“网联化”、“自动化”&#xff0c;前几年涌现的自动驾驶领域的初创公司&#xff0c;近年来也开…

一句话说清聚集索引和非聚集索引以及MySQL的InnoDB和MyISAM

聚集索引和非聚集索引以及MySQL的InnoDB和MyISAM经常遇到有人向我咨询这个问题&#xff0c;其实呢&#xff0c;网上帖子很多&#xff0c;也说的都对&#xff0c;但是呢&#xff0c;看客可不一定是真的理解了。所以今天在这里用最简短的语言让你明白这些区别。 看这种图表就一切…

awstats CGI模式下动态生成页面缓慢的改进

本文可以看做是 多server多站点情况下awstats日志分析 这篇文章的下篇&#xff0c;在使用过程中发现awstats在cgi模式下动态生成分析报告慢的问题 &#xff08;尤其是有些站点每天两个多G的日志&#xff0c;查看起来简直是在考验人的耐性&#xff09;&#xff0c;本文分享一种改…

计算机水平flash试题,计算机flash考试试题

《Flash动画设计》课程考核方案一、考试班级及科目216班 《Flash动画设计》二、考试时间1、考核时间&#xff1a;90分钟2、考试地点&#xff1a;学校计算机3机房3、考核时期&#xff1a;十七、十八周内各课任教师自主选定三、考核形式上机独立完成所有操作。在规定时间内按考核…

CDH大数据集群安全风险汇总

一&#xff0c;风险分为内部和外部 首先内部&#xff1a; CDH大数据集群部署过程中会自动创建以服务命名的用户&#xff0c;如图所示 用户名(login_name)&#xff1a;口令位置(passwd)&#xff1a;用户标识号(UID)&#xff1a;用户组标识号(GID)&#xff1a;注释性描述(users)&…

有界阻塞队列ArrayBlockingQueue和无界阻塞队列LinkedBlockingQueue

ArrayBlockingQueue和LinkedBlockingQueue最大的区别是一个是有界无界&#xff0c;各有优劣。 先看实例代码&#xff1a; main函数起2个线程模拟生成消费者 import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.…

zabbix监控windows 服务器各项性能

Zabbix agent 在windows上安装部署1、 下载与解压地址: http://www.zabbix.com/downloads/2.4.0/zabbix_agents_2.4.0.win.zip解压zabbix_agents_2.4.0.win.zipconf目录存放是agent配置文件 bin文件存放windows下32位和64位安装程序2、 配置与安装2.1 配置zabbix agent相关配…

计算机设备板块超跌,半导体全线拉升,沪指强势突破3600点,午后A股会再次冲高回落吗...

周四开盘沪指开于3585点&#xff0c;和周三收盘价低开了8个点。上午开盘后沪指呈现低开高走的趋势&#xff0c;10点以后沪指持续拉升上涨不但顺利地突破了3600点而且还创了反弹新高。除了沪指以外深市三大股指也是全线翻红&#xff0c;上午A股的三大股指再次全线拉升并且均创了…

docker之基础

一、Docker简介 容器&#xff1a;运行在同一类用户空间上的程序打包在一起&#xff0c;相当于一个集装箱 Docker:码头装运工&#xff1b;把集装箱搬运到该有的位置。 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器&#xff08;LXC&…