Ink's Blog

Less is more

最熟悉的陌生人:Java 的 wait、notify/notifyAll、join、sleep、interrupt、yield 方法

对于 Javaer 来说,wait、notify、sleep 等方法应该是最熟悉不过了,但是你真的知道它们的区别和内在原理吗,你知道如何正确使用它们吗,今天来做一个总结。 首先明确一点,以上这些方法,有的是 Object 类下面的方法,有的是 Thread 类下面的方法,但是它们起作用的都是线程,而非某个对象。就是为了让线程之间可以更好地协作,协作使用锁或者 CPU 这些共享资源。 wa......

闲聊 Kafka Producer 的设计

最近在看 Kafka Producer 的源码,直接讲解源码比较枯燥,本文将结合我们实际生活中的例子初步了解下 Kafka Producer 的设计思路。 Kafka Producer 怎么用?Kafka Producer 的用法是很简单的,指定一个 brokerlist 地址,指定一个 topic,然后往这个 topic 发数据就可以了。 123456789101112131415Pr......

Flink 集群的组成

本文介绍了 Flink 架构,描述了其主要组件如何交互以执行应用程序和从故障中恢复。 Flink 采用的是分布式系统中标准的 master-slave 架构,运行时包含两个主要组件:一个 JobManager 和一个或多个 TaskManager。当 Flink 集群启动后,首先会启动一个 JobManager 和一个或多个 TaskManager。由 Client 提交任务给 JobM......

Flink 学习大纲

随着阿里的强势入主,Flink 目前已经成为了国内事实上的标准流式处理框架,本文将对其做一个基本的介绍,作为后续深入学习的大纲。本文主要回答以下三个问题: Flink 到底是什么?解决了什么问题? Flink 包含哪些基本内容? Flink 学习资源推荐 Flink 是什么?官方文档里说,Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。 首先 F......

Flink CDC 介绍

flink-cdc 提供了基于 flink 的 cdc 方案,今天做一个简单介绍。 术语解释CDC:Change data capture DML:data manipulation language,对数据进行增删改的一些操作 DDL:data definition language,数据库定义 BINLOG:binary log,mysql二进制日志文件,顺序写顺序读,性能高,mys......

「Notes」Java 并发编程实战

2020.11.29 开始读,每天读一章,先读一周试试水。 非原子的64位操作Java 内存模型要求,变量的读取和写入操作都必须是原子操作,但对于非 volatile 类型的 long 和 double 变量,JVM 允许将 64 位的读操作或写操作分解为两个 32 位的操作。 volatile 作用 编译器和运行时不再重排序 不会被缓存到寄存器或者对其他处理器不可见的地方 不要在构造......

系统炸了怎么办?

线上出问题的时候,排查速度是放在第一位的,工欲善其事必先利其器,今天就来总结一下排查常用的工具和命令。 当遇到突发问题时,在我看来,正确的解决步骤应当按照下面几步进行: 评估影响 止损恢复 排查恢复 case study 评估影响某天突然来了告警,线上出问题,怎么办?先不要慌,千万不要一上来就想找到原因,因为你不一定能马上找到问题,当然如果问题特别简单或者你很快就找到了解决方案(5分......

如何实现多个 Kafka 集群的高可用

基于熔断机制切换主备 Kafka 集群

熔断机制是网关中经常用到的一种策略,那么它和 Kafka 组合在一起会产生什么化学反应呢,让我们一起来瞧一瞧。 多 Kafka 集群的高可用到底指什么?打开 Kafka 的官网,它首先告诉你 Kafka 能做啥,其中就有高可用。 Kafka 的高可用,通俗理解就是一个 Kafka 集群不会完全挂掉,总是会有那么几个 broker 是可以工作的,在数据量比较小的时候一般 Kafka 自身......

为什么需要 Netty?

Netty 是一个高性能网络应用框架,应用很普遍,在 Java 领域 Netty 基本上是网络编程的标配了,所以很有必要深入学习一下。 首先思考:如何实现一个网络应用?了解一个东西之前,首先要考虑为什么需要这样一个东西。那么为什么我们需要 Netty 呢? 现在互联网上的绝大多数应用都是网络应用程序,大多数都是标准的 CS 架构,需要进行频繁的网络通信,在真正介绍 Netty 之前,先让......

LongAdder 源码阅读

上一篇讲解了原子类 AtomicInteger 的源码,它可以看作是一个线程安全的计数器,但是如果在高并发情况下 AtomicInteger 的性能就捉襟见肘了,因为在高并发情况下多个线程同时进行 CAS 操作会频繁地失败重试,CPU 损耗很高,这个时候我们就可以使用性能更加高的 LongAdder 来实现计数功能,本文将会深入解析为什么 LongAdder 的性能比 AtomicInte......