RocketMQ小笔记
6种消息类型
- 普通消息
- 顺序消息
- 广播消息
- 延时消息
- 批量消息
- 事务消息
2种消费模式
- 集群消费:一个Group ID内只消费一次
- 广播消费:一个Group ID内所有Consumer都消费
1 | public class ThreadLocal<T> { |
java.lang.ThreadLocal中只有4个public方法,非常清晰。
注:ThreadLocal是一个变量对象,一个ThreadLocal是一个存储位置。如果线程需要多个存储位置,则创建多个ThreadLocal。
今天就记录字节码的两种实现demo,作为入门了解。
Java Agent的最常用方式:
CGLIB,即Code Generation Library,是一个开源项目。Github地址:https://github.com/cglib/cglib。
CGLIB的github简介:CGLIB - 字节码生成库,是用于生成和转换Java字节码的高级API。它被AOP、测试、数据访问框架用于生成动态代理对象和拦截字段访问。
CGLIB提供两种类型的JAR包:
本文中使用的CGLIB依赖为:
1 | <dependency> |
在国内的网络环境下使用 Homebrew 安装软件的过程中可能会长时间卡在 Updating Homebrew 这个步骤。
例:执行 brew install composer 命令1
2➜ ~ brew install composer
Updating Homebrew... # 如果碰到长时间卡在这里,参考以下 2 种处理方法
MDC 全拼 Mapped Diagnostic Contexts,是SLF4J类日志系统中实现分布式多线程日志数据传递的重要工具。
同时,用户也可利用MDC将一些运行时的上下文数据打印出来。
什么意思呢?
常规情况下,写打日志的代码时,一般都是log.info、log.warn、log.error将想要打的日志进行拼装和格式化,打到日志输出中。MDC能干什么呢?能在不改动log.xxx打日志代码的情况下,在最终的日志输出的指定位置打印额外的信息。而这,就是靠MDC进行传递实现的。
试测数据:
- 基于常见场景:在一个数据范围区间内生成随机数。
- 1000万的随机数范围,for循环生成50万个随机数。无其他额外操作。
SDK包 | 性能耗时 | 评价 |
---|---|---|
java.util.Random | 9毫秒 | 1、编写简单,方法较多,也快速。很多SDK包都基于此扩展。 2、随机性重度依赖seed的情况,seed一样,分配的随机数和顺序一样。 3、线程不安全。 |
ThreadLocalRandom | 8毫秒 | 1、继承于java.util.Random 2、与线程绑定,一个线程一个,多线程下安全。 3、seed情况部分借助于线程的内存地址等随机信息,来提升随机性。 |
Math.Random | 14毫秒 | 1、用法上比较费劲,只能生成double。 2、内部有借用java.util.Random |
SecureRandom | 142毫秒 | 线程安全,seed不可预测(借助于系统中的随机事件信息) |
Apache#RandomDataGenerator | 54毫秒 | API比较丰富,特殊场景下考虑。 |
it.unimi.dsi#XoRoShiRo128PlusRandom | 17毫秒 | 偏门的三方包。比较快。线程不安全。 |
这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。
根据 MySQL 的官方文档:
https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html
从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。
分布式事务问题是分布式系统绕不开的技术话题。
“谈谈你对分布式事务的理解”、“分享下你团队在分布式事务上的解决方案”、“你用过哪几种分布式事务的中间件”?在技术交流/面试中很容易讨论到这些个话题,得到的反馈大概率是这样的:
一文系列 之 并发编程。
行文3万余字,包含了多线程方方面面的知识点,相信对你会有所帮助!
黄老师
[TOC]
虽然大家肯定知道进程、线程的概念,但在介绍整篇文章前还是需要再陈述下,保证行文信息量的连贯性。