RocketMQ学习总结

前言

RocketMQ算是当前国内MQ领域内的明星产品。网上关于它文章非常的多。但是总觉得任何一项你想要在生产环境使用的技术,你必须亲自深入学习一遍才能更好的使用它,出了问题也好定位。在学习源码的过程中可能有许多意想不到的收获,也是提示技术能力的一种方式。

RocketMQ 文件目录

RocketMQ 作为一个具有持久化功能的消息中间件,必然需要强大的存储功能。那么首先需要了解的就是它的存储架构。

RocketMQ 存储目录结构

HttpMessageConverter总结

HttpMessageConverter 是什么?

简单来说HttpMessageConverter是spring-web提供的一个接口,用来将HTTP请求转为应用使用的数据,或将HTTP接口的返回数据转为客户端需要的数据。

接口定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public interface HttpMessageConverter<T> {

true/**
* 根据参数判断该Converter是否能对请求进行转换
*/
trueboolean canRead(Class<?> clazz, MediaType mediaType);

true/**
* 根据参数判断是否可以转换,生成指定的HTTP响应
*/
trueboolean canWrite(Class<?> clazz, MediaType mediaType);

true/**
* Return the list of {@link MediaType} objects supported by this converter.
* @return the list of supported media types
*/
trueList<MediaType> getSupportedMediaTypes();

true/**
* 从 inputMessage 读取数据,转为class指定的对象
*/
trueT read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;

true/**
* 将参数t指定的数据,转换为 contentType 指定的媒体类型,写入到HTTP响应。
*/
truevoid write(T t, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;

}

java 中的内存映射

背景

最近在阅读公司内部扩展的RocketMQ中延迟消息的实现代码,其中使用到了一个组件MappedFileMappedFile就代表了一个mmap的文件。其实在很早前就了解到RMQ实现用使用了mmap技术,但是一直没有深入了解,借此机会就将Java中mmap的内容进行一次总结。

mmap

mmap是一个系统调用。它的作用是将一个文件或者其它对象的一部分内容映射到进程的地址空间。这样进程就可以直接读写这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间。通过mmap也可以实现不同进程间的共享内存。

springboot配置activemq

前言

网上有好多介绍springboot集成activemq的文章,看了一些文章感觉比较零散,还是抽时间自己详细总结一个如何使用,需要注意哪些点。尤其是关于连接池的配置,需要重点关注,否则在消息量大的情况下会把服务器搞挂。

快速配置

如果你只是连接一个activemq集群或节点,那么配置非常简单(这也是springboot便捷的原因)。

如下:

1
2
3
spring.activemq.broker-url=tcp://127.0.0.1:61616?connectionTimeout=3000&soTimeout=500&tcpNoDelay=true&jms.redeliveryPolicy.maximumRedeliveries=1&jms.redeliveryPolicy.initialRedeliveryDelay=10
spring.activemq.user=admin
spring.activemq.password=admin

就这么简单!有了上面的配置你就可以发送消息了(通过JmsTemplate)。这背后的原理是通过springboot提供的ActiveMQAutoConfiguration来实现的。

java agent技术学习总结

名词解释

JVMDI:jvm debug interface jvm 调试接口。
JVMPI:jvm profile interface jvm 性能分析接口。
JVMTI:jvm tool interface jvm 工具接口,jdk1.5引入,用来替换JVMDI和JVMPI。

JPDA

JPDA: Java Platform Debugger Architecture SUN 公司提供的让你在各种场景加调试运行中的Java程序的技术。

名词解释

  1. JPDA 是一组帮助调试Java程序的API集合。
  2. JPDA 不是一个应用程序或调试工具。
  3. JPDA 是一组精心设计和实现的接口和协议。
  4. debugger 调试程序
  5. debuggee 被调试程序

hystrix学习总结

hystrix是什么?

官网对hystrix的定义如下:

Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.

个人理解如下:

  1. 首先 Hystrix 只是一个库,意味着非常容易使用,通过maven或gradle引入即可。
  2. Hystrix 的目的是在访问远程系统,服务或使用第三方库的时候由于网络故障,延迟或其他错误可能导致的系统级联故障的点进行隔离。从而使得整个分布式系统具有弹性和容错能力。

spring SpEL表达式

文章转载自:https://blog.csdn.net/zhoudaxia/article/details/38174169

1 概述

1.1 概述

  Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义。

  表达式语言给静态Java语言增加了动态功能。

  SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用。

1.2 能干什么

  表达式语言一般是用最简单的形式完成最主要的工作,减少我们的工作量。

  SpEL支持如下表达式:

  一、基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;

  二、类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;

  三、集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;

  四、其他表达式:模板表达式。

  注:SpEL表达式中的关键字是不区分大小写的。

mysql中字段究竟该不该为null

为什么会有许多表的字段设置为null?

  1. 开发中常用的建表工具创建表时字段默认可以为null。
  2. 开发人员不能正确区分null和not null的区别,以为默认null可以节省空间。
  3. 默认为null,在插入数据时可以少很多判断

针对这些问题,下面就彻底搞清楚字段该不该为null。

null 字段可以节省空间吗?

NULL

MySQL官方文档有如下的描述:

For NULL tables, NULL columns require additional space in the row to record whether their values are NULL. Each NULL column takes one bit extra, rounded up to the nearest byte.

从上面的描述中可以知道,在MyISAM中NULL字段并不能完全的节省空间。

极客时间mysql学习笔记

前言

本文是对极客时间专栏MySQL实战45讲 文章内容和讨论区内容的总结。

第一讲 基础架构:一条SQL查询语句是如何执行的?

mysql 架构

  1. MySQL 可以分为 Server 层和存储引擎层两部
  2. Sever 层提供了大多数核心的功能, 例如:连接管理,权限验证,查询缓存,词法分析,语法分析,优化器,执行器等。
  3. 存储引擎负责数据的存储,插件式设计。InnoDB, MyISAM, Memeory, Archive等。

连接器

  1. 负责为何和客户端的TCP连接, 权限获取,验证。
  2. 连接器从权限表里面获取用户对应的权限,验证通过后保存在连接中(会话中)后续的所有操作不在查询权限表。 修改权限不影响已经已经存在的连接。
  3. 通过show processlits查看当前所有的连接。
  4. 如果连接在wait_timeout指定的时间内没有任何操作,则会被关闭。默认是8小时。
  5. 长时间存活的连接会导致MySQL服务内存占用过大,原因是MySQL临时申请的内存保存在连接对象中,直到连接关闭才会释放。
    • 定时关闭连接 或 执行了大的查询语句后断开连接
    • MySQL5.7以后的版本可以通过mysql_reset_connection重新初始化连接(不会重新验证权限)。
|