自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hashcon

曾任职于顺丰,华为,网易等公司,从Java小白,成长为资深开发与项目组首席架构师。喜欢源码与开源,曾贡献 MyCat1.6 与 JFRUnit 核心源码,贡献过Spring Cloud,Apache RocketMQ,Apache Bookeeper,Du

  • 博客(503)
  • 收藏
  • 关注

原创 “码农架构”,我真对你的洗稿无语。。。

今年关注了一个公众号,名字是“码农架构”,看里面内容很丰富,感觉很好。直到我发现有一天他竟然推送了一条抄袭我的文章的推送。公众号原文已经被他删除,但是企鹅号没删(地址:CommpetableFuture使用anyOf过程中的一些优化思考),并且,我的文章题目写错了,我分析的是 allOf,实际写的是 anyOf,我这里放一下当时发布的截图:这是我的原文链接:CommpetableFuture使用anyOf过程中的一些优化思考这是他的公众号文章内容:这也不是我第一次被抄袭,按照国际惯例,挂公众号,截图

2021-07-09 16:22:18 171

原创 MySQL原理 - InnoDB引擎 - 行记录存储 - Off-page 列

本文基于 MySQL 8在前面的两篇文章,我们分析了 MySQL InnoDB 引擎的两种行记录存储格式:Compact 格式Redundant 格式在这里简单总结下:Compact 格式结构:变长字段长度表:包括数据不为NULL的每个可变长度字段的长度,并按照列的顺序逆序排列NULL 值列表:针对可以为 NULL 的字段,用一个 BitMap 来标识哪些字段为 NULL记录头信息:固定 5 字节,包括:无用位:2 bits,目前没用deleted_flag:1 bits,.

2021-07-07 10:14:02 329

原创 实例复习机器学习数学 - 1. 事件与概率

从骰子实验引出的各种概率概念1.投骰子,出现点数为 6 的概率 16\frac{1}{6}61​. 投骰子,已知出现点数为偶数,出现点数为 6 的概率则是 13\frac{1}{3}31​,这个概率即 条件概率。2.条件概率为:假设我们知道 A 事件已经发生,在此基础上我们想知道 B 事件发生的概率,这个概率为条件概率,记作 P(B∣A)P(B|A)P(B∣A)3.古典概率模型:假设一个实验,有 Ω\OmegaΩ 个等可能性的结果,事件 A 包含其中 XXX 个结果,事件 B 包含其中 YYY 个结果

2021-06-28 20:01:32 356 1

原创 JEP 尝鲜系列 3 - 使用虚线程进行同步网络 IO 的不阻塞原理

相关 JEP:JEP 353 Reimplement the Legacy Socket APIJEP 373 Reimplement the Legacy DatagramSocket API使用虚线程进行网络 IOProject Loom 主要目标是在 Java 平台上提供一种易于使用、高吞吐量的轻量级并发性和新的编程模型的 JVM 特性和API。这带来了许多有趣和令人兴奋的前景,其中之一是简化网络交互的代码的同时兼顾性能。现在的服务器能够处理打开的套接字连接的数量,远远超过它们能够支持的线

2021-05-25 16:49:51 358

原创 Java JFR 民间指南 - 事件详解 - jdk.ThreadAllocationStatistics

定时线程分配统计事件:jdk.ThreadAllocationStatistics引入版本:Java 11相关 ISSUES:Test jdk/jfr/event/runtime/TestThreadAllocationEvent.java fails with null thread:在某些情况下,jdk.ThreadAllocationStatistics 没有采集到 JFR 相关线程,导致空指针。这个 Bug 和 jdk/jfr/event/compiler/TestCompilerCompi

2021-04-28 20:50:28 444

原创 Java JFR 民间指南 - 事件详解 - jdk.ObjectAllocationOutsideTLAB

重新申请 TLAB 分配对象事件:jdk.ObjectAllocationOutsideTLAB引入版本:Java 11相关 ISSUES:JFR: RecordingStream leaks memory:启用 jdk.ObjectAllocationInNewTLAB 发现在 RecordingStream 中有内存泄漏,影响 Java 14、15、16,在 jdk-16+36 (Java 16.0.1) 修复。Introduce JFR Event Throttling and new j

2021-04-27 19:04:47 365

原创 Java JFR 民间指南 - 事件详解 - jdk.ObjectAllocationInNewTLAB

重新申请 TLAB 分配对象事件:jdk.ObjectAllocationInNewTLAB引入版本:Java 11相关 ISSUES:JFR: RecordingStream leaks memory:启用 jdk.ObjectAllocationInNewTLAB 发现在 RecordingStream 中有内存泄漏,影响 Java 14、15、16,在 jdk-16+36 (Java 16.0.1) 修复。Introduce JFR Event Throttling and new jdk

2021-04-23 16:36:28 322

原创 Java JFR 民间指南 - 事件详解 - jdk.ObjectAllocationSample

对象分配采样:jdk.ObjectAllocationSample引入版本:Java 16相关 ISSUE:Introduce JFR Event Throttling and new jdk.ObjectAllocationSample event (enabled by default)各版本配置:Java 16:默认配置(default.jfc):配置值描述enabledtrue默认启用throttle150/s每秒最多采集 150 个stackT

2021-04-22 19:06:38 462

翻译 J. Cole 的 InnoDB 系列 - 3. InnoDB空间文件布局的基础

原文地址:blog.jcole.us/2013/01/03/…在数据存储模型中,通常有“空间”这个概念,在 MySQL 中被称为“表空间”,有时候在 InnoDB 中也被称为“文件空间”。一个空间可能由一个操作系统中的多个实际文件组成(例如 ibdata1, ibdata2 等等),实际上只是一个逻辑文件 - 多个文理文件被当做一个连接在一起的文件处理。InnoDB 中每个空间都被分配了一个 32 位的无符号整型空间 ID,这个 ID 被用来在不同的地方引用指向这个空间。InnoDB 总是有一个“系.

2021-03-23 23:45:10 6778

翻译 J. Cole 的 InnoDB 系列 - 1. 学习 InnoDB - 深入探索核心原理之旅

原文地址:https://blog.jcole.us/2013/01/02/on-learning-innodb-a-journey-to-the-core/,本系列翻译会在其基础上扩展一些 MySQL 源码相关的一些注释和思路解读,以及配图我已经使用 InnoDB 大约十年了,我已经足够了解它并且可以用它做我想做的大部分事情。然而,为了实现一些更加高效的解决方案,我发现我需要更加深入理解它的原理与思想。不幸的是,InnoDB 文档对 InnoDB 的内部数据结构缺乏清晰明确的解释,阅读它的源码是深入.

2021-03-18 10:34:47 6735

翻译 [翻译]微服务设计模式 - 8. 服务发现 - 第三方注册

原文地址:https://microservices.io/patterns/self-registration.html背景假设你采用了客户端服务发现或者服务端服务发现,服务启动时需要向注册中心注册实例,在关闭时向注册中心注销,以便其他服务感知。问题服务实例如何向注册中心注册或注销?考虑因素服务在启动时必须向注册中心注册实例,并且在关闭时在注册中心注销实例必须从注册中心注销崩溃的服务实例正在运行但是无法正常提供服务的实例,也需要在注册中心注销解决方案引入一个第三方注册代理,负责.

2021-03-18 10:34:04 387

翻译 [翻译]微服务设计模式 - 7. 服务发现 - 自注册

原文地址:https://microservices.io/patterns/self-registration.html背景假设你采用了客户端服务发现或者服务端服务发现,服务启动时需要向注册中心注册实例,在关闭时向注册中心注销,以便其他服务感知。问题服务实例如何向注册中心注册或注销?考虑因素服务在启动时必须向注册中心注册实例,并且在关闭时在注册中心注销实例必须从注册中心注销崩溃的服务实例正在运行但是无法正常提供服务的实例,也需要在注册中心注销解决方案服务实例负责在注册中心注册自.

2021-03-18 10:33:11 382

翻译 [翻译]微服务设计模式 - 6. 服务发现 - 服务注册中心

原文地址:https://microservices.io/patterns/service-registry.html背景访问一个服务的客户端使用客户端服务发现或者服务端服务发现确定一个服务实例的位置并发送请求给这个实例调用所需服务。问题在客户端服务发现中,客户端如何知道服务的可用实例在哪里?在服务端发现实例中,负载均衡器如何知道服务的可用实例在那里?考虑因素每个实例可能在特定的主机和端口暴露远程 API(例如 HTTP/REST,或者 Thrift)服务实例的数量及其位置动态变化。虚.

2021-03-16 10:03:45 380

翻译 [翻译]微服务设计模式 - 5. 服务发现 - 服务端服务发现

原文地址:https://microservices.io/patterns/server-side-discovery.html服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地址和端口是固定并且提前预知的,所以只需要简单的 HTTP/REST 调用或者其他的 RPC 机制直接调用即可。但是在当下的云原生微服务体系中,微服务大多在某个虚拟机或者某个容器下运行,服务实例数量以及提供服务的地址以及端口都是不固定的,可以理解为,.

2021-03-16 10:03:14 383

翻译 [翻译]微服务设计模式 - 4. 服务发现 - 客户端服务发现

原文地址:https://microservices.io/patterns/client-side-discovery.html服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地址和端口是固定并且提前预知的,所以只需要简单的 HTTP/REST 调用或者其他的 RPC 机制直接调用即可。但是在当下的云原生微服务体系中,微服务大多在某个虚拟机或者某个容器下运行,服务实例数量以及提供服务的地址以及端口都是不固定的,可以理解为,.

2021-03-14 20:08:27 399 1

翻译 [翻译]微服务设计模式 - 3. 按业务功能拆分模式

原文地址:https://microservices.io/patterns/decomposition/decompose-by-business-capability.html背景介绍假设你在开发一个大型复杂的微服务架构的应用,微服务架构的目标是将程序设计成一组松耦合的微服务应用,通过持续交付与部署,加速软件开发。微服务架构通过两种方式实现这一点:简化测试,并且保证组件能够独立部署。小型的(6-10个人)且自治的团队互相协作完成软件开发,每个小团队负责一个或多个微服务。但是要想享受.

2021-03-14 20:07:55 562 1

翻译 [翻译]微服务设计模式 - 2. 微服务应用模式

原文地址:https://microservices.io/patterns/microservices.html场景描述假设你正在开发一个大型服务端企业应用,有如下需求:必须支持多种客户端,包括:WEB 端浏览器、WAP 端浏览器以及原生移动 APP。对外暴露公共 API 用于调用处理 HTTP 请求,或者消息,执行对应的业务逻辑。访问数据库,缓存或者持久化响应的数据与其他系统进行通信,交换所需的信息返回 HTTP 响应,指定好特定的序列化方式,例如 JSON、 XML 等等根据业.

2021-03-13 16:01:16 491

翻译 [翻译]微服务设计模式 - 1. 单体应用模式

原文地址:https://microservices.io/patterns/monolithic.html场景描述假设你正在开发一个大型服务端企业应用,有如下需求:必须支持多种客户端,包括:WEB 端浏览器、WAP 端浏览器以及原生移动 APP。对外暴露公共 API 用于调用处理 HTTP 请求,或者消息,执行对应的业务逻辑。访问数据库,缓存或者持久化响应的数据与其他系统进行通信,交换所需的信息返回 HTTP 响应,指定好特定的序列化方式,例如 JSON、 XML 等等根据业务逻辑.

2021-03-13 16:00:38 267

原创 2021-2-28:调用 System.gc() 后究竟发生了什么?

首先,根据 DisableExplicitGC 这个 JVM 启动参数的状态,确定是否会 GC,如果需要 GC,不同 GC 会有不同的处理。1. G1 GC 的处理如果是 System.gc() 触发的 GC,G1 GC 会根据 ExplicitGCInvokesConcurrent 这个 JVM 参数决定是默认 GC (轻量 GC,YoungGC)还是 FullGC。参考代码g1CollectedHeap.cpp://是否应该并行 GC,也就是较为轻量的 GC,对于 GCCause::_java_

2021-02-28 10:31:41 12569

原创 2021-2-27:Linux 下如何优化 Java MMAP 写入

主要是调整 pdflush 相关参数。在linux操作系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上,而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页写到磁盘上,在下面几种情况下:定时方式: 定时机制定时唤醒pdflush内核线程,周期为/proc/sys/vm/dirty_writeback_centisecs ,单位是(1/100)秒,每次周期性唤醒的pdflush线程并不是回写所有的脏页,而是只回写变脏时间超过/proc/sys/vm/dirty

2021-02-27 11:22:48 13220

原创 2021-2-26:为什么需要 System.gc() ?

JVM 默认启动参数中,DisableExplicitGC 为 false,ExplicitGCInvokesConcurrent 为 false,对于大多数 GC (除了 ZGC 的其他 GC,包括 CMS,G1,Shenandoah GC 等等),都是会进行 FullGC 的,并且都是同步 GC 的,其中底层的原理会在另一篇详细分析,我们先来搞清楚为什么要留这样一个接口呢?1. 使用并管理堆外内存的框架,需要 Full GC 的机制触发堆外内存回收JVM 的内存,不止堆内存,还有其他很多块,通过

2021-02-26 10:21:45 14161

原创 JVM相关 - 深入理解 System.gc()

本文基于 Java 17-ea,但是相关设计在 Java 11 之后是大致一样的我们经常在面试中询问 System.gc() 究竟会不会立刻触发 Full GC,网上也有很多人给出了答案,但是这些答案都有些过时了。本文基于最新的 Java 的下一个即将发布的 LTS 版本 Java 17(ea)的源代码,深入解析 System.gc() 背后的故事。为什么需要System.gc()1. 使用并管理堆外内存的框架,需要 Full GC 的机制触发堆外内存回收JVM 的内存,不止堆内存,还有其他很多.

2021-02-25 21:49:25 26885

原创 2021-2-25:对于 Java MMAP,如何查看文件映射脏页,如何统计MMAP的内存大小?

我们写一个测试程序:public static void main(String[] args) throws Exception { RandomAccessFile randomAccessFile = new RandomAccessFile("./FileMmapTest.txt", "rw"); FileChannel channel = randomAccessFile.getChannel(); MappedByteBuffer []mappedByteBuffers

2021-02-25 08:19:33 10453

原创 2021-2-24:请问你知道 CPU SMP 架构么?

为了扩展单核 CPU 的性能,现在的服务器架构多采用多核 CPU 架构。一个比较经典的 CPU 架构就是对称多处理(Symmetric Multi-Processing,SMP)架构。与之相对应的就是非对称多处理(Asym-metrical Mulit-Processing)结构。这个对称是什么意思?即处理器与处理器的关系,在对称多处理架构中,处理器之间是相同等级的,所有处理器都可以访问相同的资源。与之相应的,非对称多处理架构,各处理器之间形成简单的主从设备关系,访问有限的资源。一个 SMP CPU 架

2021-02-24 08:01:34 10875

原创 2021-2-23:Java 文件映射内存是如何更新到硬盘文件的,什么情况下会丢失?

对于 Java MMAp,修改 MappedByteBuffer 就相当于修改了文件。之后操作系统根据优先搜索树的算法,通过pdflush进程刷入磁盘。就算我们的程序挂了,操作系统也会把这部分内存的脏页刷入磁盘。但是如果系统挂了,重启等,这部分数据会丢失。那我们有强制刷入磁盘的方法么?linux对应的系统调用是msync()函数(参考:http://man7.org/linux/man-pages/man2/msync.2.html)。对应的Java方法是MappedByteBuffer.force(

2021-02-23 08:37:27 11255

原创 2021-2-22:请你说下 CAP 理论并举例

CAPCAP 理论是分布式系统中的一个老生常谈的理论了,最早由 Eric Brewer 在一个讲座中提出。在这个讲座中,在传统 ACID 理论以及当时比较流行但是比较抽象的的设计指导理论 BASE 理论(当时的 BASE 理论还很抽象,直到好几年后才出现一份比较权威的被广泛接受的 BASE 理论完整解释和设计)的类比中,提出C(Consistency,一致性):在一个分布式的系统中,同一个数据的所有备份,在同一时刻是否有相同的值。也就是,对于同一个数据的读写,是否立刻对于所有副本都能看到一致的结果。一

2021-02-22 08:58:03 9723

原创 2021-2-21:Java File MMAP 中,对 MappedByteBuffer 进行读写,为何最大只能2GB-1B?

我们来看底层实现:对于所有DirectByteBuffer的读写,都用到了Unsafe类的public native void putByte(Object o, long offset, byte x);方法,底层实现是:unsafe.cpp:UNSAFE_ENTRY(void, Unsafe_SetNative##Type(JNIEnv *env, jobject unsafe, jlong addr, java_type x)) \ UnsafeWrapper("Unsafe_SetNativ

2021-02-21 09:26:21 10943

原创 2021-2-20:请你说说分布式系统 BASE 理论是什么?

BASE 理论是由 Dan Pritchett 在 ACM 上发表的一篇论文中提出的理论。是在 CAP 理论基础上提出的一种更实际的理论指导,和 PACELC 理论是有些相近的地方的。BASE 是指 基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。对于目前的互联网应用,基本上都不会是单机系统,而是多机分布式系统,所以 CAP 中的 P 是一定要的特性。剩下的 C P 根据实际场景取舍。BASE 就是一种取舍方

2021-02-20 09:01:55 9005

原创 2021-2-19:请问你知道 Java 如何高性能操作文件么?

一般高性能的涉及到存储框架,例如 RocketMQ,Kafka 这种消息队列,存储日志的时候,都是通过 Java File MMAP 实现的,那么什么是 Java File MMAP 呢?什么是 Java File MMAP尽管从JDK 1.4版本开始,Java 内存映射文件(Memory Mapped Files)就已经在java.nio包中,但它对很多程序开发者来说仍然是一个相当新的概念。引入 NIO 后,Java IO 已经相当快,而且内存映射文件提供了 Java 有可能达到的最快 IO 操作,这

2021-02-19 08:27:22 12077

原创 2021-2-18:请你说说MySQL的字符集与排序规则对开发有哪些影响?

任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集)。这些字符如何排序呢?决定字符排序的规则就是排序规则。查看内置字符集与比较规则通过show charset;命令,可以查看所有的字符集。以下仅展示了我们常用的字符集:+----------+---------------------------------+---------------------+--------+| Charset | Descrip

2021-02-18 08:21:06 9777

原创 2021-2-17:Java HashMap 的中 key 的哈希值是如何计算的,为何这么计算?

首先,我们知道 HashMap 的底层实现是开放地址法 + 链地址法的方式来实现。即数组 + 链表的实现方式,通过计算哈希值,找到数组对应的位置,如果已存在元素,就加到这个位置的链表上。在 Java 8 之后,链表过长还会转化为红黑树。这个数组并不是一开始就很大,而是随着 HashMap 里面的值变多,达到 LoadFactor 的界限之后,就会扩容。刚开始的数组很小,默认只有 16。这个数组大小一定是 2 的 n 次方,因为找到数组对应的位置需要通过取余计算,取余计算是一个很耗费性能的计算,而对

2021-02-17 08:38:32 11697

原创 2021-2-16:请问你知道分布式设计模式中的Quorum思想么?

有效个数(Quorum)有效个数(Quorum)这个设计模式一般是指分布式系统的每一次修改都要在大多数实例上通过来确定修改通过。问题背景在一个分布式存储系统中,用户请求会发到一个实例上。通常在一个实例上面执行的修改,需要复制到其他的实例上,这样可以保证在原实例挂了的情况下,用户依然可以看到这个修改。这就涉及到一个问题,究竟复制到多少个其他实例上之后,用户请求才会返回成功呢?如果复制的实例个数过多,那么请求响应时间就会更长;如果复制的实例过少,则这个修改可能会丢失。取得这个平衡性很重要,这也是分布式 P

2021-02-16 11:10:23 9153

原创 Java 对象的哈希值是每次 hashCode() 方法调用重计算么?

对于没有覆盖hashCode()方法的对象如果没有覆盖 hashCode() 方法,那么哈希值为底层 JDK C++ 源码实现,实例每次调用hashcode()方法,只有第一次计算哈希值,之后哈希值会存储在对象头的 标记字(MarkWord) 中。如果进入各种锁状态,那么会缓存在其他地方,一般是获取锁的线程里面存储,恢复无锁(即释放锁)会改回原有的哈希值。对应源码synchronizer.cpp://如果是无锁状态if (mark.is_neutral()) { hash

2021-02-15 08:14:11 9570 1

原创 请问你知道分布式系统设计模式的最低水位线思想么?

最低水位线(Low-Water Mark)最低水位线是指在 WAL(Write Ahead Log)预写日志这种设计模式中,标记在这个位置之前的日志可以被丢弃。问题背景WAL(Write Ahead Log)预写日志维护了对于存储的每次更新,随着时间不断增长,这个日志文件会变得无限大。Segmented Log 分割日志这种设计模式可以让我们每次只处理一个更小的文件,但是日志如果不清理,会无休止增长以至于硬盘被占满。解决方案最低水位线这种设计模式会告诉系统哪一部分的日志可以被删除了,即在最低水位线

2021-02-14 10:06:30 9369

原创 JVM 报 GC Overhead limit exceeded 是什么意思?

默认情况下,并不是等堆内存耗尽,才会报 OutOfMemoryError,而是如果 JVM 觉得 GC 效率不高,也会报这个错误。那么怎么评价 GC 效率不高呢?来看下源码:呢?来看下源码gcOverheadChecker.cpp:void GCOverheadChecker::check_gc_overhead_limit(GCOverheadTester* time_overhead, GCOverhe

2021-02-13 22:27:13 12333

原创 JVM ZeroTLAB 是什么意思呢?

ZeroTLAB 是 JVM 的一个布尔型 Flag,意思是是否将新创建的 TLAB 内的所有字节归零。默认:false举例:-XX:+ZeroTLAB当分配出来 TLAB 之后,根据 ZeroTLAB 配置,决定是否将每个字节赋 0。在 TLAB 申请时,由于申请 TLAB 都发生在对象分配的时候,也就是这块内存会立刻被使用,并修改赋值。操作内存,涉及到 CPU 缓存行,如果是多核环境,还会涉及到 CPU 缓存行 false sharing,为了优化,JVM 在这里做了 Allocation Pre

2021-02-12 20:32:40 9662

原创 请问你知道分布式系统设计模式的分割日志思想么?

分割日志(Segmented Log)将大文件切分为更容易处理的多个更小的文件。问题背景单一的日志文件可能会增长到很大,并且在程序启动时读取从而成为性能瓶颈。老的日志需要定时清理,但是对于一个大文件进行清理操作很费劲。解决方案将单一日志切分为多个,日志在达到一定大小时,会切换到新文件继续写。//写入日志public Long writeEntry(WALEntry entry) { //判断是否需要另起新文件 maybeRoll(); //写入文件 return

2021-02-11 08:24:08 10145

原创 请问什么时候对象分配会不在 TLAB 内分配

Java 对象分配流程我们这里不考虑栈上分配,这些会在 JIT 的章节详细分析,我们这里考虑的是无法栈上分配需要共享的对象。对于 HotSpot JVM 实现,所有的 GC 算法的实现都是一种对于堆内存的管理,也就是都实现了一种堆的抽象,它们都实现了接口 CollectedHeap。当分配一个对象堆内存空间时,在 CollectedHeap 上首先都会检查是否启用了 TLAB,如果启用了,则会尝试 TLAB 分配;如果当前线程的 TLAB 大小足够,那么从线程当前的 TLAB 中分配;如果不够,但是

2021-02-10 08:45:41 10859

原创 请问你知道分布式系统的预写日志设计模式么?

Write-Ahead log 预写日志预写日志(WAL,Write-Ahead Log)将每次状态更新抽象为一个命令并追加写入一个日志中,这个日志只追加写入,也就是顺序写入,所以 IO 会很快。相比于更新存储的数据结构并且更新落盘这个随机 IO 操作,写入速度更快了,并且也提供了一定的持久性,也就是数据不会丢失,可以根据这个日志恢复数据。背景介绍如果遇到了服务器存储数据失败,例如已经确认客户端的请求,但是存储过程中,重启进程导致真正存储的数据没有落盘,在重启后,也需要保证已经答应客户端的请求数据更新

2021-02-09 08:53:55 11263

原创 为何现在响应式编程在业务开发微服务开发不普及

为何现在响应式编程在业务开发微服务开发不普及主要因为数据库 IO,不是 NIO。不论是Java自带的Future框架,还是 Spring WebFlux,还是 Vert.x,他们都是一种非阻塞的基于Ractor模型的框架(后两个框架都是利用netty实现)。在阻塞编程模式里,任何一个请求,都需要一个线程去处理,如果io阻塞了,那么这个线程也会阻塞在那。但是在非阻塞编程里面,基于响应式的编程,线程不会被阻塞,还可以处理其他请求。举一个简单例子:假设只有一个线程池,请求来的时候,线程池处理,需要读取数据库

2021-02-08 03:17:31 12318 1

空空如也

空空如也

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

TA关注的人

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