-
Kafka-partitions/replicas分配策略
为了更好的做负载均衡,Kafka尽量将所有的Partition均匀分配到整个集群上。Kafka分配Replica的算法如下: 将所有存活的N个Brokers和待分配的Partition排序 将第i个Partition分配到第(i mod n)个Broker上,这个Partition的第一个Replica存在于这个分配的Broker上,并且会作为partition的优先副本 将第i个Partition的第j个Replica分配到第((i + j) mod...…
-
Kafka-文件存储机制
Kafka 中消息是以 topic 进行分类的,生产者通过 topic 向 Kafka broker 发送消息,消费者通过 topic 读取数据。topic 在物理层面又能以 partition 为分组,一个 topic 可以分成若干个 partition,partition 还可以细分为 segment,一个 partition 物理上由多个 segment 组成topic中partition存储分布假设只有一个 Kafka 集群,且这个集群只有一个 Kafka broker。在这个 K...…
-
Kafka-数据可靠性和一致性
Partition Recovery机制每个Partition会在磁盘记录一个RecoveryPoint, 记录已经flush到磁盘的最大offset。当broker fail 重启时,会进行loadLogs。 首先会读取该Partition的RecoveryPoint,找到包含RecoveryPoint的segment及以后的segment, 这些segment就是可能没有 完全flush到磁盘segments。然后调用segment的recover,重新读取各个segment的msg,...…
-
Kafka学习整理
1、Kafka都有哪些特点 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。 可扩展性:kafka集群支持热扩展,每个主题(topic) 包含多个分区(partition),主题中的分区可以分布在不同的主机(broker)中,在运行期间可以轻松地扩展或收缩(可以添加或删除代理),而不会宕机 持久性、可靠性:消息被持久化到本地磁盘,并且支...…
-
Spring中的IoC
Spring的整体架构IoCIoc—Inversion of Control,即即控制反转,将设计好的对象交给容器控制,而不是像传统的那样在对象中直接new一个关键在于谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了 谁控制谁:传统Java SE程序设计,直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由IoC容器来控制对象的创建;是IoC 容器控制了对象 控制什么:主要控制了外部资源获...…
-
ThreadLocal内存泄漏问题
实现原理实线代表强引用,虚线代表弱引用,Java中的引用每个Thread维护一个ThreadLocalMap映射表,这个映射表的key是ThreadLocal实例本身,value是真正需要存储的Object。内部是一个Entry数组,Entry继承自WeakReference,Entry内部的value用来存放Object比如:ThreadLocal<User> userThreadLocal = new ThreadLocal<>();userThreadLoca...…
-
Java中的引用
在JDK 1.2以前,Java中的引用的定义:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用,一个对象在这种定义下只有被引用或者没有被引用两种状态但无法描述这样的对象:当内存空间还足够时,则能保留在内存之中;如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象在JDK 1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Re...…
-
可重入锁
指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。ReentrantLock和synchronized都是可重入锁,可重入锁的最大作用就是避免死锁简单锁public class Counter{ private Lock lock = new Lock(); private int count = 0; public int inc(){ lock.lock(); ...…
-
Java中的线程安全和锁优化
当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的线程安全实现方法互斥同步互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保障手段。同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)线程使用。互斥是实现同步的一种手段,临界区(Cr...…
-
Java内存模型
硬件的效率与一致性大多数的运算任务都不可能只靠处理器“计算”就能完成,处理器要与内存交互,如读取运算数据、存储运算结果等,这个I/O操作很难消除(无法仅靠寄存器来完成所有运算任务),由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了处理器、高速缓存、主内存间的交...…