Kafka -- 单节点安装与配置(Mac)
安装步骤Kafka与ZookeeperKafka使用Zookeeper保存集群的元数据信息和消费者信息 安装Zookeeper和Kafka12345678910111213$ brew install kafka==> Installing dependencies for kafka: zookeeper==> Caveats==> zookeeperTo have launchd start zookeeper now and restart at login: brew services start zookeeperOr, if you don't want/need a background service you can just run: zkServer start==> kafkaTo have launchd start kafka now and restart at login: brew services start kafkaOr, if you don't want/need a background service...
Kafka -- 简介
相关概念 Kafka一般被称为分布式提交日志或者分布式流平台 文件系统或数据库提交日志用来提供所有事务的持久记录,通过重放这些日志可以重建系统的状态 Kafka的数据是按照一定顺序持久化保存的,可以按需读取 Kafka的数据分布在整个系统里,具备数据故障保护和性能伸缩的能力 消息和批次 Kafka的数据单元被称为消息 消息由字节数组组成,消息里的数据没有特别的格式或者含义 消息可以有一个可选的元数据,就是键,键也是一个字节数组,同样没有特殊含义 消息以一种可控的方式写入不同的分区时,会用到键 例如为键生成一个一致性散列值,然后使用散列值对主题分区数进行取模 为消息选取分区,从而保证具有相同键的消息总是被写入到相同的分区 为了提高效率,消息被分批写入Kafka,批次就是一组消息,这些消息属于同一个主题和分区 如果每个消息都单独穿行于网络,会导致大量的网络开销,把消息分成批次传输可以减少网络开销 不过,这需要在时间延迟和吞吐量之间做出权衡 批次越大,单位时间内处理的消息就会越多,耽搁消息的传输时间就会越长 批次数据会被压缩,这样可以提升数据的传输和存储能力,但要做更多的计算...
Zookeeper -- 分布式锁InterProcessMutex
Curator是ZooKeeper的一个客户端框架,其中封装了分布式互斥锁的实现,最为常用的是InterProcessMutex,本文将对其进行代码剖析 简介InterProcessMutex基于Zookeeper实现了_**分布式的公平可重入互斥锁**_,类似于单个JVM进程内的ReentrantLock(fair=true) 构造函数1234567891011121314151617// 最常用public InterProcessMutex(CuratorFramework client, String path){ // Zookeeper利用path创建临时顺序节点,实现公平锁的核心 this(client, path, new StandardLockInternalsDriver());}public InterProcessMutex(CuratorFramework client, String path, LockInternalsDriver driver){ // maxLeases=1,表示可以获得分布式锁的线程数量(跨J...
Zookeeper -- ZAB协议
本文将简要介绍Zookeeper的ZAB协议 基本概念ZAB VS Base-Paxos Base-Paxos是**通用的分布式一致性算法** ZAB协议不是Base-Paxos的典型实现,而是特别为Zookeeper设计的一种**支持崩溃恢复的原子广播协议** 相对于ZAB协议,Base-Paxos主要存在2个问题:**活锁问题+全序问题** 活锁问题是指在Base-Paxos算法中,由于并不存在Leader角色,**新轮次可以不断抢占旧轮次**,如此循环往复,产生活锁 全序问题是指如果消息a在消息b之前发送,则所有Server应该看到相同的结果,但Base-Paxos并不保证这一点 ZAB的解决方案 为了解决活锁问题,ZAB协议引入了Leader角色,所有的事务请求只能由Leader处理,但是单Leader会存在单点问题,ZAB协议进而引入崩溃恢复模式 为了解决全序问题,ZAB协议引入了ZXID(全局单调递增的唯一ID)和利用TCP的FIFO特性 服务器角色Zookeeper中服务器有三种角色:**Leader、Follower和Observer**,其中Observer与ZAB协...
Java 8 -- Optional
本文主要介绍Java 8的 Optional 的简单使用 Address1234567@Data@AllArgsConstructor@NoArgsConstructorpublic class Address { private String province; private String city;} of + ofNullable相关代码托管在java8_demo 123456789101112131415161718@Test(expected = NoSuchElementException.class)public void emptyTest() { // 声明一个空的Optional对象 Optional<Address> nameOptional = Optional.empty(); // java.util.NoSuchElementException: No value present nameOptional.get();}@Test(expected = NullPointerExcep...
Java 8 -- Default Method
本文主要介绍Java 8的 default 方法的简单使用 简介 default方法作为接口的一部分由实现类继承 default方法的目标用户是类库设计者 以兼容的方式解决类库的演进问题 冲突解决一个类可以实现多个拥有默认方法的接口,从而实现行为的多继承,按照下列步骤解决冲突 类或父类中声明的方法的优先级高于任何声明为默认方法的优先级 子接口的default方法优先级高于父接口的default方法 显式选择使用哪一个default方法 类与接口定义相关代码托管在java8_demo 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647interface A { default String hello() { return "Hello From A"; }}interface B extends A { @Override default String he...
Java 8 -- Stream
本文主要介绍Java 8的 Stream的简单使用 简介流与集合的区别计算的时机 是否全部载入内存 能否添加或删除元素 类似于 集合 是 能 DVD 流 否,按需计算 不能 网络流媒体 消费一次流只能遍历一次,遍历后即被消费,类似于网络流相关代码托管在java8_demo 12345List<String> strs = Arrays.asList("zhong", "ming", "mao");Stream<String> stream = strs.stream();stream.forEach(s -> System.out.println(s)); // Lambda// throw java.lang.IllegalStateException: stream has already been operated upon or closedstream.forEach(System.out::println); // 方法引用,相关内容请参照「Java8回忆录 - Lambda...
Java 8 -- Lambda
本文主要介绍Java 8的 Lambda 表达式的简单使用 基本语法12(parameters) -> expression(parameters) -> {statements;} Apple相关代码托管在java8_demo 123456789@Data@AllArgsConstructor@NoArgsConstructorpublic class Apple { public static enum COLOR { GREEN, RED } public static final int HEAVY_WEIGHT = 200; private COLOR color; private Integer weight;} 实例12345678910111213141516171819202122232425(String s) -> s.length()// 等价于int f(String s){ return s.length(); }(Apple a) -> ...
Java 8 -- 行为参数化
本文主要介绍行为参数化 基础概念 行为参数化:将方法或代码作为参数或值进行传递 谓词:一个返回 boolean 值的函数,在 Java8 中是一个函数式接口(java.util.function.Predicate) 代码实例目录结构如下,相关代码托管在java8_demo 12345678910111213141516171819202122├── main│ └── java│ └── me│ └── zhongmingmao│ ├── domain│ │ └── Apple.java│ ├── filter│ │ ├── FilterJava7.java│ │ └── FilterJava8.java│ └── predicate│ ├── java7│ │ ├── ColorPredicate.ja...
InnoDB -- 事务隔离级别
本文主要介绍InnoDB的事务隔离级别关于Next-Key Lock的内容,请参照「InnoDB备忘录 - Next-Key Lock」,这里不再赘述 脏读、不可重复读、幻读脏读在不同的事务下,当前事务可以读到其它事务中尚未提交的数据,即可以读到脏数据 不可重复读在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,不可重复读的重点是修改(Update) 幻读在同一事务中,同一查询多次进行,由于包含插入或删除操作的其他事务提交,导致每次返回不同的结果集,幻读的重点在于插入(Insert)或者删除(Delete) 两类读操作一致性非锁定读 InnoDB通过行多版本控制的方式来读取当前执行时间数据中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这时读操作不会等待行上锁的释放,而是读取行的一个快照数据 非锁定读机制极大地提高了数据库的并发性,这是InnoDB默认的读取方式 READ COMMITED和REPEATABLE READ支持一致性非锁定读:在READ COMMITED下,总是读取被锁定行的最新的快照数据,在REPEATABLE...














