10 2024 档案
摘要:深入理解Kafka的Broker Kafka是一种高吞吐量的分布式发布订阅消息系统,它从设计原理方面进行了详尽的考虑,主要表现在以下几个方面。 高吞吐量,支持大量数据的事件流。 支持消息数据的可靠传送,能够处理积压的大量数据 支持低延迟的消息传递。 支持系统的自动容错。 通过 Topic的分区,支持
阅读全文
摘要:Kafka的消费者 Kafka采用消费者组的方式来消费消息,一个消费者组中可以包含多个消费者。消费者对象订阅主题并接收Kafka的消息,然后验证消息并保存结果。尽管一个消费者组中可以包含多个消费者,但是它们订阅的都是同一个主题的消息。 1. 消费模式 当生产者将消息发送到Kafka集群后,会转发给消
阅读全文
摘要:Kafka的生产者 1. 生产者的执行流程 生产者客户端由两个线程协调运行,这两个线程分别为主线程和Sender线程(发送线程),其中, 在主线程中由KafkaProducer创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息累加器(RecordAccumulator,也称消息收集
阅读全文
摘要:重入锁ReentrantLock 重人锁ReentrantLock,顾名思义,就是支持重进人的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。 ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进人,但是在调lock
阅读全文
摘要:package com.strind.jucdemo; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concu
阅读全文
摘要:Java中的锁 1. 顶级接口Lock Java SE5之后并发包中新增了Lock接口,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchro
阅读全文
摘要:流量治理 在服务发现、网关路由等支持下,踏出了服务化的第一步以后,很可能仍会经历一段阵痛期,随着拆分出的服务越来越多,随之而来会面临以下两个问题的困扰: 由于某一个服务的崩溃,导致所有用到这个服务的其他服务都无法正常工作,一个点的错误经过层层传递,最终波及到调用链上与此有关的所有服务,这便是雪崩效应
阅读全文
摘要:微服务起步 采用服务来构建程序,获得的收益是软件系统“整体”与“部分”在物理层面的真正隔离,这对构筑可靠的大型软件系统来说无比珍贵,但另一面,微服务架构在复杂性与执行性能方面做出了极大的让步。在一套由多个微服务相互调用才能正常运作的分布式系统中,每个节点都互相扮演着服务的生产者与消费者的多重角色,形
阅读全文
摘要:事务处理几乎在每一个信息系统中都会涉及,它存在的意义是为了保证系统中所有的数据都是符合期望的,且相互关联的数据之间不会产生矛盾,即数据状态的一致性。按照数据库的经典理论,要达成这个目标,需要三方面共同努力来保障。 原子性(Atomic):在同一项业务处理过程中,事务保证了对多个数据的修改,要么同时成
阅读全文
摘要:线程安全与锁优化 1. 线程安全 什么是线程安全: 《 Java 并发编程实战(Java Concurrency In Practice)》的作者 Brian Goetz为“线程安全”做出了一个比较恰当的定义:“当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需
阅读全文
摘要:Java与线程 1. 线程的实现 线程是比进程更轻量级的调度执行单位,线程的引人,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件IO等),又可以独立调度。目前线程是Java里面进行处理器资源调度的最基本单位。 主流的操作系统都提供了线程实现,Java语言则提供了在
阅读全文
摘要:1. 硬件的效率与一致性 物理机遇到的并发问题与虚拟机中的情况有很多相似之处,物理机对并发的处理方案对虚拟机的实现也有相当大的参考意义。 “让计算机并发执行若干个运算任务”与“更充分地利用计算机处理器的效能”之间的因果关系,看起来理所当然,实际上它们之间的关系并没有想象中那么简单,其中一个重要的复杂
阅读全文
摘要:书接上回。。 3. 类加载器 Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(ClassLoader)。 3.1 类与类加载器 类加载器
阅读全文
摘要:1. 类加载时机 一个类型(接口/类)从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将历加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺
阅读全文
摘要:1. 运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,创建和以及销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有的区域则是依赖用户线程的启动结束而建立和销毁。 1.1 程序计数器(线程私有) 程序计数器(Program
阅读全文